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)
11094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#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? */
97894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    char *filename;
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err;
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nberrors;
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaTypePtr type; */
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr regexp;
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr value;
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int valueWS;
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int options;
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr validationRoot;
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr pctxt;
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int xsiAssemble;
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth;
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeElemInfos;
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode; /* the current element information */
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbIdcNodes;
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeIdcNodes;
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbIdcKeys;
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeIdcKeys;
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlTextReaderPtr reader;
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr *attrInfos;
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrInfos;
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeAttrInfos;
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int skipDepth;
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr nodeQNames;
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasKeyrefs;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int createIDCNodeTables;
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int psviExposeIDCNodeTables;
103294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
103394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /* Locator for error reporting in streaming mode */
103494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlSchemaValidityLocatorFunc locFunc;
103594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    void *locCtxt;
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSubstGroup:
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSubstGroup {
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr head;
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr members;
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
105194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
105294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Some predeclarations				*
105394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlSchemaPtr schema,
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlNodePtr node);
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlSchemaPtr schema,
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlNodePtr node);
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixup(xmlSchemaTypePtr type,
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlSchemaAbstractCtxtPtr ctxt);
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetTypeToString(xmlSchemaTypeType type);
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlNodePtr node);
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlSchemaParserCtxtPtr ctxt);
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWhitespaceValueType
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type);
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node, xmlSchemaTypeType type,
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int withParticle);
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item);
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypeLinkPtr
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type);
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message);
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int subset);
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt);
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComponentListFree(xmlSchemaItemListPtr list);
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node);
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
110694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Helper functions			        *
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaItemTypeToStr:
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of the schema item
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the component name of a schema item.
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemTypeToStr(xmlSchemaTypeType type)
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "simple type definition");
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "simple type definition");
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "complex type definition");
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "element declaration");
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute use");
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute declaration");
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group definition");
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute group definition");
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "notation declaration");
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (sequence)");
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (choice)");
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (all)");
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "particle");
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "unique identity-constraint");
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (unique)"); */
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "key identity-constraint");
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (key)"); */
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "keyref identity-constraint");
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (keyref)"); */
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "wildcard (any)");
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "[helper component] QName reference");
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "[helper component] attribute use prohibition");
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "Not a schema component");
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetComponentTypeStr:
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of the schema item
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the component name of a schema item.
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item)
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(WXS_TYPE_CAST item))
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(BAD_CAST "complex type definition");
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
118060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(BAD_CAST "simple type definition");
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlSchemaItemTypeToStr(item->type));
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetComponentNode:
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a schema component
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns node associated with the schema component.
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that such a node need not be available; plus, a component's
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node need not to reflect the component directly, since there is no
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * one-to-one relationship between the XML Schema representation and
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the component representation.
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item)
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->node);
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->node);
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->node);
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaWildcardPtr) item)->node);
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaParticlePtr) item)->node);
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupPtr) item)->node);
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->node);
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->node);
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->node);
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((xmlSchemaQNameRefPtr) item)->node);
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: What to do with NOTATIONs?
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->node);
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeUsePtr) item)->node);
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetNextComponent:
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a schema component
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next sibling of the schema component.
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item)
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next);
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next);
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next);
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next);
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next);
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next);
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatQName:
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespaceName:  the namespace name
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @localName: the local name
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the given QName in the format "{namespaceName}localName" or
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just "localName" if @namespaceName is NULL.
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the localName if @namespaceName is NULL, a formatted
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string otherwise.
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatQName(xmlChar **buf,
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *namespaceName,
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *localName)
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(*buf)
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespaceName != NULL) {
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrdup(BAD_CAST "{");
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, namespaceName);
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "}");
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (localName != NULL) {
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaceName == NULL)
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(localName);
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, localName);
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "(NULL)");
130860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((const xmlChar *) *buf);
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
131260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic const xmlChar*
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName)
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL)
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(buf, ns->href, localName));
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(buf, NULL, localName));
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentName(xmlSchemaBasicItemPtr item)
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->name);
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->name);
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->name);
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->name);
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->name);
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->name);
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_DECL(item) != NULL) {
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaGetComponentName(
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaQNameRefPtr) item)->name);
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->name);
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Other components cannot have names.
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetQNameRefName(void *ref)
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((xmlSchemaQNameRefPtr) ref)->name);
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetQNameRefTargetNs(void *ref)
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((xmlSchemaQNameRefPtr) ref)->targetNamespace);
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item)
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->targetNamespace);
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->targetNamespace);
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace);
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "http://www.w3.org/2001/XMLSchema");
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->targetNamespace);
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace);
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->targetNamespace);
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_DECL(item) != NULL) {
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaGetComponentTargetNs(
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Will returning NULL break something? */
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaQNameRefPtr) item)->targetNamespace);
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->targetNamespace);
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Other components cannot have names.
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentQName(xmlChar **buf,
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   void *item)
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaFormatQName(buf,
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item),
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item)));
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentDesignation(xmlChar **buf, void *item)
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item));
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST " '");
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str,
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaBasicItemPtr) item));
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST "'");
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str);
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(*buf);
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc)
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaGetComponentDesignation(buf, idc));
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaWildcardPCToString:
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pc: the type of processContents
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a string representation of the type of
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processContents.
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaWildcardPCToString(int pc)
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (pc) {
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_SKIP:
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "skip");
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_LAX:
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "lax");
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_STRICT:
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "strict");
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "invalid process contents");
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCanonValueWhtspExt:
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precomputed value
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @retValue: the returned value
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get a the cononical representation of the value.
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free the returned retValue.
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value could be built and -1 in case of
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         API errors or if the value type is not supported yet.
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val,
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType ws,
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlChar **retValue)
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int list;
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValType valType;
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value, *value2 = NULL;
148860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retValue == NULL) || (val == NULL))
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = xmlSchemaValueGetNext(val) ? 1 : 0;
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *retValue = NULL;
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
149560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	value = NULL;
149660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	valType = xmlSchemaGetValType(val);
149760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	switch (valType) {
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_STRING:
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NORMSTRING:
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYSIMPLETYPE:
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = xmlSchemaValueGetAsString(val);
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value != NULL) {
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value2 = xmlSchemaCollapseString(value);
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value2 = xmlSchemaWhiteSpaceReplace(value);
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (value2 != NULL)
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = value2;
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
151060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaGetCanonValue(val, &value2) == -1) {
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (value2 != NULL)
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree((xmlChar *) value2);
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = value2;
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*retValue == NULL)
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value == NULL) {
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! list)
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = xmlStrdup(BAD_CAST "");
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlStrdup(value);
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (value != NULL) {
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* List. */
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " ");
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = xmlStrcat((xmlChar *) *retValue, value);
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(value2)
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaValueGetNext(val);
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (val != NULL);
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*retValue != NULL)
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *) (*retValue));
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value2 != NULL)
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *) value2);
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatItemForReport:
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the item
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemName: the name of the item
154860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @item: the item as an object
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemNode: the node of the item
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the local name
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parsing: if the function is used during the parse
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a representation of the given item used
155460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * for error reports.
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
155660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * The following order is used to build the resulting
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * designation if the arguments are not NULL:
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1a. If itemDes not NULL -> itemDes
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1b. If (itemDes not NULL) and (itemName not NULL)
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     -> itemDes + itemName
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2. If the preceding was NULL and (item not NULL) -> item
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode
156360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the itemNode is an attribute node, the name of the attribute
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be appended to the result.
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the formatted string and sets @buf to the resulting value.
156860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
156960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlChar*
157060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaFormatItemForReport(xmlChar **buf,
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *itemDes,
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBasicItemPtr item,
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr itemNode)
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int named = 1;
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*buf != NULL) {
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(*buf);
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = NULL;
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
158260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (itemDes != NULL) {
158460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*buf = xmlStrdup(itemDes);
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (item != NULL) {
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC: {
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "atomic type 'xs:");
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "list type 'xs:");
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "union type 'xs:");
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "simple type 'xs:");
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, type->name);
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE: {
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST"");
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "local ");
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "atomic type");
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "list type");
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "union type");
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "simple type");
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, type->name);
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX: {
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL)
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "");
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "local ");
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "complex type");
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, type->name);
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributeUsePtr ause;
164260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ause = WXS_ATTR_USE_CAST item;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "attribute use ");
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_ATTRUSE_DECL(ause) != NULL) {
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "'");
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf,
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause)));
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*buf = xmlStrcat(*buf, BAD_CAST "'");
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "(unknown)");
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE: {
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributePtr attr;
165860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = (xmlSchemaAttributePtr) item;
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "attribute decl.");
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr->targetNamespace, attr->name));
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "'");
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentDesignation(buf, item);
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT: {
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaElementPtr elem;
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
167460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elem = (xmlSchemaElementPtr) item;
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "element decl.");
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem->targetNamespace, elem->name));
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
168460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	case XML_SCHEMA_TYPE_IDC_KEYREF:
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE)
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "unique '");
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (item->type == XML_SCHEMA_TYPE_IDC_KEY)
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "key '");
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "keyRef '");
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name);
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(xmlSchemaWildcardPCToString(
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaWildcardPtr) item)->processContents));
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST " wildcard");
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MININCLUSIVE:
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINEXCLUSIVE:
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXINCLUSIVE:
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_TOTALDIGITS:
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_FRACTIONDIGITS:
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_PATTERN:
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION:
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_WHITESPACE:
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_LENGTH:
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXLENGTH:
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINLENGTH:
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(BAD_CAST "facet '");
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type));
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP: {
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "model group def.");
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION: {
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    named = 0;
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
174060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	named = 0;
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((named == 0) && (itemNode != NULL)) {
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr elem;
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (itemNode->type == XML_ATTRIBUTE_NODE)
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elem = itemNode->parent;
174860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	else
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elem = itemNode;
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrdup(BAD_CAST "Element '");
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->ns != NULL) {
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf,
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, elem->ns->href, elem->name));
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, elem->name);
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
175860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST ", attribute '");
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (itemNode->ns != NULL) {
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		itemNode->ns->href, itemNode->name));
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, itemNode->name);
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
177160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (*buf);
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatFacetEnumSet:
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type holding the enumeration facets
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds a string consisting of all enumeration elements.
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a string of all enumeration elements.
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar **buf, xmlSchemaTypePtr type)
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWhitespaceValueType ws;
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, found = 0;
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*buf != NULL)
179460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlFree(*buf);
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = NULL;
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use the whitespace type of the base type.
180060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType);
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (facet = type->facets; facet != NULL; facet = facet->next) {
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 1;
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaGetCanonValueWhtspExt(facet->val,
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ws, &value);
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInternalErr(actxt,
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaFormatFacetEnumSet",
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "compute the canonical lexical representation");
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*buf != NULL)
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*buf);
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = NULL;
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*buf == NULL)
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "'");
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST ", '");
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST value);
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value != NULL) {
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *)value);
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = NULL;
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The enumeration facet of a type restricts the enumeration
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* facet of the ancestor type; i.e., such restricted enumerations
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* do not belong to the set of the given type. Thus we break
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* on the first found enumeration.
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found)
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC));
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((const xmlChar *) *buf);
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
184494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Error functions				        *
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErrMemory(const char *msg)
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     msg);
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPSimpleErr(const char *msg)
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     msg);
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErrMemory:
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const char *extra, xmlNodePtr node)
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL)
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL,
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     extra);
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErr:
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
188960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              const char *msg, const xmlChar * str1, const xmlChar * str2)
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->err = error;
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        channel = ctxt->error;
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->errCtxt;
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schannel = ctxt->serror;
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErr2:
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current child
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
192260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               xmlNodePtr child, int error,
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               const char *msg, const xmlChar * str1, const xmlChar * str2)
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL)
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr(ctxt, child, error, msg, str1, str2);
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr(ctxt, node, error, msg, str1, str2);
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErrExt:
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
194160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @error: the error code
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData1: extra data
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData2: extra data
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData3: extra data
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra parameter for the message display
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra parameter for the message display
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3:  extra parameter for the message display
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str4:  extra parameter for the message display
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str5:  extra parameter for the message display
195160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
195660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar * strData1, const xmlChar * strData2,
195760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar * strData3, const char *msg, const xmlChar * str1,
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar * str2, const xmlChar * str3, const xmlChar * str4,
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar * str5)
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->err = error;
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        channel = ctxt->error;
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->errCtxt;
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schannel = ctxt->serror;
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
197560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                    (const char *) strData1, (const char *) strData2,
197660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (const char *) strData3, 0, 0, msg, str1, str2,
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    str3, str4, str5);
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
198294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Allround error functions			*
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaVTypeErrMemory:
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const char *extra, xmlNodePtr node)
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = XML_SCHEMAV_INTERNAL;
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL,
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     extra);
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPSimpleInternalErr(xmlNodePtr node,
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const char *msg, const xmlChar *str)
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node,
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 msg, (const char *) str);
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ERROR_TYPE_ERROR 1
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ERROR_TYPE_WARNING 2
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaErr3:
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra data
202460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlErrorLevel errorLevel,
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int error, xmlNodePtr node, int line, const char *msg,
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str1, const xmlChar *str2,
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str3, const xmlChar *str4)
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
203660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    void *data = NULL;
203760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const char *file = NULL;
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (errorLevel != XML_ERR_WARNING) {
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->nberrors++;
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->err = error;
204560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		channel = vctxt->error;
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		channel = vctxt->warning;
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = vctxt->serror;
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    data = vctxt->errCtxt;
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Error node. If we specify a line number, then
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * do not channel any node to the error function.
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (line == 0) {
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((node == NULL) &&
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->depth >= 0) &&
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->inode != NULL)) {
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node = vctxt->inode->node;
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get filename and line if no node-tree.
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((node == NULL) &&
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt != NULL) &&
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt->input != NULL)) {
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = vctxt->parserCtxt->input->filename;
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    line = vctxt->parserCtxt->input->line;
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Override the given node's (if any) position
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and channel only the given line number.
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = NULL;
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get filename.
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (vctxt->doc != NULL)
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = (const char *) vctxt->doc->URL;
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if ((vctxt->parserCtxt != NULL) &&
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt->input != NULL))
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = vctxt->parserCtxt->input->filename;
208560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
208694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if (vctxt->locFunc != NULL) {
208794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	        if ((file == NULL) || (line == 0)) {
208894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    unsigned long l;
208994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    const char *f;
209094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    vctxt->locFunc(vctxt->locCtxt, &f, &l);
209194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    if (file == NULL)
209294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		        file = f;
209394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    if (line == 0)
209494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		        line = (int) l;
209594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		}
209694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
209794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if ((file == NULL) && (vctxt->filename != NULL))
209894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	        file = vctxt->filename;
209994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    __xmlRaiseError(schannel, channel, data, ctxt,
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, XML_FROM_SCHEMASV,
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error, errorLevel, file, line,
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str1, (const char *) str2,
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (errorLevel != XML_ERR_WARNING) {
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->nberrors++;
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->err = error;
211160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		channel = pctxt->error;
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		channel = pctxt->warning;
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = pctxt->serror;
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    data = pctxt->errCtxt;
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    __xmlRaiseError(schannel, channel, data, ctxt,
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, XML_FROM_SCHEMASP, error,
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		errorLevel, NULL, 0,
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str1, (const char *) str2,
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaErr3:
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra data
213760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
214160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaErr3(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, const xmlChar *str3)
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, str1, str2, str3, NULL);
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
215060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      int error, xmlNodePtr node, const char *msg,
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      const xmlChar *str1, const xmlChar *str2,
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      const xmlChar *str3, const xmlChar *str4)
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, str1, str2, str3, str4);
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     int error, xmlNodePtr node, const char *msg,
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     const xmlChar *str1, const xmlChar *str2)
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL);
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatNodeForError(xmlChar ** msg,
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAbstractCtxtPtr actxt,
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodePtr node)
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *msg = NULL;
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node != NULL) &&
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ELEMENT_NODE) &&
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ATTRIBUTE_NODE))
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
217960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Don't try to format other nodes than element and
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* attribute nodes.
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Play save and return an empty string.
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrdup(BAD_CAST "");
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(*msg);
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL) {
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Work on tree nodes.
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ATTRIBUTE_NODE) {
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr elem = node->parent;
219360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elem->ns != NULL)
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem->ns->href, elem->name));
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, elem->name));
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
220360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->ns != NULL)
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node->ns->href, node->name));
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node->name));
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "': ");
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Work on node infos.
221960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaNodeInfoPtr ielem =
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->elemInfos[vctxt->depth];
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsName, ielem->localName));
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
222960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName, vctxt->inode->localName));
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "': ");
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
223860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Hmm, no node while parsing?
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Return an empty string, in case NULL will break something.
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrdup(BAD_CAST "");
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * VAL TODO: The output of the given schema component is currently
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * disabled.
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) {
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST " [");
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str,
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, type, NULL, 0));
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "]");
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (*msg);
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str1,
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str2)
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt == NULL)
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "Internal error: ");
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST funcName);
227660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ", ");
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST message);
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL,
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) msg, str1, str2);
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
228460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL,
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) msg, str1, str2);
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message)
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL);
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str1,
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str2)
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message,
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, str2);
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaBasicItemPtr item,
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1, const xmlChar *str2,
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str3, const xmlChar *str4)
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) && (item != NULL) &&
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(actxt->type == XML_SCHEMA_CTXT_PARSER)) {
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = WXS_ITEM_NODE(item);
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&msg, NULL, item, NULL);
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ": ");
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatNodeForError(&msg, actxt, node);
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
233160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ".\n");
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(actxt, error, node,
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, str4);
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaBasicItemPtr item,
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2)
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCustomErr4(actxt, error, node, item,
234760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	message, str1, str2, NULL, NULL);
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2,
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str3)
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
236660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ".\n");
236760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* URGENT TODO: Set the error code to something sane. */
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0,
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, NULL);
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaPSVIIDCNodePtr idcNode,
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2)
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL, *qname = NULL;
238760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
238860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrdup(BAD_CAST "Element '%s': ");
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR,
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	error, NULL, idcNode->nodeLine, (const char *) msg,
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQName(&qname,
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
239560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    vctxt->nodeQNames->items[idcNode->nodeQNameID]),
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, str2, NULL);
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(qname);
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg);
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL)
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (node->type);
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlSchemaValidCtxtPtr) actxt)->inode != NULL))
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType);
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsGlobalItem(xmlSchemaTypePtr item)
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->flags & XML_SCHEMAS_TYPE_GLOBAL)
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((xmlSchemaElementPtr) item)->flags &
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_GLOBAL)
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((xmlSchemaAttributePtr) item)->flags &
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ATTR_GLOBAL)
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Note that attribute groups are always global. */
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlParserErrors error,
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr node,
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *value,
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type,
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int displayValue)
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_ATTRIBUTE_NODE))
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid "
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "value of ");
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! xmlSchemaIsGlobalItem(type))
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "the local ");
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "the ");
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ATOMIC(type))
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "atomic type");
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_IS_LIST(type))
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "list type");
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_IS_UNION(type))
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "union type");
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaIsGlobalItem(type)) {
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " '");
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType != 0) {
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "xs:");
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, type->name);
247860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg,
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str,
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->targetNamespace, type->name));
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'");
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_ATTRIBUTE_NODE))
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatErrorNodeQName(xmlChar ** str,
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaNodeInfoPtr ni,
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlNodePtr node)
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL) {
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->ns != NULL)
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaFormatQName(str, node->ns->href, node->name));
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaFormatQName(str, NULL, node->name));
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ni != NULL)
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(str, ni->nsName, ni->localName));
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAttrInfoPtr ni,
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node)
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL, *str = NULL;
251660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n");
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr(actxt, error, node, (const char *) msg,
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node),
252160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	NULL);
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlParserErrors error,
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlNodePtr node,
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *message,
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nbval,
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nbneg,
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar **values)
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *localName, *nsName;
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur, *end;
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
254060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".");
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that is does not make sense to report that we have a
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard here, since the wildcard might be unfolded into
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * multiple transitions.
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nbval + nbneg > 0) {
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nbval + nbneg > 1) {
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrdup(BAD_CAST " Expected is one of ( ");
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrdup(BAD_CAST " Expected is ( ");
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = NULL;
255560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < nbval + nbneg; i++) {
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = values[i];
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == NULL)
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        continue;
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') &&
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (cur[3] == ' ')) {
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur += 4;
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		str = xmlStrcat(str, BAD_CAST "##other");
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the local name.
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    localName = NULL;
256960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*end == '*') {
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		localName = xmlStrdup(BAD_CAST "*");
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*end != 0) && (*end != '|'))
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    end++;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		localName = xmlStrncat(localName, BAD_CAST cur, end - cur);
257860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
257960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (*end != 0) {
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Skip "*|*" if they come with negated expressions, since
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* they represent the same negated wildcard.
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((nbneg == 0) || (*end != '*') || (*localName != '*')) {
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Get the namespace name.
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = end;
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*end == '*') {
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrdup(BAD_CAST "{*}");
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while (*end != 0)
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    end++;
259560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (i >= nbval)
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    nsName = xmlStrdup(BAD_CAST "{##other:");
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    nsName = xmlStrdup(BAD_CAST "{");
260060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur);
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrcat(nsName, BAD_CAST "}");
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    str = xmlStrcat(str, BAD_CAST nsName);
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(nsName)
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(localName);
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
261060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrcat(str, BAD_CAST localName);
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(localName);
261360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i < nbval + nbneg -1)
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		str = xmlStrcat(str, BAD_CAST ", ");
261660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = xmlStrcat(str, BAD_CAST " ).\n");
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST str);
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      msg = xmlStrcat(msg, BAD_CAST "\n");
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlParserErrors error,
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *value,
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  unsigned long length,
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaTypePtr type,
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaFacetPtr facet,
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const char *message,
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str1,
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str2)
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType facetType;
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nodeType = xmlSchemaEvalErrorNodeType(actxt, node);
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) {
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetType = XML_SCHEMA_FACET_ENUMERATION;
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If enumerations are validated, one must not expect the
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* facet to be given.
264860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
264960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetType = facet->type;
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "[");
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "facet '");
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType));
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "'] ");
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message == NULL) {
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use a default message.
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char len[25], actLen[25];
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* FIXME, TODO: What is the max expected string length of the
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * this value?
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nodeType == XML_ATTRIBUTE_NODE)
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; ");
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; ");
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet));
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(actLen, 24, "%lu", length);
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facetType == XML_SCHEMA_FACET_LENGTH)
267760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
267860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		BAD_CAST "this differs from the allowed length of '%s'.\n");
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
268060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
268360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
268560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nodeType == XML_ATTRIBUTE_NODE)
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaErr3(actxt, error, node, (const char *) msg,
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, (const xmlChar *) actLen, (const xmlChar *) len);
268960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    else
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaErr(actxt, error, node, (const char *) msg,
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) actLen, (const xmlChar *) len);
269260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element "
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"of the set {%s}.\n");
269660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatFacetEnumSet(actxt, &str, type));
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_PATTERN) {
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted "
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"by the pattern '%s'.\n");
270160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the "
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"minimum value allowed ('%s').\n");
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the "
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maximum value allowed ('%s').\n");
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than "
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s'.\n");
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than "
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s'.\n");
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more "
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"digits than are allowed ('%s').\n");
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional "
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"digits than are allowed ('%s').\n");
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
273360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (nodeType == XML_ATTRIBUTE_NODE) {
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n");
273560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
273660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else {
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n");
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, (const xmlChar *) message);
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ".\n");
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2);
274460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VERROR(err, type, msg) \
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPMissingAttrErr:
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of  the owner
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerName: the name of the owner
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner as an element node
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the parent element node of the missing attribute node
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the corresponding type of the attribute node
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute.
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr ownerElem,
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name,
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *message)
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message != NULL)
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message);
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem, error,
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s: The attribute '%s' is required but missing.\n",
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, BAD_CAST name);
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPResCompAttrErr:
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of  the owner
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner as an element node
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute holding the QName
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @refName: the referenced local name
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @refURI: the referenced namespace URI
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: optional message
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to report QName attribute values that failed to resolve
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to schema components.
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr ownerElem,
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name,
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *refName,
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *refURI,
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaTypeType refType,
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *refTypeStr)
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *strA = NULL;
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (refTypeStr == NULL)
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType);
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, ownerElem, error,
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL,
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s.\n", BAD_CAST des, BAD_CAST name,
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&strA, refURI, refName),
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST refTypeStr, NULL);
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strA)
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomAttrErr:
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the illegal attribute node
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute during the parse.
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar **ownerDes,
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaBasicItemPtr ownerItem,
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAttrPtr attr,
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *msg)
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownerDes == NULL)
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent);
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (*ownerDes == NULL) {
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent);
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	des = *ownerDes;
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	des = *ownerDes;
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL,
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': %s.\n",
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, (const xmlChar *) "Unknown",
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const xmlChar *) msg, NULL, NULL);
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': %s.\n",
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL);
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownerDes == NULL)
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(des);
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalAttrErr:
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the attribute's owner
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the attribute's owner item
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the illegal attribute node
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute during the parse.
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED,
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAttrPtr attr)
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *strA = NULL, *strB = NULL;
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent);
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr,
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%sThe attribute '%s' is not allowed.\n", BAD_CAST strA,
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name),
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL);
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strA);
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strB);
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomErr:
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema item
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: an optional param for the error message
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: an optional param for the error message
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: an optional param for the error message
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error during parsing.
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr item,
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr itemElem,
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1,
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str2,
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str3)
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *msg = NULL;
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, item, itemElem);
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "%s: ");
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((itemElem == NULL) && (item != NULL))
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	itemElem = WXS_ITEM_NODE(item);
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL,
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, BAD_CAST des, str1, str2, str3, NULL);
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg);
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomErr:
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema item
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: the optional param for the error message
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error during parsing.
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr item,
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr itemElem,
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1)
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message,
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, NULL, NULL);
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPAttrUseErr:
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema type
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema type
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema type
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the invalid schema attribute
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: the optional param for the error message
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an attribute use error during parsing.
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node,
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr ownerItem,
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlSchemaAttributeUsePtr attruse,
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1, const xmlChar *str2,
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str3,const xmlChar *str4)
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
298960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL);
299160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ", ");
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg,
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFormatItemForReport(&str, NULL,
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST attruse, NULL));
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str);
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ": ");
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
299960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaErr4(ACTXT_CAST ctxt, error, node,
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, str4);
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalFacetAtomicErr:
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the schema type
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType: the base type of type
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the illegal facet
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal facet for atomic simple types.
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlParserErrors error,
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type,
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr baseType,
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaFacetPtr facet)
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *strT = NULL;
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node);
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL,
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The facet '%s' is not allowed on types derived from the "
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"type %s.\n",
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL),
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL);
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strT);
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalFacetListUnionErr:
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item involved
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item involved
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the illegal facet
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal facet for <list> and <union>.
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlParserErrors error,
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type,
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaFacetPtr facet)
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type,
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node);
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErr(ctxt, type->node, error,
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The facet '%s' is not allowed.\n",
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPMutualExclAttrErr:
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDes: the designation of the parent element node
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the bad attribute node
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the corresponding type of the attribute node
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute.
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAttrPtr attr,
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name1,
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name2)
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent);
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The attributes '%s' and '%s' are mutually exclusive.\n",
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL);
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPSimpleTypeErr:
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type specifier
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner
309360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ownerItem: the schema object if existent
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the validated node
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the validated value
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports a simple type validation error.
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Should this report the value of an element as well?
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
310160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED,
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node,
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type,
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *expected,
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *value,
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *message,
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *str1,
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *str2)
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
311360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node);
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message == NULL) {
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use default messages.
311860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type != NULL) {
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->type == XML_ATTRIBUTE_NODE)
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The character content is not a "
312460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		"valid value of ");
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! xmlSchemaIsGlobalItem(type))
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "the local ");
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "the ");
312960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "atomic type");
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "list type");
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "union type");
313660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaIsGlobalItem(type)) {
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST " '");
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->builtInType != 0) {
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg, BAD_CAST "xs:");
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg, type->name);
314360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg,
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    type->targetNamespace, type->name));
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "'.");
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->type == XML_ATTRIBUTE_NODE)
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid.");
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The character content is not "
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"valid.");
315660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (expected) {
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST " Expected is '");
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST expected);
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "'.\n");
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "\n");
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ATTRIBUTE_NODE)
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL);
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL);
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST message);
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ".\n");
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL,
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (const char*) msg, str1, str2, NULL, NULL, NULL);
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
317360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Cleanup. */
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPContentErr:
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @onwerDes: the designation of the holder of the content
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner item of the holder of the content
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the node of the holder of the content
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the invalid child node
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the optional error message
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the optional string describing the correct content
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error concerning the content of a schema element.
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlParserErrors error,
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBasicItemPtr ownerItem,
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr ownerElem,
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr child,
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *content)
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message != NULL)
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr2(ctxt, ownerElem, child, error,
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s: %s.\n",
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, BAD_CAST message);
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (content != NULL) {
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"%s: The content is not valid. Expected is %s.\n",
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST des, BAD_CAST content);
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"%s: The content is not valid.\n",
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST des, NULL);
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
322194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
322294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Streamable error functions                      *
322394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
323094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
323194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Validation helper functions			*
323294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
323794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
323894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Allocation functions				*
323994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewSchemaForParserCtxt:
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Schema structure.
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPtr
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr ret;
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema));
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating schema", NULL);
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchema));
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = ctxt->dict;
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictReference(ret->dict);
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewFacet:
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Facet structure.
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetPtr
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewFacet(void)
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr ret;
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet));
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaFacet));
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewAnnot:
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new annotation structure.
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr ret;
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot));
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating annotation", node);
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAnnot));
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->content = node;
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaItemListPtr
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListCreate(void)
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr ret;
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlMalloc(sizeof(xmlSchemaItemList));
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating an item list structure", NULL);
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaItemList));
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListClear(xmlSchemaItemListPtr list)
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL) {
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = NULL;
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->nbItems = 0;
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->sizeItems = 0;
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item)
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    20 * sizeof(void *));
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 20;
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->nbItems++] = item;
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListAddSize(xmlSchemaItemListPtr list,
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int initialSize,
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 void *item)
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = initialSize;
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->nbItems++] = item;
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx)
339460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    20 * sizeof(void *));
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 20;
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Just append if the index is greater/equal than the item count.
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idx >= list->nbItems) {
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[list->nbItems++] = item;
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = list->nbItems; i > idx; i--)
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i-1];
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[idx] = item;
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems++;
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* enable if ever needed */
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListInsertSize(xmlSchemaItemListPtr list,
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int initialSize,
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    void *item,
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int idx)
343460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = initialSize;
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Just append if the index is greater/equal than the item count.
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idx >= list->nbItems) {
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[list->nbItems++] = item;
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = list->nbItems; i > idx; i--)
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i-1];
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[idx] = item;
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems++;
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx)
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((list->items == NULL) || (idx >= list->nbItems)) {
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, "
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "index error.\n");
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 1) {
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Really free the list? */
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = NULL;
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems = 0;
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 0;
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->nbItems -1 == idx) {
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems--;
348960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = idx; i < list->nbItems -1; i++)
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i+1];
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems--;
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaItemListFree:
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a schema type structure
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a annotation structure
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListFree(xmlSchemaItemListPtr list)
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL)
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->globals != NULL) {
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaComponentListFree(bucket->globals);
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(bucket->globals);
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->locals != NULL) {
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaComponentListFree(bucket->locals);
352460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaItemListFree(bucket->locals);
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr prev, cur = bucket->relations;
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
352960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    prev = cur;
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! bucket->preserveDoc) && (bucket->doc != NULL)) {
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(bucket->doc);
353660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IMPBUCKET(bucket)->schema != NULL)
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema);
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(bucket);
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int type, const xmlChar *targetNamespace)
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr ret;
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr mainSchema;
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) {
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaBucketCreate",
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no main schema on constructor");
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the schema bucket. */
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_INCREDEF(type))
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = sizeof(xmlSchemaInclude);
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = sizeof(xmlSchemaImport);
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaBucketPtr) xmlMalloc(size);
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL);
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, size);
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = targetNamespace;
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->globals = xmlSchemaItemListCreate();
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->globals == NULL) {
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->locals = xmlSchemaItemListCreate();
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->locals == NULL) {
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
358160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The following will assure that only the first bucket is marked as
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema.
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For each following import buckets an xmlSchema will be created.
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * An xmlSchema will be created for every distinct targetNamespace.
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We assign the targetNamespace to the schemata here.
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_HAS_BUCKETS(pctxt)) {
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_INCREDEF(type)) {
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"first bucket but it's an include or redefine");
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
359560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->type = XML_SCHEMA_SCHEMA_MAIN;
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Point to the *main* schema. */
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->mainBucket = ret;
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_IMPBUCKET(ret)->schema = mainSchema;
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Ensure that the main schema gets a targetNamespace.
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mainSchema->targetNamespace = targetNamespace;
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
360560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (type == XML_SCHEMA_SCHEMA_MAIN) {
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"main bucket but it's not the first one");
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
361060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (type == XML_SCHEMA_SCHEMA_IMPORT) {
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create a schema for imports and assign the
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * targetNamespace.
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt);
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IMPBUCKET(ret)->schema == NULL) {
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace;
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
362260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Imports go into the "schemasImports" slot of the main *schema*.
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we create an import entry for the main schema as well; i.e.,
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* even if there's only one schema, we'll get an import.
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema->schemasImports == NULL) {
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema->schemasImports = xmlHashCreateDict(5,
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_CONSTRUCTOR(pctxt)->dict);
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (mainSchema->schemasImports == NULL) {
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (targetNamespace == NULL)
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlHashAddEntry(mainSchema->schemasImports,
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_NO_NAMESPACE, ret);
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlHashAddEntry(mainSchema->schemasImports,
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		targetNamespace, ret);
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to add the schema bucket to the hash");
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Set the @ownerImport of an include bucket. */
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_INCBUCKET(ret)->ownerImport =
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_INCBUCKET(ret)->ownerImport =
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Includes got into the "includes" slot of the *main* schema. */
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema->includes == NULL) {
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema->includes = xmlSchemaItemListCreate();
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (mainSchema->includes == NULL) {
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
366560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListAdd(mainSchema->includes, ret);
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
366960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to list of all buckets; this is used for lookup
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * during schema construction time only.
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1)
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item)
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*list == NULL) {
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*list = xmlSchemaItemListCreate();
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*list == NULL)
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAddSize(*list, initialSize, item);
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAnnot:
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a schema type structure
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a annotation structure
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot == NULL)
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot->next == NULL) {
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(annot);
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAnnotPtr prev;
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = annot;
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = annot->next;
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (annot != NULL);
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeNotation:
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema notation structure
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Notation structure.
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nota == NULL)
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(nota);
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttribute:
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  an attribute declaration
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute declaration structure.
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttribute(xmlSchemaAttributePtr attr)
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->annot != NULL)
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(attr->annot);
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->defVal != NULL)
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(attr->defVal);
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(attr);
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeUse:
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @use:  an attribute use
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute use structure.
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use == NULL)
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use->annot != NULL)
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(use->annot);
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use->defVal != NULL)
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(use->defVal);
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(use);
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeUseProhib:
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prohib:  an attribute use prohibition
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute use structure.
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohib == NULL)
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(prohib);
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeWildcardNsSet:
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * set:  a schema wildcard namespace
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a list of wildcard constraint structures.
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set)
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr next;
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (set != NULL) {
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = set->next;
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(set);
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set = next;
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeWildcard:
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wildcard:  a wildcard structure
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a wildcard structure.
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard == NULL)
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->annot != NULL)
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(wildcard->annot);
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->nsSet != NULL)
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->negNsSet != NULL)
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(wildcard->negNsSet);
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(wildcard);
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeGroup:
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema attribute group structure
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Attribute Group structure.
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr == NULL)
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->annot != NULL)
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(attrGr->annot);
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->attrUses != NULL)
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(attrGr);
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeQNameRef:
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a QName reference structure
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocatea a QName reference structure.
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item)
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeTypeLinkList:
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @alink: a type link
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a list of types.
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link)
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr next;
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = link->next;
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(link);
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = next;
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr next;
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != NULL) {
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = sto->next;
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->history != NULL)
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(sto->history);
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->xpathCtxt != NULL)
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(sto);
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = next;
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeIDC:
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idc: a identity-constraint definition
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an identity-constraint definition.
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr cur, prev;
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef == NULL)
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->annot != NULL)
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(idcDef->annot);
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Selector */
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->selector != NULL) {
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (idcDef->selector->xpathComp != NULL)
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(idcDef->selector);
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Fields */
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->fields != NULL) {
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = idcDef->fields;
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prev->xpathComp != NULL)
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFreePattern((xmlPatternPtr) prev->xpathComp);
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(idcDef);
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeElement:
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema element structure
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Element structure.
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeElement(xmlSchemaElementPtr elem)
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem == NULL)
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->annot != NULL)
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(elem->annot);
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->contModel != NULL)
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(elem->contModel);
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->defVal != NULL)
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(elem->defVal);
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(elem);
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeFacet:
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  a schema facet structure
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Facet structure.
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->val != NULL)
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(facet->val);
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->regexp != NULL)
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(facet->regexp);
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->annot != NULL)
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(facet->annot);
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(facet);
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeType:
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  a schema type structure
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Type structure.
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeType(xmlSchemaTypePtr type)
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->annot != NULL)
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(type->annot);
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facets != NULL) {
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFacetPtr facet, next;
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet = type->facets;
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (facet != NULL) {
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = facet->next;
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlSchemaFreeFacet(facet);
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            facet = next;
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses != NULL)
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses);
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->memberTypes != NULL)
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeTypeLinkList(type->memberTypes);
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet != NULL) {
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetLinkPtr next, link;
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = type->facetSet;
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = link->next;
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(link);
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = next;
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (link != NULL);
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contModel != NULL)
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(type->contModel);
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(type);
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeModelGroupDef:
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  a schema model group definition
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a schema model group definition.
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item)
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot != NULL)
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(item->annot);
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeModelGroup:
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  a schema model group
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a schema model group structure.
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item)
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot != NULL)
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(item->annot);
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComponentListFree(xmlSchemaItemListPtr list)
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((list == NULL) || (list->nbItems == 0))
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr item;
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items;
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = items[i];
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item == NULL)
403760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (item->type) {
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SIMPLE:
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_COMPLEX:
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeType((xmlSchemaTypePtr) item);
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTE:
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item);
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item);
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeUseProhib(
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaAttributeUseProhibPtr) item);
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ELEMENT:
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeElement((xmlSchemaElementPtr) item);
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_PARTICLE:
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (item->annot != NULL)
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFreeAnnot(item->annot);
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(item);
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SEQUENCE:
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_CHOICE:
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ALL:
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item);
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeGroup(
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaAttributeGroupPtr) item);
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_GROUP:
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeModelGroupDef(
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaModelGroupDefPtr) item);
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ANY:
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item);
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_KEY:
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_UNIQUE:
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_KEYREF:
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeIDC((xmlSchemaIDCPtr) item);
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_NOTATION:
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeNotation((xmlSchemaNotationPtr) item);
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_EXTRA_QNAMEREF:
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item);
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default: {
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: This should never be hit. */
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleInternalErr(NULL,
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Internal error: xmlSchemaComponentListFree, "
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"unexpected component type '%s'\n",
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) WXS_ITEM_TYPE_NAME(item));
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 }
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems = 0;
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFree:
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema structure.
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFree(xmlSchemaPtr schema)
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @volatiles is not used anymore :-/ */
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->volatiles != NULL)
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that those slots are not responsible for freeing
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schema components anymore; this will now be done by
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the schema buckets.
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->notaDecl != NULL)
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->notaDecl, NULL);
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->attrDecl != NULL)
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->attrDecl, NULL);
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->attrgrpDecl != NULL)
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->attrgrpDecl, NULL);
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->elemDecl != NULL)
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->elemDecl, NULL);
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->typeDecl != NULL)
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->typeDecl, NULL);
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->groupDecl != NULL)
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->groupDecl, NULL);
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->idcDef != NULL)
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->idcDef, NULL);
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->schemasImports != NULL)
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(schema->schemasImports,
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlHashDeallocator) xmlSchemaBucketFree);
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->includes != NULL) {
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes;
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
414460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]);
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(list);
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->annot != NULL)
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(schema->annot);
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Never free the doc here, since this will be done by the buckets. */
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(schema->dict);
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
415794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
415894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Debug functions					*
415994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaElementDump:
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the element
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output,
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar * name ATTRIBUTE_UNUSED,
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar * namespace ATTRIBUTE_UNUSED,
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar * context ATTRIBUTE_UNUSED)
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem == NULL)
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Element");
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " (global)");
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, ": '%s' ", elem->name);
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespace != NULL)
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "ns '%s'", namespace);
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) {
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  min %d ", elem->minOccurs);
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (elem->maxOccurs >= UNBOUNDED)
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "max: unbounded\n");
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (elem->maxOccurs != 1)
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "max: %d\n", elem->maxOccurs);
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "\n");
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Misc other properties.
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  props: ");
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_FIXED)
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[fixed] ");
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[default] ");
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[abstract] ");
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[nillable] ");
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "\n");
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Default/fixed value.
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->value != NULL)
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  value: '%s'\n", elem->value);
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Type.
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->namedType != NULL) {
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  type: '%s' ", elem->namedType);
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->namedTypeNs != NULL)
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ns '%s'\n", elem->namedTypeNs);
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (elem->subtypes != NULL) {
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Dump local types.
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeDump(elem->subtypes, output);
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Substitution group.
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->substGroup != NULL) {
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  substitutionGroup: '%s' ", elem->substGroup);
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->substGroupNs != NULL)
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ns '%s'\n", elem->substGroupNs);
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAnnotDump:
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a annotation
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the annotation
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot)
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *content;
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot == NULL)
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    content = xmlNodeGetContent(annot->content);
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (content != NULL) {
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  Annot: %s\n", content);
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(content);
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  Annot: empty\n");
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaContentModelDump:
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the schema particle
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the depth used for intentation
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a SchemaType structure
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth)
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr term;
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
429643ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children == NULL) {
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "MISSING particle term\n");
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    term = particle->children;
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (term == NULL) {
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "(NULL)");
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (term->type) {
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str,
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaElementPtr)term)->targetNamespace,
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaElementPtr)term)->name));
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "SEQUENCE");
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "CHOICE");
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ALL");
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ANY:
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ANY");
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "UNKNOWN\n");
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->minOccurs != 1)
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " min: %d", particle->minOccurs);
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->maxOccurs >= UNBOUNDED)
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " max: unbounded");
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (particle->maxOccurs != 1)
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " max: %d", particle->maxOccurs);
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (term &&
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->type == XML_SCHEMA_TYPE_ALL)) &&
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->children != NULL)) {
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    output, depth +1);
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->next != NULL)
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		output, depth);
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttrUsesDump:
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uses:  attribute uses list
435260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @output:  the file output
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps a list of attribute use components.
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output)
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr use;
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUseProhibPtr prohib;
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref;
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name, *tns;
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((uses == NULL) || (uses->nbItems == 0))
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
436960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    fprintf(output, "  attributes:\n");
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < uses->nbItems; i++) {
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = uses->items[i];
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [prohibition] ");
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prohib = (xmlSchemaAttributeUseProhibPtr) use;
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = prohib->name;
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = prohib->targetNamespace;
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [reference] ");
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref = (xmlSchemaQNameRefPtr) use;
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = ref->name;
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = ref->targetNamespace;
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [use] ");
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = WXS_ATTRUSE_DECL_NAME(use);
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = WXS_ATTRUSE_DECL_TNS(use);
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "'%s'\n",
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) xmlSchemaFormatQName(&str, tns, name));
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeDump:
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  a type structure
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a SchemaType structure
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output)
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL) {
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Type: NULL\n");
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Type: ");
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->name != NULL)
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "'%s' ", type->name);
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "(no name) ");
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->targetNamespace != NULL)
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "ns '%s' ", type->targetNamespace);
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->type) {
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_BASIC:
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[basic] ");
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SIMPLE:
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[simple] ");
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_COMPLEX:
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[complex] ");
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SEQUENCE:
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[sequence] ");
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_CHOICE:
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[choice] ");
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_ALL:
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[all] ");
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_UR:
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[ur] ");
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_RESTRICTION:
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[restriction] ");
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_EXTENSION:
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[extension] ");
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[unknown type %d] ", type->type);
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "content: ");
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->contentType) {
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_UNKNOWN:
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[unknown] ");
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_EMPTY:
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[empty] ");
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ELEMENTS:
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[element] ");
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_MIXED:
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[mixed] ");
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* not used. */
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_BASIC:
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[basic] ");
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_SIMPLE:
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[simple] ");
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ANY:
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[any] ");
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->base != NULL) {
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  base type: '%s'", type->base);
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseNs != NULL)
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " ns '%s'\n", type->baseNs);
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses != NULL)
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrUsesDump(type->attrUses, output);
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->annot != NULL)
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaAnnotDump(output, type->annot);
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DUMP_CONTENT_MODEL
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->type == XML_SCHEMA_TYPE_COMPLEX) &&
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->subtypes != NULL)) {
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes,
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    output, 1);
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDump:
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a Schema structure.
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDump(FILE * output, xmlSchemaPtr schema)
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Schemas: NULL\n");
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Schemas: ");
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->name != NULL)
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s, ", schema->name);
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no name, ");
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->targetNamespace != NULL)
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s", (const char *) schema->targetNamespace);
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no target namespace");
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->annot != NULL)
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaAnnotDump(output, schema->annot);
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump,
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                output);
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScanFull(schema->elemDecl,
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlHashScannerFull) xmlSchemaElementDump, output);
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC_NODE_TABLE
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDebugDumpIDCTable:
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Displays the current IDC table for debug purposes.
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDebugDumpIDCTable(FILE * output,
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *namespaceName,
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *localName,
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaPSVIIDCBindingPtr bind)
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr tab;
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr key;
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, res;
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "IDC: TABLES on '%s'\n",
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQName(&str, namespaceName, localName));
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind == NULL)
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "IDC:   BINDING '%s' (%d)\n",
455560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaGetComponentQName(&str,
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind->definition), bind->nbNodes);
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < bind->nbNodes; i++) {
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tab = bind->nodeTable[i];
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "         ( ");
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < bind->definition->nbFields; j++) {
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		key = tab->keys[j];
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((key != NULL) && (key->val != NULL)) {
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    res = xmlSchemaGetCanonValue(key->val, &value);
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res >= 0)
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(output, "'%s' ", value);
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(output, "CANON-VALUE-FAILED ");
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res == 0)
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(value)
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (key != NULL)
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(no val), ");
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(key missing), ");
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, ")\n");
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->dupls && bind->dupls->nbItems) {
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "IDC:     dupls (%d):\n", bind->dupls->nbItems);
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < bind->dupls->nbItems; i++) {
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tab = bind->dupls->items[i];
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "         ( ");
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 0; j < bind->definition->nbFields; j++) {
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key = tab->keys[j];
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((key != NULL) && (key->val != NULL)) {
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			res = xmlSchemaGetCanonValue(key->val, &value);
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res >= 0)
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "'%s' ", value);
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "CANON-VALUE-FAILED ");
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == 0)
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(value)
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (key != NULL)
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(no val), ");
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "(key missing), ");
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, ")\n");
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (bind != NULL);
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_IDC */
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
460994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Utilities					*
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPropNode:
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Seeks an attribute with a name of @name in
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * no namespace.
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute or NULL if not present.
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlAttrPtr
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPropNode(xmlNodePtr node, const char *name)
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop;
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (name == NULL))
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    prop = node->properties;
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (prop != NULL) {
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name))
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(prop);
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prop = prop->next;
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPropNodeNs:
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri: the uri
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Seeks an attribute with a local name of @name and
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a namespace URI of @uri.
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute or NULL if not present.
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlAttrPtr
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name)
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop;
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (name == NULL))
465660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(NULL);
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    prop = node->properties;
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (prop != NULL) {
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((prop->ns != NULL) &&
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(prop->name, BAD_CAST name) &&
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(prop->ns->href, BAD_CAST uri))
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(prop);
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prop = prop->next;
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ret;
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlNodeGetContent(node);
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlStrdup((xmlChar *)"");
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlDictLookup(ctxt->dict, val, -1);
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(val);
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNodeContentNoDict(xmlNodePtr node)
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((const xmlChar*) xmlNodeGetContent(node));
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetProp:
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the property name
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read a attribute value and internalize the string
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string or NULL if not present.
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const char *name)
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ret;
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlGetNoNsProp(node, BAD_CAST name);
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlDictLookup(ctxt->dict, val, -1);
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(val);
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
471494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
471594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Parsing functions				*
471694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_FIND_GLOBAL_ITEM(slot)			\
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(nsName, schema->targetNamespace)) { \
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlHashLookup(schema->slot, name); \
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL) goto exit; \
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } \
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashSize(schema->schemasImports) > 1) { \
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaImportPtr import; \
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName == NULL) \
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    import = xmlHashLookup(schema->schemasImports, \
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_NO_NAMESPACE); \
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else \
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    import = xmlHashLookup(schema->schemasImports, nsName); \
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (import == NULL) \
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit; \
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlHashLookup(import->schema->slot, name); \
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetElem:
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema context
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the element name
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the element namespace
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a global element declaration in the schema.
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element declaration or NULL if not found.
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name,
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret = NULL;
475160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(elemDecl)
475660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup element decl. %s", name);
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup element decl. %s:%s", name,
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetType:
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the main schema
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the type's name
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nsName:  the type's namespace
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a type in the schemas or the predefined types
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name,
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ret = NULL;
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
478760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* First try the built-in types. */
478960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) {
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaGetPredefinedType(name, nsName);
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we try the parsed schemas as well here
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* since one might have parsed the S4S, which contain more
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* than the built-in types.
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Can we optimize this?
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(typeDecl)
480260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup type %s", name);
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup type %s:%s", name,
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetAttributeDecl:
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the attribute
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a an attribute in the schema or imported schemas
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute declaration or NULL if not found.
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name,
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret = NULL;
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(attrDecl)
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute %s", name);
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute %s:%s", name,
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetAttributeGroup:
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute group
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the attribute group
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a an attribute group in the schema or imported schemas
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group definition or NULL if not found.
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name,
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret = NULL;
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != NULL) && (ret->redef != NULL)) {
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Return the last redefinition. *
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret->redef;
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute group %s", name);
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute group %s:%s", name,
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetGroup:
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the group
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the group
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a group in the schema or imported schemas
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name,
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr ret = NULL;
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(groupDecl)
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
491360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup group %s", name);
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup group %s:%s", name,
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNotation(xmlSchemaPtr schema,
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *name,
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *nsName)
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret = NULL;
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(notaDecl)
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetIDC(xmlSchemaPtr schema,
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *name,
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *nsName)
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr ret = NULL;
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(idcDef)
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetNamedComponent:
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the group
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the group
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a group in the schema or imported schemas
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNamedComponent(xmlSchemaPtr schema,
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypeType itemType,
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *name,
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *targetNs)
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (itemType) {
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema,
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, targetNs));
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema,
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, targetNs));
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
498894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
498994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Parsing functions				*
499094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n)						\
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsBlank:
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a string
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the length of the string or -1
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsBlank(xmlChar * str, int len)
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) {
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (*str != 0) {
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!(IS_BLANK_CH(*str)))
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str++;
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else while ((*str != 0) && (len != 0)) {
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!(IS_BLANK_CH(*str)))
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str++;
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len--;
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
502260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_COMP_NAME(c, t) ((t) (c))->name
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaFindRedefCompInGraph:
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* ATTENTION TODO: This uses pointer comp. for strings.
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaTypeType type,
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *name,
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *nsName)
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr ret;
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (name == NULL))
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket->globals == NULL) ||
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(bucket->globals->nbItems == 0))
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto subschemas;
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Search in global components.
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < bucket->globals->nbItems; i++) {
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = bucket->globals->items[i];
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->type == type) {
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (type) {
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_COMPLEX:
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SIMPLE:
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) &&
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret, xmlSchemaTypePtr) ==
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName))
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_GROUP:
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret,
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaModelGroupDefPtr) == name) &&
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret,
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaModelGroupDefPtr) == nsName))
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret,
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAttributeGroupPtr) == name) &&
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret,
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAttributeGroupPtr) == nsName))
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Should not be hit. */
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
508360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectsubschemas:
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process imported/included schemas.
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel = bucket->relations;
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Marking the bucket will not avoid multiple searches
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* in the same schema, but avoids at least circularity.
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((rel->bucket != NULL) &&
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type, name, nsName);
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != NULL)
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(ret);
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddNotation:
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema annotation declaration
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar *name, const xmlChar *nsName,
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr node ATTRIBUTE_UNUSED)
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret = NULL;
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation));
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "add annotation", NULL);
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaNotation));
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_NOTATION;
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: do we need the node to be set?
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * ret->node = node;*/
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttribute:
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute declaration
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const xmlChar * name, const xmlChar * nsName,
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlNodePtr node, int topLevel)
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret = NULL;
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute));
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL);
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttribute));
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttributeUse:
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute declaration
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeUsePtr
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node)
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr ret = NULL;
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse));
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL);
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeUse));
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaAddRedef:
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Adds a redefinition information. This is used at a later stage to:
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* resolve references to the redefined components and to check constraints.
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaRedefPtr
523160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaBucketPtr targetBucket,
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  void *item,
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *refName,
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *refTargetNs)
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr ret;
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaRedefPtr)
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaRedef));
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating redefinition info", NULL);
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaRedef));
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->item = item;
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetBucket = targetBucket;
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->refName = refName;
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->refTargetNs = refTargetNs;
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL)
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->redefs = ret;
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret;
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->lastRedef = ret;
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttributeGroupDefinition:
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nsName:  the target namespace
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the corresponding node
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute Group definition.
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema ATTRIBUTE_UNUSED,
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *name,
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *nsName,
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret = NULL;
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (name == NULL))
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeGroupPtr)
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlSchemaAttributeGroup));
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL);
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeGroup));
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
529460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Remove the flag. */
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->isRedefine) {
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, name, nsName);
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->redef == NULL) {
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
530460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefCounter = 0;
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(pctxt, ret);
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(pctxt, ret);
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddElement:
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the type name
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the type namespace
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Element declaration
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar * name, const xmlChar * nsName,
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node, int topLevel)
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret = NULL;
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (name == NULL))
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement));
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating element", NULL);
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaElement));
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ELEMENT;
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddType:
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema item
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlSchemaTypeType type,
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * name, const xmlChar * nsName,
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlNodePtr node, int topLevel)
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ret = NULL;
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating type", NULL);
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaType));
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->isRedefine) {
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret, name, nsName);
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->redef == NULL) {
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(ret);
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
539360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->redefCounter = 0;
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
539960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    WXS_ADD_PENDING(ctxt, ret);
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaTypeType refType,
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *refName,
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *refNs)
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ret;
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaQNameRefPtr)
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaQNameRef));
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating QName reference item", NULL);
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = NULL;
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = refName;
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = refNs;
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->item = NULL;
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->itemType = refType;
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Store the reference item in the schema.
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeUseProhibPtr
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUseProhibPtr ret;
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeUseProhibPtr)
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaAttributeUseProhib));
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating attribute use prohibition", NULL);
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib));
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddModelGroup:
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the "compositor" type of the model group
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node in the schema doc
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds a schema model group
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupPtr
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaPtr schema,
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypeType type,
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr node)
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr ret = NULL;
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaModelGroupPtr)
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaModelGroup));
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "allocating model group component",
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaModelGroup));
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == XML_SCHEMA_TYPE_SEQUENCE) ||
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type == XML_SCHEMA_TYPE_CHOICE))
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, ret);
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddParticle:
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the corresponding node in the schema doc
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minOccurs
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maxOccurs
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds an XML schema particle component.
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParticlePtr
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr node, int min, int max)
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr ret = NULL;
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(stderr, "Adding particle component\n");
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaParticlePtr)
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaParticle));
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "allocating particle component",
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_PARTICLE;
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->annot = NULL;
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->minOccurs = min;
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxOccurs = max;
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->children = NULL;
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
553160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that addition to pending components will be done locally
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the specific parsing function, since the most particles
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * need not to be fixed up (i.e. the reference to be resolved).
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REMOVED: WXS_ADD_PENDING(ctxt, ret);
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddModelGroupDefinition:
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the group name
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Group definition
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaPtr schema,
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *name,
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *nsName,
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlNodePtr node)
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr ret = NULL;
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaModelGroupDefPtr)
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaModelGroupDef));
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "adding group", NULL);
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaModelGroupDef));
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_GROUP;
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->isRedefine) {
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, name, nsName);
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->redef == NULL) {
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
558060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->redefCounter = 0;
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewWildcardNs:
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new wildcard namespace constraint.
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardNsPtr
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr ret;
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaWildcardNsPtr)
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaWildcardNs));
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL);
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const xmlChar *name, const xmlChar *nsName,
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int category, xmlNodePtr node)
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
561760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaIDCPtr ret = NULL;
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC));
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt,
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating an identity-constraint definition", NULL);
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaIDC));
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The target namespace of the parent element declaration. */
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = category;
563360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
563460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Only keyrefs need to be fixup up.
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (category == XML_SCHEMA_TYPE_IDC_KEYREF)
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, ret);
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddWildcard:
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds a wildcard.
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It corresponds to a xsd:anyAttribute and xsd:any.
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaTypeType type, xmlNodePtr node)
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr ret = NULL;
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL);
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaWildcard));
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
567060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group)
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group == NULL)
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group->members != NULL)
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(group->members);
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(group);
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSubstGroupPtr
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaElementPtr head)
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr ret;
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Init subst group hash. */
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_GROUPS(pctxt) == NULL) {
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict);
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_SUBST_GROUPS(pctxt) == NULL)
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create a new substitution group. */
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup));
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a substitution group container", NULL);
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSubstGroup));
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->head = head;
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create list of members. */
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->members = xmlSchemaItemListCreate();
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->members == NULL) {
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSubstGroupFree(ret);
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Add subst group to hash. */
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt),
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	head->name, head->targetNamespace, ret) != 0) {
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaSubstGroupAdd",
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to add a new substitution container");
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSubstGroupFree(ret);
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSubstGroupPtr
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaElementPtr head)
572660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_GROUPS(pctxt) == NULL)
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt),
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	head->name, head->targetNamespace));
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddElementSubstitutionMember:
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema parser context
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @head:  the head of the substitution group
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @member: the new member of the substitution group
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new annotation structure.
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaElementPtr head,
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaElementPtr member)
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr substGroup = NULL;
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (head == NULL) || (member == NULL))
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    substGroup = xmlSchemaSubstGroupGet(pctxt, head);
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL)
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	substGroup = xmlSchemaSubstGroupAdd(pctxt, head);
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL)
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaItemListAdd(substGroup->members, member) == -1)
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
576594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Utilities for parsing					*
576794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeQNameValue:
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the parent as a schema object
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the QName value
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts the local name and the URI of a QName value and validates it.
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used on attribute values that
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should resolve to schema components.
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr ownerItem,
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlAttrPtr attr,
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar *value,
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **uri,
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **local)
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *pref;
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr ns;
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len, ret;
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *uri = NULL;
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = NULL;
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0) {
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, (xmlNodePtr) attr,
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, value, NULL, NULL, NULL);
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = value;
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret < 0)
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strchr((char *) value, ':')) {
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ns = xmlSearchNs(attr->doc, attr->parent, NULL);
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns)
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * parser context. */
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one takes care of included schemas with no
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * target namespace.
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *uri = ctxt->targetNamespace;
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = xmlDictLookup(ctxt->dict, value, -1);
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * At this point xmlSplitQName3 has to return a local name.
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = xmlSplitQName3(value, &len);
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = xmlDictLookup(ctxt->dict, *local, -1);
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pref = xmlDictLookup(ctxt->dict, value, len);
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = xmlSearchNs(attr->doc, attr->parent, pref);
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns == NULL) {
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, (xmlNodePtr) attr,
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value,
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value '%s' of simple type 'xs:QName' has no "
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "corresponding namespace declaration in scope", value, NULL);
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeQName:
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner element
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the attribute node
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the QName of an attribute value.
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used on attribute values that
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should resolve to schema components.
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr ownerItem,
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlAttrPtr attr,
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **uri,
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **local)
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ownerItem, attr, value, uri, local));
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrQName:
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem:  the parent node of the attribute
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the QName of an attribute value.
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaPtr schema,
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaBasicItemPtr ownerItem,
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr ownerElem,
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const char *name,
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar **uri,
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar **local)
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, name);
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = NULL;
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*uri = NULL;
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeQName(ctxt, schema,
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ownerItem, attr, uri, local));
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrID:
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem:  the parent node of the attribute
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the ID of an attribute value.
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the ID is valid, a positive error code
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr)
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr);
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateNCName(value, 1);
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: the IDness might have already be declared in the DTD
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->atype != XML_ATTRIBUTE_ID) {
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIDPtr res;
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *strip;
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Use xmlSchemaStrip here; it's not exported at this
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * moment.
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    strip = xmlSchemaCollapseString(value);
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (strip != NULL) {
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) value);
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = strip;
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
596194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    res = xmlAddID(NULL, attr->doc, value, attr);
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == NULL) {
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL, "Duplicate value '%s' of simple "
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type 'xs:ID'", value, NULL);
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->atype = XML_ATTRIBUTE_ID;
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret > 0) {
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr,
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, "The value '%s' of simple type 'xs:ID' is "
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "not a valid 'xs:NCName'",
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value, NULL);
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *)value);
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr ownerElem,
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *name)
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, (const char *) name);
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaPValAttrNodeID(ctxt, attr));
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetMaxOccurs:
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the maxOccurs property
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, or the value
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int min, int max, int def, const char *expected)
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val, *cur;
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "maxOccurs");
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(val, (const xmlChar *) "unbounded")) {
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (max != UNBOUNDED) {
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* XML_SCHEMAP_INVALID_MINOCCURS, */
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL, expected,
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (def);
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (UNBOUNDED);  /* encoding it with -1 might be another option */
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0) {
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ret * 10 + (*cur - '0');
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Restrict the maximal value to Integer.
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetMinOccurs:
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the minOccurs property
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, or the value
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int min, int max, int def, const char *expected)
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val, *cur;
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "minOccurs");
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0) {
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ret * 10 + (*cur - '0');
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Restrict the maximal value to Integer.
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPGetBoolNodeValue:
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes:  owner designation
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem:  the owner as a schema item
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node holding the value
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean string value into 1 or 0.
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1.
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0;
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlNodeGetContent(node);
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.2.1 Lexical representation
614260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * An instance of a datatype that is defined as �boolean�
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can have the following legal literals {true, false, 1, 0}.
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(BAD_CAST value, BAD_CAST "true"))
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 1;
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false"))
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 0;
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1"))
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = 1;
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0"))
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 0;
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INVALID_BOOLEAN,
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, node,
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, BAD_CAST value,
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL);
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(value);
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (res);
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetBooleanProp:
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the default value
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate if a boolean property is set
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, 0 if found to be false,
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 if found to be true
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const char *name, int def)
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetProp(ctxt, node, name);
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.2.1 Lexical representation
619060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * An instance of a datatype that is defined as �boolean�
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can have the following legal literals {true, false, 1, 0}.
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(val, BAD_CAST "true"))
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 1;
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "false"))
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 0;
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "1"))
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	def = 1;
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "0"))
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 0;
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INVALID_BOOLEAN,
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL,
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlNodePtr) xmlSchemaGetPropNode(node, name),
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, val, NULL, NULL, NULL);
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
621394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Shema extraction from an Infoset			*
621594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt, xmlSchemaPtr schema,
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 xmlNodePtr node,
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						 int topLevel);
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt,
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlSchemaPtr schema,
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlNodePtr node,
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  int topLevel);
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt,
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlSchemaPtr schema,
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlNodePtr node,
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeType parentType);
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaItemListPtr uses,
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int parentType);
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlSchemaPtr schema,
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlNodePtr node);
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema, xmlNodePtr node);
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeValue:
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the schema attribute node being validated
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates a value against the given built-in type.
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlAttrPtr attr,
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *value,
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type)
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Should we move this to xmlschematypes.c? Hmm, but this
6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * one is really meant to be used internally, so better not.
6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (type == NULL) || (attr == NULL))
6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_BASIC) {
6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaPValAttrNodeValue",
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the given type is not a built-in type");
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->builtInType) {
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NCNAME:
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_QNAME:
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYURI:
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TOKEN:
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LANGUAGE:
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValPredefTypeNode(type, value, NULL,
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) attr);
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default: {
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaPValAttrNodeValue",
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validation using the given type is not supported while "
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"parsing a schema");
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Should we use the S4S error codes instead?
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaPValAttrNodeValue",
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to validate a schema attribute value");
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret > 0) {
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_LIST(type))
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
631060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaPSimpleTypeErr(pctxt,
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, ownerItem, (xmlNodePtr) attr,
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, NULL, value, NULL, NULL, NULL);
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNode:
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the schema attribute node being validated
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the resulting value if any
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates a value against the given built-in type.
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlAttrPtr attr,
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type,
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **value)
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (type == NULL) || (attr == NULL))
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = val;
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr,
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val, type));
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttr:
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node of the attribute
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner element node
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the schema attribute node
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the resulting value if any
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates a value against the given built-in type.
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
637460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaBasicItemPtr ownerItem,
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr ownerElem,
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const char *name,
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type,
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar **value)
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (type == NULL)) {
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_BASIC) {
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem,
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaPValAttr, the given "
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "type '%s' is not a built-in type.\n",
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->name, NULL);
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, name);
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr,
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type, value));
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaPtr schema ATTRIBUTE_UNUSED,
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlAttrPtr attr,
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *namespaceName)
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Pointer comparison instead? */
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(pctxt->targetNamespace, namespaceName))
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(xmlSchemaNs, namespaceName))
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check if the referenced namespace was <import>ed.
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_BUCKET(pctxt)->relations != NULL) {
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel;
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	rel = WXS_BUCKET(pctxt)->relations;
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlStrEqual(namespaceName, rel->importNamespace))
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No matching <import>ed namespace found.
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node;
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaceName == NULL)
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"References from this schema to components in no "
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"namespace are not allowed, since not indicated by an "
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"import statement", NULL, NULL);
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"References from this schema to components in the "
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"namespace '%s' are not allowed, since not indicated by an "
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"import statement", namespaceName, NULL);
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_SCHEMAP_SRC_RESOLVE);
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseLocalAttributes:
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the hosting type where the attributes will be anchored
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses attribute uses and attribute declarations and
646460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * attribute group references.
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr *child, xmlSchemaItemListPtr *list,
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int parentType, int *hasRefs)
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *item;
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((IS_SCHEMA((*child), "attribute")) ||
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           (IS_SCHEMA((*child), "attributeGroup"))) {
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_SCHEMA((*child), "attribute")) {
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = xmlSchemaParseLocalAttribute(ctxt, schema, *child,
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*list, parentType);
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child);
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((item != NULL) && (hasRefs != NULL))
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*hasRefs = 1;
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (item != NULL) {
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*list == NULL) {
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Customize grow factor. */
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*list = xmlSchemaItemListCreate();
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*list == NULL)
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListAddSize(*list, 2, item) == -1)
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *child = (*child)->next;
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAnnotation:
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attrribute declaration
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed)
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr ret;
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int barked = 0;
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * INFO: S4S completed.
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * id = ID
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {any attributes with non-schema namespace . . .}>
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Content: (appinfo | documentation)*
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (node == NULL))
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (needed)
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewAnnot(ctxt, node);
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = NULL;
6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((attr->ns == NULL) &&
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!xmlStrEqual(attr->name, BAD_CAST "id"))) ||
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((attr->ns != NULL) &&
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "appinfo")) {
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: make available the content of "appinfo". */
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * source = anyURI
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {any attributes with non-schema namespace . . .}>
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Content: ({any})*
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = child->properties;
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (attr != NULL) {
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((attr->ns == NULL) &&
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (!xmlStrEqual(attr->name, BAD_CAST "source"))) ||
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ((attr->ns != NULL) &&
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
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		attr = attr->next;
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttr(ctxt, NULL, child, "source",
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "documentation")) {
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: make available the content of "documentation". */
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * source = anyURI
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {any attributes with non-schema namespace . . .}>
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Content: ({any})*
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = child->properties;
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (attr != NULL) {
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (attr->ns == NULL) {
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!xmlStrEqual(attr->name, BAD_CAST "source")) {
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(attr->ns->href, xmlSchemaNs) ||
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlStrEqual(attr->name, BAD_CAST "lang") &&
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) {
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = attr->next;
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Attribute "xml:lang".
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang");
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL)
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPValAttrNode(ctxt, NULL, attr,
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL);
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!barked)
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child, NULL, "(appinfo | documentation)*");
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    barked = 1;
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseFacet:
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Facet declaration
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new type structure or NULL in case of error
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaFacetPtr
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr node)
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet = xmlSchemaNewFacet();
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL) {
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating facet", node);
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->node = node;
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetProp(ctxt, node, "value");
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE,
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Facet %s has no value\n", node->name, NULL);
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(node, "minInclusive")) {
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "minExclusive")) {
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxInclusive")) {
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxExclusive")) {
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "totalDigits")) {
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "fractionDigits")) {
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "pattern")) {
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_PATTERN;
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "enumeration")) {
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_ENUMERATION;
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "whiteSpace")) {
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_WHITESPACE;
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "length")) {
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_LENGTH;
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxLength")) {
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXLENGTH;
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "minLength")) {
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINLENGTH;
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE,
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Unknown facet type %s\n", node->name, NULL);
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->value = value;
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *fixed;
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fixed = xmlSchemaGetProp(ctxt, node, "fixed");
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fixed != NULL) {
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(fixed, BAD_CAST "true"))
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->fixed = 1;
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD,
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Facet %s has unexpected child content\n",
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       node->name, NULL);
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (facet);
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseWildcardNs:
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wildc:  the wildcard, already created
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses the attribute "processContents" and "namespace"
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of a xsd:anyAttribute and xsd:any.
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if everything goes fine, a positive error code
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if something is not valid and -1 if an internal error occurs.
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaPtr schema ATTRIBUTE_UNUSED,
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaWildcardPtr wildc,
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node)
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *pc, *ns, *dictnsItem;
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *nsItem;
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr tmp, lastNs = NULL;
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pc = xmlSchemaGetProp(ctxt, node, "processContents");
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pc == NULL)
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        || (xmlStrEqual(pc, (const xmlChar *) "strict"))) {
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) {
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_SKIP;
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) {
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_LAX;
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(strict | skip | lax)", pc,
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL);
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Build the namespace constraints.
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "namespace");
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any")))
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->any = 1;
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(ns, BAD_CAST "##other")) {
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wildc->negNsSet == NULL) {
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->negNsSet->value = ctxt->targetNamespace;
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end, *cur;
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = ns;
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsItem = xmlStrndup(cur, end - cur);
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xmlStrEqual(nsItem, BAD_CAST "##other")) ||
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(nsItem, BAD_CAST "##any"))) {
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER,
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL,
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "((##any | ##other) | List of (xs:anyURI | "
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "(##targetNamespace | ##local)))",
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nsItem, NULL, NULL, NULL);
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER;
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) {
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = ctxt->targetNamespace;
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(nsItem, BAD_CAST "##local")) {
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = NULL;
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Validate the item (anyURI).
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeValue(ctxt, NULL, attr,
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1);
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Avoid dublicate namespaces.
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = wildc->nsSet;
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (tmp != NULL) {
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dictnsItem == tmp->value)
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = tmp->next;
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == NULL) {
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp == NULL) {
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(nsItem);
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp->value = dictnsItem;
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp->next = NULL;
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (wildc->nsSet == NULL)
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wildc->nsSet = tmp;
6819df143a5041f03a22808b59c76698770b74692815Selim Gurun		    else if (lastNs != NULL)
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lastNs->next = tmp;
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastNs = tmp;
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsItem);
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr item ATTRIBUTE_UNUSED,
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlNodePtr node,
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int minOccurs,
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int maxOccurs) {
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((maxOccurs == 0) && ( minOccurs == 0))
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (maxOccurs != UNBOUNDED) {
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Maybe we should better not create the particle,
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if min/max is invalid, since it could confuse the build of the
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* content model.
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.9.6 Schema Component Constraint: Particle Correct
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (maxOccurs < 1) {
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.2 {max occurs} must be greater than or equal to 1.
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomAttrErr(ctxt,
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_P_PROPS_CORRECT_2_2,
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetPropNode(node, "maxOccurs"),
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value must be greater than or equal to 1");
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_2);
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (minOccurs > maxOccurs) {
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.1 {min occurs} must not be greater than {max occurs}.
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomAttrErr(ctxt,
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_P_PROPS_CORRECT_2_1,
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetPropNode(node, "minOccurs"),
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value must not be greater than the value of 'maxOccurs'");
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_1);
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAny:
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsea a XML schema <any> element. A particle and wildcard
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be created (except if minOccurs==maxOccurs==0, in this case
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nothing will be created).
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParticlePtr
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  xmlNodePtr node)
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle;
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr wild;
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max;
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot = NULL;
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * minOccurs/maxOccurs.
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"(xs:nonNegativeInteger | unbounded)");
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1,
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"xs:nonNegativeInteger");
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create & parse the wildcard.
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node);
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild == NULL)
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParseWildcardNs(ctxt, schema, wild, node);
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        annot = xmlSchemaParseAnnotation(ctxt, child, 1);
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No component if minOccurs==maxOccurs==0.
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((min == 0) && (max == 0)) {
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Don't free the wildcard, since it's already on the list. */
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the particle.
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle = xmlSchemaAddParticle(ctxt, node, min, max);
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle->annot = annot;
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle->children = (xmlSchemaTreeItemPtr) wild;
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (particle);
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseNotation:
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Notation declaration
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new structure or NULL in case of error
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret;
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlSchemaGetProp(ctxt, node, "name");
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME,
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Notation has no name\n", NULL, NULL);
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddNotation(ctxt, schema, name,
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->targetNamespace, node);
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAnyAttribute:
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema AnyAttrribute declaration
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a wildcard or NULL.
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema, xmlNodePtr node)
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr ret;
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node);
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the namespace list.
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0)
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttribute:
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attrribute declaration
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute declaration.
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaItemListPtr uses,
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int parentType)
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue, *name = NULL, *ns = NULL;
710760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttributeUsePtr use = NULL;
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL;
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int	nberrors, hasForm = 0, defValueType = 0;
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_DEF_VAL_DEFAULT 1
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_DEF_VAL_FIXED 2
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 3.2.3 Constraints on XML Representations of Attribute Declarations
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNodeQName(pctxt, schema,
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, attr, &tmpNs, &tmpName) != 0) {
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0)
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isRef = 1;
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nberrors = pctxt->nberrors;
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (isRef) {
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "id")) {
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeID(pctxt, attr);
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "ref")) {
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "id")) {
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeID(pctxt, attr);
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "type")) {
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeQName(pctxt, schema, NULL,
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attr, &tmpNs, &tmpName);
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "form")) {
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Evaluate the target namespace
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
716160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    hasForm = 1;
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(pctxt,
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = pctxt->targetNamespace;
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified"))
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(pctxt,
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr,
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, "(qualified | unqualified)",
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->name, BAD_CAST "use")) {
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Maybe we need to normalize the value beforehand. */
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attrValue, BAD_CAST "optional"))
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (xmlStrEqual(attrValue, BAD_CAST "prohibited"))
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (xmlStrEqual(attrValue, BAD_CAST "required"))
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(pctxt,
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_INVALID_ATTR_USE,
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(optional | prohibited | required)",
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "default")) {
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.2.3 : 1
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (defValue) {
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPMutualExclAttrErr(pctxt,
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_1,
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, attr, "default", "fixed");
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) {
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.2.3 : 1
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (defValue) {
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPMutualExclAttrErr(pctxt,
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_1,
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, attr, "default", "fixed");
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValueType = WXS_ATTR_DEF_VAL_FIXED;
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs))
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto attr_next;
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPIllegalAttrErr(pctxt,
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectattr_next:
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
723260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.3 : 2
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If default and use are both present, use must have
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the actual value optional.
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_ATTRIBUTE_2,
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(optional | prohibited | required)", NULL,
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value of the attribute 'use' must be 'optional' "
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "if the attribute 'default' is present",
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We want correct attributes.
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nberrors != pctxt->nberrors)
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isRef) {
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributePtr attrDecl;
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR))
725860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ns = pctxt->targetNamespace;
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.6 Schema Component Constraint: xsi: Not Allowed
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move this to the component layer.
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(ns, xmlSchemaInstanceNs)) {
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_NO_XSI,
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The target namespace must not match '%s'",
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInstanceNs, NULL);
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "name", NULL);
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.6 Schema Component Constraint: xmlns Not Allowed
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move this to the component layer.
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(name, BAD_CAST "xmlns")) {
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(pctxt,
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_NO_XMLNS,
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr,
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the attribute must not match 'xmlns'",
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto check_children;
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute use component.
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = xmlSchemaAddAttributeUse(pctxt, node);
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use == NULL)
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->occurs = occurs;
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute declaration.
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0);
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attrDecl == NULL)
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmpName != NULL) {
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->typeName = tmpName;
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->typeNs = tmpNs;
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->attrDecl = attrDecl;
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Value constraint.
731560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (defValue != NULL) {
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->defValue = defValue;
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref;
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute use component.
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = xmlSchemaAddAttributeUse(pctxt, node);
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use == NULL)
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need to resolve the reference at later stage.
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(pctxt, use);
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->occurs = occurs;
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a QName reference to the attribute declaration.
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpName, tmpNs);
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ref == NULL)
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Assign the reference. This will be substituted for the
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* referenced attribute declaration when the QName is resolved.
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->attrDecl = WXS_ATTR_CAST ref;
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Value constraint.
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (defValue != NULL)
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->defValue = defValue;
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
735560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcheck_children:
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
736260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaAttributeUseProhibPtr prohib;
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(pctxt, child, 0);
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt,
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?)");
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for pointlessness of attribute prohibitions.
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
737760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Skipping attribute use prohibition, since it is "
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pointless inside an <attributeGroup>",
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL);
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Skipping attribute use prohibition, since it is "
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pointless when extending a type",
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL);
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! isRef) {
739560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    tmpName = name;
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpNs = ns;
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for duplicate attribute prohibitions.
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uses) {
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
740360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < uses->nbItems; i++) {
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = uses->items[i];
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
741160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node, NULL,
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping duplicate attribute use prohibition '%s'",
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str, tmpNs, tmpName),
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
741860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    FREE_AND_NULL(str)
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
742060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute prohibition helper component.
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib = xmlSchemaAddAttributeUseProhib(pctxt);
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prohib == NULL)
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->node = node;
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->name = tmpName;
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->targetNamespace = tmpNs;
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isRef) {
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We need at least to resolve to the attribute declaration.
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ADD_PENDING(pctxt, prohib);
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(WXS_BASIC_CAST prohib);
743960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Should this go into the attr decl?
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isRef) {
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (child != NULL) {
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (IS_SCHEMA(child, "simpleType"))
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 3.2.3 : 3.2
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * If ref is present, then all of <simpleType>,
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * form and type must be absent.
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt,
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_3_2,
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child, NULL,
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"(annotation?)");
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt,
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child, NULL,
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"(annotation?)");
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "simpleType")) {
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_ATTRUSE_DECL(use)->typeName != NULL) {
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 3.2.3 : 4
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * type and <simpleType> must not both be present.
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child,
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The attribute 'type' and the <simpleType> child "
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"are mutually exclusive", NULL);
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use) =
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaParseSimpleType(pctxt, schema, child, 0);
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child = child->next;
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (child != NULL)
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, simpleType?)");
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
748660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (WXS_BASIC_CAST use);
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaPtr schema,
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlNodePtr node)
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue;
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret;
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Note that the w3c spec assumes the schema to be validated with schema
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * for schemas beforehand.
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 3.2.3 Constraints on XML Representations of Attribute Declarations
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
750860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.3 : 3.1
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * One of ref or name must be present, but not both
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "name", NULL);
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.6 Schema Component Constraint: xmlns Not Allowed
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Move this to the component layer.
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) {
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NO_XMLNS,
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr,
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value of the attribute must not match 'xmlns'",
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.6 Schema Component Constraint: xsi: Not Allowed
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Move this to the component layer.
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       Or better leave it here and add it to the component layer
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       if we have a schema construction API.
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomErr(ACTXT_CAST pctxt,
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NO_XSI, node, NULL,
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The target namespace must not match '%s'",
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaInstanceNs, NULL);
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddAttribute(pctxt, schema, attrValue,
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->targetNamespace, node, 1);
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
755460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "default")) &&
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "type")))
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
756860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrQName(pctxt, schema, NULL,
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, "type", &ret->typeNs, &ret->typeName);
757860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "fixed".
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed");
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->defValue != NULL)
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->flags |= XML_SCHEMAS_ATTR_FIXED;
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "default".
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "default");
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.3 : 1
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* default and fixed must not both be present.
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->flags & XML_SCHEMAS_ATTR_FIXED) {
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1,
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST ret, attr, "default", "fixed");
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->typeName != NULL) {
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.2.3 : 4
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type and <simpleType> must not both be present.
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'type' and the <simpleType> child "
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"are mutually exclusive", NULL);
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0);
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL)
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, simpleType?)");
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttributeGroupRef:
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an attribute group definition reference.
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that a reference to an attribute group does not
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * correspond to any component at all.
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group or NULL in case of error.
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node)
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ret;
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *refNs = NULL, *ref = NULL;
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "ref", NULL);
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
766360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrNodeQName(pctxt, schema,
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr, &refNs, &ref);
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0)
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
766860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")))
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Attribute ID */
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We do not have a place to store the annotation, do we?
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseAnnotation(pctxt, child, 0);
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle attribute group redefinitions.
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->isRedefine && pctxt->redef &&
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(pctxt->redef->item->type ==
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ref == pctxt->redef->refName) &&
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(refNs == pctxt->redef->refTargetNs))
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC src-redefine:
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (7.1) "If it has an <attributeGroup> among its contents
772060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* the �actual value� of whose ref [attribute] is the same
772160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* as the �actual value� of its own name attribute plus
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* target namespace, then it must have exactly one such group."
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->redefCounter != 0) {
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
772660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The redefining attribute group definition "
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s' must not contain more than one "
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"reference to the redefined definition",
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, refNs, ref), NULL);
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefCounter++;
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: How to ensure that the reference will not be
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* handled by the normal component resolution mechanism?
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewQNameRef(pctxt,
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->node = node;
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redef->reference = WXS_BASIC_CAST ret;
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a QName-reference helper component. We will substitute this
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* component for the attribute uses of the referenced attribute group
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition.
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewQNameRef(pctxt,
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->node = node;
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Add to pending items, to be able to resolve the reference. */
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(pctxt, ret);
776060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttributeGroupDefinition:
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema validation context
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attribute Group declaration
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group definition or NULL in case of error.
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlNodePtr node)
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret;
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasRefs = 0;
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "name", NULL);
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The name is crucial, exit if invalid.
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrNode(pctxt,
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr,
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema,
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name, pctxt->targetNamespace, node);
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
780760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return (NULL);
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")))
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Attribute ID */
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse contained attribute decls/refs.
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseLocalAttributes(pctxt, schema, &child,
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaItemListPtr *) &(ret->attrUses),
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasRefs)
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the attribute wildcard.
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "anyAttribute")) {
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schema, child);
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrFormDefault:
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: the flags to be modified
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagQualified: the specific flag for "qualified"
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, 1 otherwise.
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrFormDefault(const xmlChar *value,
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int *flags,
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int flagQualified)
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(value, BAD_CAST "qualified")) {
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if  ((*flags & flagQualified) == 0)
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *flags |= flagQualified;
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (!xmlStrEqual(value, BAD_CAST "unqualified"))
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrBlockFinal:
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: the flags to be modified
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagAll: the specific flag for "#all"
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagExtension: the specific flag for "extension"
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagRestriction: the specific flag for "restriction"
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagSubstitution: the specific flag for "substitution"
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagList: the specific flag for "list"
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagUnion: the specific flag for "union"
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value of the attribute "final" and "block". The value
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is converted into the specified flag values and returned in @flags.
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, 1 otherwise.
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrBlockFinal(const xmlChar *value,
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *flags,
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagAll,
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagExtension,
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagRestriction,
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagSubstitution,
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagList,
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagUnion)
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This does not check for dublicate entries.
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((flags == NULL) || (value == NULL))
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value[0] == 0)
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(value, BAD_CAST "#all")) {
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (flagAll != -1)
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *flags |= flagAll;
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagExtension != -1)
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagExtension;
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagRestriction != -1)
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagRestriction;
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagSubstitution != -1)
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagSubstitution;
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagList != -1)
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagList;
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagUnion != -1)
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagUnion;
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end, *cur = value;
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *item;
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = xmlStrndup(cur, end - cur);
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(item, BAD_CAST "extension")) {
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagExtension != -1) {
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagExtension) == 0)
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagExtension;
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "restriction")) {
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagRestriction != -1) {
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagRestriction) == 0)
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagRestriction;
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "substitution")) {
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagSubstitution != -1) {
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagSubstitution) == 0)
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagSubstitution;
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "list")) {
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagList != -1) {
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagList) == 0)
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagList;
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "union")) {
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagUnion != -1) {
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagUnion) == 0)
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagUnion;
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item != NULL)
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(item);
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((ret == 0) && (*cur != 0));
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCPtr idc,
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCSelectPtr selector,
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlAttrPtr attr,
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isField)
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * c-selector-xpath:
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Selector Value OK
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: 1 The {selector} must be a valid XPath expression, as defined
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * in [XPath].
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (selector == NULL) {
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, idc->node,
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaCheckCSelectorXPath, "
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the selector is not specified.\n", NULL, NULL);
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = idc->node;
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = (xmlNodePtr) attr;
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (selector->xpath == NULL) {
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Adjust error code. */
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The XPath expression of the selector is not valid", NULL);
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar **nsArray = NULL;
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr *nsList = NULL;
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compile the XPath expression.
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We need the array of in-scope namespaces for compilation.
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Call xmlPatterncompile with different options for selector/
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* field.
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL)
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsList = NULL;
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsList = xmlGetNsList(attr->doc, attr->parent);
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Build an array of prefixes and namespaces.
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsList != NULL) {
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, count = 0;
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; nsList[i] != NULL; i++)
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		count++;
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsArray = (const xmlChar **) xmlMalloc(
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(count * 2 + 1) * sizeof(const xmlChar *));
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsArray == NULL) {
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPErrMemory(ctxt, "allocating a namespace array",
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(nsList);
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < count; i++) {
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsArray[2 * i] = nsList[i]->href;
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsArray[2 * i + 1] = nsList[i]->prefix;
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsArray[count * 2] = NULL;
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsList);
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Differentiate between "selector" and "field".
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isField)
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, XML_PATTERN_XSFIELD, nsArray);
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, XML_PATTERN_XSSEL, nsArray);
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsArray != NULL)
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) nsArray);
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (selector->xpathComp == NULL) {
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Adjust error code? */
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The XPath expression '%s' could not be "
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"compiled", selector->xpath);
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ADD_ANNOTATION(annot)   \
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr cur = item->annot; \
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot == NULL) {  \
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = annot;    \
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (annot);         \
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }                           \
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = item->annot;          \
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) {    \
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;	\
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }                           \
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = annot;
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssignAnnotation:
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema component
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot: the annotation
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds the annotation to the given schema component.
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the given annotaion.
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaAnnotPtr annot)
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((annItem == NULL) || (annot == NULL))
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (annItem->type) {
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT: {
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaElementPtr item = (xmlSchemaElementPtr) 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_ATTRIBUTE: {
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem;
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY: {
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) 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_TYPE_PARTICLE:
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE: {
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem;
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributeGroupPtr item =
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeGroupPtr) annItem;
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION: {
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem;
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MININCLUSIVE:
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINEXCLUSIVE:
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXINCLUSIVE:
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_TOTALDIGITS:
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_FRACTIONDIGITS:
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_PATTERN:
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION:
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_WHITESPACE:
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_LENGTH:
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXLENGTH:
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINLENGTH: {
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem;
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX: {
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem;
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP: {
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem;
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL: {
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem;
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPCustomErr(NULL,
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaAddAnnotation, "
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The item is not a annotated schema component", NULL);
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (annot);
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseIDCSelectorAndField:
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML Schema identity-contraint definition's
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <selector> and <field> elements.
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parsed identity-constraint definition.
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCSelectPtr
820760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaIDCPtr idc,
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr node,
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int isField)
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr item;
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "xpath"))) {
8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the item.
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect));
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL) {
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt,
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a 'selector' of an identity-constraint definition",
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(item, 0, sizeof(xmlSchemaIDCSelect));
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "xpath" (mandatory).
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "xpath");
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
824994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlSchemaPMissingAttrErr(ctxt,
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: "field"s have an other syntax than "selector"s.
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr,
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isField) == -1) {
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt,
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) attr,
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaParseIDCSelectorAndField, "
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating the XPath expression of a IDC selector.\n",
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the parent IDC.
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseIDC:
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML Schema identity-contraint definition.
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parsed identity-constraint definition.
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaPtr schema,
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaTypeType idcCategory,
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *targetNamespace)
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr item = NULL;
8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = NULL;
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr field = NULL, lastField = NULL;
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (!xmlStrEqual(attr->name, BAD_CAST "refer")))) {
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "name" (mandatory).
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNode(ctxt,
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr,
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the component. */
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace,
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idcCategory, node);
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "refer" (mandatory).
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "refer");
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"refer", NULL);
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create a reference item.
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->ref == NULL)
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrNodeQName(ctxt, schema,
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(item->ref->targetNamespace),
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(item->ref->name));
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCheckReference(ctxt, schema, node, attr,
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		item->ref->targetNamespace);
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_MISSING,
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"A child element is missing",
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (selector, field+))");
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Child element <selector>.
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "selector")) {
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item, child, 0);
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Child elements <field>.
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "field")) {
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		field = xmlSchemaParseIDCSelectorAndField(ctxt,
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item, child, 1);
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (field != NULL) {
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    field->index = item->nbFields;
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->nbFields++;
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (lastField != NULL)
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lastField->next = field;
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			item->fields = field;
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastField = field;
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child = child->next;
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (IS_SCHEMA(child, "field"));
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "(annotation?, (selector, field+))");
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (selector, field+))");
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseElement:
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @topLevel: indicates if this is global declaration
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML schema element declaration.
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element declaration or a particle; NULL in case
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of an error or if the particle has minOccurs==maxOccurs==0.
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node, int *isElemRef, int topLevel)
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr decl = NULL;
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = NULL;
8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot = NULL;
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr, nameAttr;
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max, isRef = 0;
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 3.3.3 Constraints on XML Representations of Element Declarations */
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Complete implementation of 3.3.6 */
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isElemRef != NULL)
8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*isElemRef = 0;
8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If we get a "ref" attribute on a local <element> we will assume it's
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a reference - even if there's a "name" attribute; this seems to be more
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * robust.
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nameAttr = xmlSchemaGetPropNode(node, "name");
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((topLevel) || (attr == NULL)) {
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nameAttr == NULL) {
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "name", NULL);
8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isRef = 1;
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	annot = xmlSchemaParseAnnotation(ctxt, child, 1);
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip particle part if a global declaration.
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto declaration_part;
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The particle part ==================================================
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)");
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle = xmlSchemaAddParticle(ctxt, node, min, max);
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto return_null;
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* ret->flags |= XML_SCHEMAS_ELEM_REF; */
8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isRef) {
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *refNs = NULL, *ref = NULL;
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr refer = NULL;
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The reference part =============================================
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isElemRef != NULL)
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *isElemRef = 1;
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPValAttrNodeQName(ctxt, schema,
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, attr, &refNs, &ref);
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both"
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nameAttr != NULL) {
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMutualExclAttrErr(ctxt,
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name");
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "ref") ||
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "name") ||
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "id") ||
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "maxOccurs") ||
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "minOccurs"))
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* SPEC (3.3.3 : 2.2) */
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomAttrErr(ctxt,
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ELEMENT_2_2,
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, attr,
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Only the attributes 'minOccurs', 'maxOccurs' and "
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'id' are allowed in addition to 'ref'");
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* No children except <annotation> expected.
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL, "(annotation?)");
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((min == 0) && (max == 0))
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the reference item and attach it to the particle.
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref, refNs);
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refer == NULL)
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) refer;
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->annot = annot;
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the particle to pending components, since the reference
8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* need to be resolved.
8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, particle);
8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) particle);
8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The declaration part ===============================================
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdeclaration_part:
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *ns = NULL, *fixed, *name, *attrValue;
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL;
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr,
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0)
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Evaluate the target namespace.
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (topLevel) {
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ns = ctxt->targetNamespace;
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNode(node, "form");
8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL) {
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = ctxt->targetNamespace;
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) {
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(ctxt,
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(qualified | unqualified)",
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns = ctxt->targetNamespace;
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel);
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl == NULL) {
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "type")) &&
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "default")) &&
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "block")) &&
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "nillable")))
8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (topLevel == 0) {
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (!xmlStrEqual(attr->name, BAD_CAST "form")))
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPIllegalAttrErr(ctxt,
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) &&
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->name, BAD_CAST "abstract")) &&
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) {
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Extract/validate attributes.
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (topLevel) {
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process top attributes of global element declarations here.
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrQName(ctxt, schema,
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "substitutionGroup",
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(decl->substGroupNs), &(decl->substGroup));
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlGetBooleanProp(ctxt, node, "abstract", 0))
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Attribute "final".
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNode(node, "final");
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr == NULL) {
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    -1,
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ELEM_FINAL_EXTENSION,
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(ctxt,
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(#all | List of (extension | restriction))",
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "block".
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "block");
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Apply default "block" values.
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1,
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, "(#all | List of (extension | "
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "restriction | substitution))", attrValue,
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL, NULL);
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlGetBooleanProp(ctxt, node, "nillable", 0))
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "type");
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr != NULL) {
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrNodeQName(ctxt, schema,
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(decl->namedTypeNs), &(decl->namedType));
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCheckReference(ctxt, schema, node,
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr, decl->namedTypeNs);
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl->value = xmlSchemaGetProp(ctxt, node, "default");
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "fixed");
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr != NULL) {
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->value != NULL) {
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.3.3 : 1
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPMutualExclAttrErr(ctxt,
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_1,
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, attr, "default", "fixed");
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_FIXED;
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->value = fixed;
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* And now for the children...
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "complexType")) {
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.3 : 3
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "type" and either <simpleType> or <complexType> are mutually
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * exclusive
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->namedType != NULL) {
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_3,
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'type' and the <complexType> child are "
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0);
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "simpleType")) {
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.3 : 3
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "type" and either <simpleType> or <complexType> are
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * mutually exclusive
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->namedType != NULL) {
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_3,
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'type' and the <simpleType> child are "
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "unique")) ||
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) {
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "unique")) {
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "key")) {
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "keyref")) {
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lastIDC != NULL)
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastIDC->next = curIDC;
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->idcs = (void *) curIDC;
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastIDC = curIDC;
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "(annotation?, ((simpleType | complexType)?, "
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(unique | key | keyref)*))");
8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl->annot = annot;
8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Element Declaration Representation OK 4. will be checked at a
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * different layer.
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) decl);
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) decl;
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) particle);
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_null:
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot != NULL) {
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle != NULL)
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->annot = NULL;
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl != NULL)
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->annot = NULL;
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(annot);
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseUnion:
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Union definition
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of internal error, 0 in case of success and a positive
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code otherwise.
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr node)
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = NULL;
8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mark the simple type as being of variety "union".
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
887060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the �simple ur-type definition�."
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) {
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "memberTypes". This is a list of QNames.
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Check the value to contain anything.
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "memberTypes");
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end;
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *tmp;
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *localName, *nsName;
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr link, lastLink = NULL;
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref;
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->base = cur;
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlStrndup(cur, end - cur);
8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) {
8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the member type link.
8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link = (xmlSchemaTypeLinkPtr)
8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlMalloc(sizeof(xmlSchemaTypeLink));
8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (link == NULL) {
8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, "
8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating a type link", NULL);
8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = NULL;
8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->next = NULL;
8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastLink == NULL)
8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->memberTypes = link;
8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastLink->next = link;
8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastLink = link;
8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a reference item.
8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    localName, nsName);
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ref == NULL) {
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(tmp)
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Assign the reference to the link, it will be resolved
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* later during fixup of the union simple type.
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = (xmlSchemaTypePtr) ref;
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(tmp)
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the simple type ancestor.
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr subtype, last = NULL;
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Anchor the member types in the "subtypes" field of the
8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* simple type.
8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "simpleType")) {
8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    subtype = (xmlSchemaTypePtr)
8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (subtype != NULL) {
8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL) {
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes = subtype;
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = subtype;
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = subtype;
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = subtype;
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last->next = NULL;
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL, "(annotation?, simpleType*)");
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attr == NULL) && (type->subtypes == NULL)) {
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 /*
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-union-memberTypes-or-simpleTypes
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Either the memberTypes [attribute] of the <union> element must
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* be non-empty or there must be at least one simpleType [child].
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES,
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'memberTypes' or "
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "at least one <simpleType> child must be present", NULL);
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseList:
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema List definition
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlNodePtr node)
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mark the type as being of variety "list".
9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
903860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the �simple ur-type definition�."
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "itemType"))) {
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "itemType". NOTE that we will use the "ref" and "refNs"
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * fields for holding the reference to the itemType.
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the "ref" fields.
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrQName(ctxt, schema, NULL,
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, "itemType", &(type->baseNs), &(type->base));
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-list-itemType-or-simpleType
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Either the itemType [attribute] or the <simpleType> [child] of
9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the <list> element must be present, but not both.
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->base != NULL) {
9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'itemType' and the <simpleType> child "
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"are mutually exclusive", NULL);
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type->base == NULL) {
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'itemType' or the <simpleType> child "
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "must be present", NULL);
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL, "(annotation?, simpleType?)");
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->base == NULL) &&
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->subtypes == NULL) &&
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaGetPropNode(node, "itemType") == NULL)) {
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'itemType' or the <simpleType> child "
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "must be present", NULL);
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSimpleType:
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Simple Type definition
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 in case of success.
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr node, int topLevel)
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type, oldCtxtType;
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue = NULL;
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasRestriction = 0;
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"name", NULL);
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrNode(ctxt,
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip built-in types.
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->isS4S) {
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr biType;
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->isRedefine) {
9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * REDEFINE: Disallow redefinition of built-in-types.
9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: It seems that the spec does not say anything
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * about this case.
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node,
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Redefinition of built-in simple types is not "
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"supported", NULL);
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (biType != NULL)
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (biType);
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TargetNamespace:
918360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "The �actual value� of the targetNamespace [attribute]
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the <schema> ancestor element information item if present,
918560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * otherwise �absent�.
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel == 0) {
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        char buf[40];
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as local simple type definition.
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1);
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE,
9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->targetNamespace, node, 0);
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE,
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ctxt->targetNamespace, node, 0);
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_SIMPLE;
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
921760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as global simple type definition.
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that attrValue is the value of the attribute "name" here.
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE,
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue, ctxt->targetNamespace, node, 1);
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_SIMPLE;
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "final"))) {
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "final".
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "final");
9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue = xmlSchemaGetProp(ctxt, node, "final");
9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_LIST,
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, (xmlNodePtr) attr,
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, "(#all | List of (list | union | restriction)",
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue, NULL, NULL, NULL);
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->targetNamespace = ctxt->targetNamespace;
9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldCtxtType = ctxt->ctxtType;
928860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = type;
929060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING,
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | list | union))");
930060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (IS_SCHEMA(child, "restriction")) {
9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
930260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    XML_SCHEMA_TYPE_SIMPLE);
930360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	hasRestriction = 1;
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "list")) {
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseList(ctxt, schema, child);
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "union")) {
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseUnion(ctxt, schema, child);
9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | list | union))");
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REDEFINE: SPEC src-redefine (5)
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "Within the [children], each <simpleType> must have a
932060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * <restriction> among its [children] ... the �actual value� of whose
932160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * base [attribute] must be the same as the �actual value� of its own
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * name attribute plus target namespace;"
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "This is a redefinition, thus the "
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "<simpleType> must have a <restriction> child", NULL);
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
932960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = oldCtxtType;
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (type);
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroupDefRef:
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema being built
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a reference to a model group definition.
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We will return a particle component with a qname-component or
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of an error.
9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaPtr schema,
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlNodePtr node)
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr item;
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ref = NULL, *refNs = NULL;
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max;
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "ref", NULL);
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL,
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr, &refNs, &ref) != 0) {
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"(xs:nonNegativeInteger | unbounded)");
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) {
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddParticle(ctxt, node, min, max);
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
939560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return (NULL);
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a qname-reference and set as the term; it will be substituted
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for the model group after the reference has been resolved.
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item->children = (xmlSchemaTreeItemPtr)
940160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs);
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max);
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Is annotation even allowed for a model group reference? */
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: What to do exactly with the annotation?
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Corresponds to no component at all if minOccurs==maxOccurs==0.
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((min == 0) && (max == 0))
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((xmlSchemaTreeItemPtr) item);
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroupDefinition:
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML schema model group definition.
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that the contraint src-redefine (6.2) can't be applied until
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * references have been resolved. So we will do this at the
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * component fixup level.
944160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaPtr schema,
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr node)
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr item;
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name,
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->targetNamespace, node);
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id"))) {
9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "all")) {
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ALL, 0);
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "choice")) {
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_CHOICE, 0);
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "sequence")) {
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SEQUENCE, 0);
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
951560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (all | choice | sequence)?)");
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCleanupDoc:
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the root of the document.
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * removes unwanted nodes in a schemas document tree
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root)
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr delete, cur;
9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (root == NULL)) return;
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Remove all the blank text nodes
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    delete = NULL;
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = root;
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (delete != NULL) {
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(delete);
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(delete);
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = NULL;
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_TEXT_NODE) {
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (IS_BLANK_NODE(cur)) {
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlNodeGetSpacePreserve(cur) != 1) {
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type != XML_ELEMENT_NODE) &&
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type != XML_CDATA_SECTION_NODE)) {
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = cur;
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto skip_children;
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Skip to next node
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->children != NULL) {
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->children->type != XML_ENTITY_DECL) &&
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_REF_NODE) &&
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_NODE)) {
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->children;
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip_children:
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == root) {
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = NULL;
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (delete != NULL) {
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlUnlinkNode(delete);
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNode(delete);
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        delete = NULL;
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearSchemaDefaults(xmlSchemaPtr schema)
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_QUALIF_ATTR)
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node)
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, oldErrs = ctxt->nberrors;
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Those flags should be moved to the parser context flags,
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * since they are not visible at the component level. I.e.
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * they are used if processing schema *documents* only.
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE;
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Since the version is of type xs:token, we won't bother to
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * check it.
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* REMOVED:
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "version");
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr,
965360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val);
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "targetNamespace");
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrNode(ctxt, NULL, attr,
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "elementFormDefault");
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_QUALIF_ELEM);
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_ELEMFORMDEFAULT_VALUE,
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(qualified | unqualified)", val, NULL, NULL, NULL);
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "attributeFormDefault");
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_QUALIF_ATTR);
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_ATTRFORMDEFAULT_VALUE,
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(qualified | unqualified)", val, NULL, NULL, NULL);
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "finalDefault");
9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1,
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_LIST,
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_UNION);
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(#all | List of (extension | restriction | list | union))",
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "blockDefault");
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
971360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(#all | List of (extension | restriction | substitution))",
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldErrs != ctxt->nberrors)
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = ctxt->err;
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSchemaTopLevel:
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schemas
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  the list of top level nodes
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML Schema structure built from the resource or
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlSchemaPtr schema, xmlNodePtr nodes)
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, oldErrs, tmpOldErrs;
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL))
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldErrs = ctxt->nberrors;
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = nodes;
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((IS_SCHEMA(child, "include")) ||
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "import")) ||
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "redefine")) ||
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "annotation"))) {
9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->annot == NULL)
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->annot = annot;
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeAnnot(annot);
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "import")) {
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseImport(ctxt, schema, child);
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
977460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		goto exit;
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "include")) {
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseInclude(ctxt, schema, child);
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
978160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		goto exit;
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "redefine")) {
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseRedefine(ctxt, schema, child);
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: Change the functions to return int results.
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We need especially to catch internal errors.
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "complexType")) {
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseComplexType(ctxt, schema, child, 1);
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "simpleType")) {
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseSimpleType(ctxt, schema, child, 1);
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "element")) {
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseElement(ctxt, schema, child, NULL, 1);
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "attribute")) {
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseGlobalAttribute(ctxt, schema, child);
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "attributeGroup")) {
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child);
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "group")) {
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseModelGroupDefinition(ctxt, schema, child);
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "notation")) {
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseNotation(ctxt, schema, child);
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, child->parent, child,
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "((include | import | redefine | annotation)*, "
9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(((simpleType | complexType | group | attributeGroup) "
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"| element | attribute | notation), annotation*)*)");
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "annotation")) {
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: We should add all annotations.
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->annot == NULL)
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->annot = annot;
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeAnnot(annot);
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = NULL;
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldErrs != ctxt->nberrors)
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = ctxt->err;
9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSchemaRelationPtr
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationCreate(void)
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr ret;
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSchemaRelationPtr)
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaSchemaRelation));
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL);
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSchemaRelation));
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(rel);
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr prev;
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (redef != NULL) {
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = redef;
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	redef = redef->next;
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prev);
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * After the construction context has been freed, there will be
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * no schema graph available any more. Only the schema buckets
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * will stay alive, which are put into the "schemasImports" and
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "includes" slots of the xmlSchema.
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->buckets != NULL)
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(con->buckets);
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->pending != NULL)
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(con->pending);
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->substGroups != NULL)
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(con->substGroups,
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->redefs != NULL)
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaRedefListFree(con->redefs);
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->dict != NULL)
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictFree(con->dict);
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(con);
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
990660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlSchemaConstructionCtxtPtr
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaConstructionCtxtCreate(xmlDictPtr dict)
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaConstructionCtxtPtr ret;
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaConstructionCtxtPtr)
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaConstructionCtxt));
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(NULL,
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating schema construction context", NULL);
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaConstructionCtxt));
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buckets = xmlSchemaItemListCreate();
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->buckets == NULL) {
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating list of schema buckets", NULL);
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->pending = xmlSchemaItemListCreate();
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->pending == NULL) {
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating list of pending global components", NULL);
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ret);
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = dict;
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictReference(dict);
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParserCtxtPtr
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtCreate(void)
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt));
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(NULL, "allocating schema parser context",
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL);
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaParserCtxt));
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_CTXT_PARSER;
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->attrProhibs = xmlSchemaItemListCreate();
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->attrProhibs == NULL) {
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewParserCtxtUseDict:
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: the dictionary to be used
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that file/resource expected
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParserCtxtPtr
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict)
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
997660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = dict;
997960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlDictReference(dict);
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL != NULL)
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1);
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->pctxt == NULL) {
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (vctxt->schema != NULL)
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->pctxt =
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict);
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->pctxt = xmlSchemaNewParserCtxt("*");
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->pctxt == NULL) {
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt",
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to create a temp. parser context");
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Pass user data. */
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->warning, vctxt->errCtxt);
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->errCtxt);
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetSchemaBucket:
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the schema parser context
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schemaLocation: the URI of the schema document
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a schema bucket if it was already parsed.
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a schema bucket if it was already parsed from
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @schemaLocation, NULL otherwise.
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *schemaLocation)
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Pointer comparison! */
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->schemaLocation == schemaLocation)
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *schemaLocation,
10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *targetNamespace)
10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Pointer comparison! */
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->origTargetNamespace == NULL) &&
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->schemaLocation == schemaLocation) &&
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->targetNamespace == targetNamespace))
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BAD_SCHEMA_DOC(b) \
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *targetNamespace,
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int imported)
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((! IS_BAD_SCHEMA_DOC(cur)) &&
10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->origTargetNamespace == targetNamespace) &&
10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((imported && cur->imported) ||
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((!imported) && (!cur->imported))))
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPtr schema,
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBucketPtr bucket)
10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldFlags;
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr oldDoc;
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, oldErrs;
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
1010460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1010560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save old values; reset the *main* schema.
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: This is not good; move the per-document information
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the parser. Get rid of passing the main schema to the
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * parsing functions.
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldFlags = schema->flags;
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldDoc = schema->doc;
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags != 0)
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearSchemaDefaults(schema);
1011560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    schema->doc = bucket->doc;
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->schema = schema;
1011760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Keep the current target namespace on the parser *not* on the
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * main schema.
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->targetNamespace = bucket->targetNamespace;
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket->targetNamespace != NULL) &&
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We are parsing the schema for schemas!
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isS4S = 1;
1013060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Mark it as parsed, even if parsing fails. */
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    bucket->parsed++;
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Compile the schema doc. */
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = xmlDocGetRootElement(bucket->doc);
10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParseSchemaElement(pctxt, schema, node);
10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* An empty schema; just get out. */
10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL)
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldErrs = pctxt->nberrors;
10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children);
10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Not nice, but I'm not 100% sure we will get always an error
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * as a result of the obove functions; so better rely on pctxt->err
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * as well.
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (oldErrs != pctxt->nberrors)) {
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = pctxt->err;
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1015460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Restore schema values. */
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema->doc = oldDoc;
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema->flags = oldFlags;
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPtr schema,
10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBucketPtr bucket)
10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr newpctxt;
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0;
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->parsed) {
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "reparsing a schema doc");
10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->doc == NULL) {
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "parsing a schema doc, but there's no doc");
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->constructor == NULL) {
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no constructor");
10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1018760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create and init the temporary parser context. */
10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt = xmlSchemaNewParserCtxtUseDict(
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) bucket->schemaLocation, pctxt->dict);
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (newpctxt == NULL)
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->constructor = pctxt->constructor;
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1019560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * TODO: Can we avoid that the parser knows about the main schema?
10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * It would be better if he knows about the current schema bucket
10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * only.
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->schema = schema;
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->errCtxt);
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->errCtxt);
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->counter = pctxt->counter;
1020560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket);
1020860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Channel back errors and cleanup the temporary parser context. */
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->err = res;
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->nberrors += newpctxt->nberrors;
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->counter = newpctxt->counter;
1021460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    newpctxt->constructor = NULL;
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Free the parser context. */
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeParserCtxt(newpctxt);
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaSchemaRelationPtr rel)
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr cur = bucket->relations;
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bucket->relations = rel;
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->next != NULL)
10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = rel;
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location,
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr ctxtNode)
1023960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Build an absolue location URI.
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1024360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (location != NULL) {
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxtNode == NULL)
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(location);
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *base, *URI;
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *ret = NULL;
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (base == NULL) {
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		URI = xmlBuildURI(location, ctxtNode->doc->URL);
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		URI = xmlBuildURI(location, base);
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(base);
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (URI != NULL) {
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlDictLookup(dict, URI, -1);
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(URI);
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1026660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddSchemaDoc:
10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema validation context
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an included (and to-be-redefined) XML schema document.
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, a positive error code on errors and
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in case of an internal or API error.
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int type, /* import or include or redefine */
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *schemaLocation,
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr schemaDoc,
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const char *schemaBuffer,
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int schemaBufferLen,
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr invokingNode,
1028960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar *sourceTargetNamespace,
1029060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar *importNamespace,
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketPtr *bucket)
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace = NULL;
10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr relation = NULL;
10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc = NULL;
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, err = 0, located = 0, preserveDoc = 0;
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bkt = NULL;
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket != NULL)
10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*bucket = NULL;
1030160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_IMPORT:
10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_MAIN:
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_IMPORT;
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_INCLUDE:
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_INCLUDE;
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_REDEFINE:
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_REDEFINE;
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1031360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1031460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Special handling for the main schema:
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * skip the location and relation logic and just parse the doc.
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We need just a bucket to be returned in this case.
1031960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
1032160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	goto doc_load;
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1032360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Note that we expect the location to be an absulute URI. */
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaLocation != NULL) {
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bkt != NULL) &&
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (pctxt->constructor->bucket == bkt)) {
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Report self-imports/inclusions/redefinitions. */
1032960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		invokingNode, NULL,
10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema must not import/include/redefine itself",
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a relation for the graph of schemas.
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    relation = xmlSchemaSchemaRelationCreate();
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (relation == NULL)
1034260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	relation);
10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    relation->type = type;
10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save the namespace import information.
10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
1035160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	relation->importNamespace = importNamespace;
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaLocation == NULL) {
10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * No location; this is just an import of the namespace.
10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that we don't assign a bucket to the relation
10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * in this case.
10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	targetNamespace = importNamespace;
10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Did we already fetch the doc? */
1036460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (bkt != NULL) {
10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) {
10366df143a5041f03a22808b59c76698770b74692815Selim Gurun	    /*
10367df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * We included/redefined and then try to import a schema,
10368df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * but the new location provided for import was different.
10369df143a5041f03a22808b59c76698770b74692815Selim Gurun	    */
10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schemaLocation == NULL)
10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation = BAD_CAST "in_memory_buffer";
10372df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (!xmlStrEqual(schemaLocation,
10373df143a5041f03a22808b59c76698770b74692815Selim Gurun		bkt->schemaLocation)) {
10374df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10375df143a5041f03a22808b59c76698770b74692815Selim Gurun		    invokingNode, NULL,
10376df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The schema document '%s' cannot be imported, since "
10377df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "it was already included or redefined",
10378df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
10379df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit;
10380df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) {
10382df143a5041f03a22808b59c76698770b74692815Selim Gurun	    /*
10383df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * We imported and then try to include/redefine a schema,
10384df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * but the new location provided for the include/redefine
10385df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * was different.
10386df143a5041f03a22808b59c76698770b74692815Selim Gurun	    */
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schemaLocation == NULL)
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation = BAD_CAST "in_memory_buffer";
10389df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (!xmlStrEqual(schemaLocation,
10390df143a5041f03a22808b59c76698770b74692815Selim Gurun		bkt->schemaLocation)) {
10391df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10392df143a5041f03a22808b59c76698770b74692815Selim Gurun		    invokingNode, NULL,
10393df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The schema document '%s' cannot be included or "
10394df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "redefined, since it was already imported",
10395df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
10396df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit;
10397df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
1039860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1040060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Given that the schemaLocation [attribute] is only a hint, it is open
10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to applications to ignore all but the first <import> for a given
1040560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* namespace, regardless of the �actual value� of schemaLocation, but
10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* such a strategy risks missing useful information when new
10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* schemaLocations are offered.
10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We will use the first <import> that comes with a location.
10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Further <import>s *with* a location, will result in an error.
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Better would be to just report a warning here, but
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we'll try it this way until someone complains.
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Schema Document Location Strategy:
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3 Based on the namespace name, identify an existing schema document,
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* either as a resource which is an XML document or a <schema> element
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* information item, in some local schema repository;
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 5 Attempt to resolve the namespace name to locate such a resource.
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: (3) and (5) are not supported.
1042160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL) {
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    importNamespace, 1);
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1042960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (bkt != NULL) {
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bkt->schemaLocation == NULL) {
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* First given location of the schema; load the doc. */
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt->schemaLocation = schemaLocation;
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(schemaLocation,
10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bkt->schemaLocation)) {
10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Additional location given; just skip it.
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * URGENT TODO: We should report a warning here.
10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * res = XML_SCHEMAP_SRC_IMPORT;
10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (schemaLocation == NULL)
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			schemaLocation = BAD_CAST "in_memory_buffer";
10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_SKIP_SCHEMA,
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			invokingNode, NULL,
10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping import of schema located at '%s' for the "
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"namespace '%s', since this namespace was already "
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"imported with the schema located at '%s'",
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			schemaLocation, importNamespace, bkt->schemaLocation);
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1045560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1045660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* No bucket + first location: load the doc and create a
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* bucket.
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <include> and <redefine> */
10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL) {
1046360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((bkt->origTargetNamespace == NULL) &&
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(bkt->targetNamespace != sourceTargetNamespace)) {
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketPtr chamel;
1046760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Chameleon include/redefine: skip loading only if it was
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* aleady build for the targetNamespace of the including
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* schema.
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO: If the schema is a chameleon-include then copy
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the components into the including schema and modify the
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* targetNamespace of those components, do nothing otherwise.
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE: This is currently worked-around by compiling the
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chameleon for every destinct including targetNamespace; thus
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* not performant at the moment.
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check when the namespace in wildcards for chameleons
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* needs to be converted: before we built wildcard intersections
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* or after.
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   Answer: after!
10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, sourceTargetNamespace);
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (chamel != NULL) {
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* A fitting chameleon was already parsed; NOP. */
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    relation->bucket = chamel;
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit;
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1049260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		/*
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to parse the chameleon again for a different
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* targetNamespace.
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* CHAMELEON TODO: Optimize this by only parsing the
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chameleon once, and then copying the components to
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the new targetNamespace.
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt = NULL;
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		relation->bucket = bkt;
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
1050360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bkt != NULL) && (bkt->doc != NULL)) {
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaAddSchemaDoc",
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "trying to load a schema doc, but a doc is already "
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "assigned to the schema bucket");
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdoc_load:
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Load the document.
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaDoc != NULL) {
10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	doc = schemaDoc;
10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Don' free this one, since it was provided by the caller. */
10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	preserveDoc = 1;
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Does the context or the doc hold the location? */
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaDoc->URL != NULL)
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation = xmlDictLookup(pctxt->dict,
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaDoc->URL, -1);
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation = BAD_CAST "in_memory_buffer";
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) {
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlParserCtxtPtr parserCtxt;
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	parserCtxt = xmlNewParserCtxt();
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parserCtxt == NULL) {
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, "
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating a parser context", NULL);
10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) {
10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Do we have to burden the schema parser dict with all
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the content of the schema doc?
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictFree(parserCtxt->dict);
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parserCtxt->dict = pctxt->dict;
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictReference(parserCtxt->dict);
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaLocation != NULL) {
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Parse from file. */
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation,
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, SCHEMAS_PARSE_OPTIONS);
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (schemaBuffer != NULL) {
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Parse from memory buffer. */
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen,
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, SCHEMAS_PARSE_OPTIONS);
10553df143a5041f03a22808b59c76698770b74692815Selim Gurun	    schemaLocation = BAD_CAST "in_memory_buffer";
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (doc != NULL)
10555df143a5041f03a22808b59c76698770b74692815Selim Gurun		doc->URL = xmlStrdup(schemaLocation);
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For <import>:
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.1 The referent is (a fragment of) a resource which is an
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML document (see clause 1.1), which in turn corresponds to
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a <schema> element information item in a well-formed information
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* set, which in turn corresponds to a valid schema.
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: (2.1) fragments of XML documents are not supported.
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.2 The referent is a <schema> element information item in
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a well-formed information set, which in turn corresponds
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to a valid schema.
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: (2.2) is not supported.
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (doc == NULL) {
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlErrorPtr lerr;
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lerr = xmlGetLastError();
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check if this a parser error, or if the document could
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * just not be located.
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Try to find specific error codes to react only on
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * localisation failures.
10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) {
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We assume a parser error here.
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		located = 1;
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Error code ?? */
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = XML_SCHEMAP_SRC_IMPORT_2_1;
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    invokingNode, NULL,
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Failed to parse the XML resource '%s'",
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, NULL);
10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeParserCtxt(parserCtxt);
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((doc == NULL) && located)
10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(pctxt, NULL,
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NOTHING_TO_PARSE,
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No information for parsing was provided with the "
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "given schema parser context.\n",
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Preprocess the document.
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc != NULL) {
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr docElem = NULL;
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1060960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	located = 1;
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	docElem = xmlDocGetRootElement(doc);
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (docElem == NULL) {
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT,
1061360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		invokingNode, NULL,
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The document '%s' has no document element",
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Remove all the blank text nodes.
10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCleanupDoc(pctxt, docElem);
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check the schema's top level element.
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_SCHEMA(docElem, "schema")) {
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA,
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		invokingNode, NULL,
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The XML document '%s' is not a schema document",
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1063260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we don't apply a type check for the
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace value here.
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	targetNamespace = xmlSchemaGetProp(pctxt, docElem,
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "targetNamespace");
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1063960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* after_doc_loading: */
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bkt == NULL) && located) {
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Only create a bucket if the schema was located. */
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        bkt = xmlSchemaBucketCreate(pctxt, type,
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    targetNamespace);
10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt == NULL)
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bkt != NULL) {
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt->schemaLocation = schemaLocation;
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt->located = located;
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (doc != NULL) {
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = doc;
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->targetNamespace = targetNamespace;
10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->origTargetNamespace = targetNamespace;
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (preserveDoc)
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt->preserveDoc = 1;
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_IMPMAIN(type))
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->imported++;
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add it to the graph of schemas.
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (relation != NULL)
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1066660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Return the bucket explicitely; this is needed for the
10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * main schema.
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket != NULL)
1067360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*bucket = bkt;
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((doc != NULL) && (! preserveDoc)) {
10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(doc);
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL)
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = NULL;
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((doc != NULL) && (! preserveDoc)) {
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(doc);
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL)
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = NULL;
1068960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseImport:
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Import definition
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, a positive error code if
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not valid and -1 in case of an internal error.
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlNodePtr node)
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *namespaceName = NULL, *schemaLocation = NULL;
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *thisTargetNamespace;
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttr(pctxt, NULL, node,
10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&namespaceName) != 0) {
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, namespaceName, NULL, NULL, NULL);
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (pctxt->err);
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttr(pctxt, NULL, node,
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&schemaLocation) != 0) {
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, namespaceName, NULL, NULL, NULL);
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (pctxt->err);
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * the annotation here is simply discarded ...
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * TODO: really?
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply additional constraints.
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that it is important to use the original @targetNamespace
10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (or none at all), to rule out imports of schemas _with_ a
10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @targetNamespace if the importing schema is a chameleon schema
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (with no @targetNamespace).
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespaceName != NULL) {
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1078960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 1.1 If the namespace [attribute] is present, then its �actual value�
1079060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* must not match the �actual value� of the enclosing <schema>'s
10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace [attribute].
10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(thisTargetNamespace, namespaceName)) {
10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_IMPORT_1_1,
10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the attribute 'namespace' must not match "
10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the target namespace '%s' of the importing schema",
10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		thisTargetNamespace);
10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (pctxt->err);
10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.2 If the namespace [attribute] is not present, then the enclosing
10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <schema> must have a targetNamespace [attribute].
10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (thisTargetNamespace == NULL) {
10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_IMPORT_1_2,
10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'namespace' must be existent if "
10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the importing schema has no target namespace",
10813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
10814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (pctxt->err);
10815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Locate and acquire the schema document.
10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaLocation != NULL)
10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation, node);
10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schemaLocation, NULL, NULL, 0, node, thisTargetNamespace,
10825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	namespaceName, &bucket);
10826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
10829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For <import>: "It is *not* an error for the application
10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schema reference strategy to fail."
10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * So just don't parse if no schema document was found.
10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we will get no bucket if the schema could not be
10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * located or if there was no schemaLocation.
10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) && (schemaLocation != NULL)) {
10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA,
10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node, NULL,
10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Failed to locate a schema at location '%s'. "
10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Skipping the import", schemaLocation, NULL, NULL);
10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1084460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1084560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) {
10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaParseNewDoc(pctxt, schema, bucket);
10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1084860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaPtr schema,
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlNodePtr node,
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlChar **schemaLocation,
10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     int type)
10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL) ||
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(schemaLocation == NULL))
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *schemaLocation = NULL;
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Applies for both <include> and <redefine>.
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Preliminary step, extract the URI-Reference and make an URI
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * from the base.
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "schemaLocation" is mandatory.
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "schemaLocation");
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlChar *base = NULL;
10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlChar *uri = NULL;
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const xmlChar **) schemaLocation) != 0)
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	base = xmlNodeGetBase(node->doc, node);
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base == NULL) {
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    uri = xmlBuildURI(*schemaLocation, node->doc->URL);
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    uri = xmlBuildURI(*schemaLocation, base);
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(base);
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uri == NULL) {
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaParseIncludeOrRedefine",
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"could not build an URI from the schemaLocation")
10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1);
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(uri);
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "schemaLocation", NULL);
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Report self-inclusion and self-redefinition.
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(*schemaLocation, pctxt->URL)) {
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE,
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema document '%s' cannot redefine itself.",
1093060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*schemaLocation);
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_INCLUDE,
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema document '%s' cannot include itself.",
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*schemaLocation);
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1094060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node,
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				int type)
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *schemaLocation = NULL;
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0; /* hasRedefinitions = 0 */
10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isChameleon = 0, wasChameleon = 0;
10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse attributes. Note that the returned schemaLocation will
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be already converted to an absolute URI.
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema,
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, (xmlChar **) (&schemaLocation), type);
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
1097060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(res);
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Load and add the schema document.
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL,
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, 0, node, pctxt->targetNamespace, NULL, &bucket);
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
1097760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(res);
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If we get no schema bucket back, then this means that the schema
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * document could not be located or was broken XML or was not
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a schema document.
1098260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (bucket->doc == NULL)) {
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_INCLUDE) {
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * WARNING for <include>:
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will raise an error if the schema cannot be located
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * for inclusions, since the that was the feedback from the
10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schema people. I.e. the following spec piece will *not* be
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * satisfied:
1099160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * SPEC src-include: "It is not an error for the �actual value� of the
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schemaLocation [attribute] to fail to resolve it all, in which
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * case no corresponding inclusion is performed.
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * So do we need a warning report here?"
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = XML_SCHEMAP_SRC_INCLUDE;
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to load the document '%s' for inclusion",
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: This was changed to raise an error even if no redefinitions
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are specified.
11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-redefine (1)
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If there are any element information items among the [children]
1100860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * other than <annotation> then the �actual value� of the
11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schemaLocation [attribute] must successfully resolve."
11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Ask the WG if a the location has always to resolve
11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * here as well!
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = XML_SCHEMAP_SRC_REDEFINE;
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to load the document '%s' for redefinition",
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check targetNamespace sanity before parsing the new schema.
11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Note that we won't check further content if the
11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace was bad.
1102460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
1102560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (bucket->origTargetNamespace != NULL) {
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-include (2.1)
1102860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "SII has a targetNamespace [attribute], and its �actual
1102960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * value� is identical to the �actual value� of the targetNamespace
1103060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * [attribute] of SII� (which must have such an [attribute])."
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pctxt->targetNamespace == NULL) {
11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_INCLUDE,
11035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node, NULL,
11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The target namespace of the included/redefined schema "
11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'%s' has to be absent, since the including/redefining "
11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "schema has no target namespace",
11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, NULL);
11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_error;
11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (!xmlStrEqual(bucket->origTargetNamespace,
11042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->targetNamespace)) {
11043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Change error function. */
11044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(pctxt,
11045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_INCLUDE,
11046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node,
11047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The target namespace '%s' of the included/redefined "
11048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "schema '%s' differs from '%s' of the "
11049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "including/redefining schema",
11050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bucket->origTargetNamespace, schemaLocation,
11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->targetNamespace);
11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_error;
11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1105460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (pctxt->targetNamespace != NULL) {
11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Chameleons: the original target namespace will
11057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * differ from the resulting namespace.
11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isChameleon = 1;
11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bucket->parsed &&
11061df143a5041f03a22808b59c76698770b74692815Selim Gurun		bucket->origTargetNamespace != NULL) {
11062df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt,
11063df143a5041f03a22808b59c76698770b74692815Selim Gurun		    XML_SCHEMAP_SRC_INCLUDE,
11064df143a5041f03a22808b59c76698770b74692815Selim Gurun		    node, NULL,
11065df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The target namespace of the included/redefined schema "
11066df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "'%s' has to be absent or the same as the "
11067df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "including/redefining schema's target namespace",
11068df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
11069df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit_error;
11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bucket->targetNamespace = pctxt->targetNamespace;
11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1107360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the schema.
1107660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) {
11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isChameleon) {
11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Get rid of this flag on the schema itself. */
11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		wasChameleon = 1;
11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParseNewDoc(pctxt, schema, bucket);
11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Restore chameleon flag. */
11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isChameleon && (!wasChameleon))
11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1109360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    child = node->children;
1109460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse (simpleType | complexType | group | attributeGroup))*
11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefined = bucket;
11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* How to proceed if the redefined schema was not located?
11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isRedefine = 1;
11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "annotation") ||
11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "simpleType") ||
11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "complexType") ||
11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "group") ||
11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "attributeGroup")) {
11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "annotation")) {
11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: discard or not?
11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "simpleType")) {
11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(pctxt, schema, child, 1);
11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "complexType")) {
11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseComplexType(pctxt, schema, child, 1);
11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
1111760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    } else if (IS_SCHEMA(child, "group")) {
11118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefinition(pctxt,
11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schema, child);
11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "attributeGroup")) {
11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAttributeGroupDefinition(pctxt, schema,
11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child);
11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefined = NULL;
11129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isRedefine = 0;
11130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: discard or not?
11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1113760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED;
11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt, res,
11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation | (simpleType | complexType | group | attributeGroup))*");
11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPContentErr(pctxt, res,
11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?)");
1114860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1114960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef ENABLE_REDEFINE
11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_SCHEMA_REDEFINE);
11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_SCHEMA_INCLUDE);
11180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroup:
11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the "compositor" type
11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particleNeeded: if a a model group with a particle
11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Sequence definition.
11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies parts of:
11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Schema Representation Constraint:
11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     Redefinition Constraints and Semantics (src-redefine)
11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (6.1), (6.1.1), (6.1.2)
11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1119960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *   Schema Component Constraint:
11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     All Group Limited (cos-all-limited) (2)
11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     TODO: Actually this should go to component-level checks,
11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     but is done here due to performance. Move it to an other layer
11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     is schema construction via an API is implemented.
11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node, xmlSchemaTypeType type,
11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int withParticle)
11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr item;
11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = NULL;
11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min = 1, max = 1, isElemRef, hasRefs = 0;
11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a model group with the given compositor.
11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddModelGroup(ctxt, schema, type, node);
11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (withParticle) {
11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_TYPE_ALL) {
11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)");
11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1");
11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* choice + sequence */
11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(xs:nonNegativeInteger | unbounded)");
11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a particle
11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = xmlSchemaAddParticle(ctxt, node, min, max);
11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle == NULL)
11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) item;
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		    (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) {
11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == XML_SCHEMA_TYPE_ALL) {
11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part, last = NULL;
11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "element")) {
11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema, child, &isElemRef, 0);
11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC cos-all-limited (2)
11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "The {max occurs} of all the particles in the {particles}
11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the ('all') group must be 0 or 1.
11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part != NULL) {
11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (isElemRef)
11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part->minOccurs > 1) {
11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, child,
11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Invalid value for minOccurs (must be 0 or 1)",
11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Reset to 1. */
11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part->minOccurs = 1;
11319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part->maxOccurs > 1) {
11321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
11322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, child,
11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Invalid value for maxOccurs (must be 0 or 1)",
11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Reset to 1. */
11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part->maxOccurs = 1;
11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->children = (xmlSchemaTreeItemPtr) part;
11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = (xmlSchemaTreeItemPtr) part;
11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = part;
11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (annotation?, element*)");
11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* choice + sequence */
11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr part = NULL, last = NULL;
11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "element")) ||
11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "group")) ||
11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "any")) ||
11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "choice")) ||
11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "sequence"))) {
11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "element")) {
11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = (xmlSchemaTreeItemPtr)
11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0);
11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part && isElemRef)
11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "group")) {
11359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part =
11360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part != NULL)
11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle redefinitions.
11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->isRedefine && ctxt->redef &&
11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part && part->children)
11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((xmlSchemaGetQNameRefName(part->children) ==
11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->redef->refName) &&
11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaGetQNameRefTargetNs(part->children) ==
11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->redef->refTargetNs))
11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC src-redefine:
11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (6.1) "If it has a <group> among its contents at
1137860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* some level the �actual value� of whose ref
1137960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* [attribute] is the same as the �actual value� of
11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* its own name attribute plus target namespace, then
11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* all of the following must be true:"
11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (6.1.1) "It must have exactly one such group."
11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->redefCounter != 0) {
11385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *str = NULL;
11386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
11388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The redefining model group definition "
11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"'%s' must not contain more than one "
11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"reference to the redefined definition",
11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaFormatQName(&str,
11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refTargetNs,
11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refName),
11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    part = NULL;
11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ((WXS_PARTICLE(part))->maxOccurs != 1))
11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *str = NULL;
11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * SPEC src-redefine:
1140460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * (6.1.2) "The �actual value� of both that
11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * group's minOccurs and maxOccurs [attribute]
1140660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * must be 1 (or �absent�).
11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The redefining model group definition "
11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"'%s' must not contain a reference to the "
11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"redefined definition with a "
11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"maxOccurs/minOccurs other than 1",
11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaFormatQName(&str,
11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refTargetNs,
11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refName),
11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    part = NULL;
11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->redef->reference = WXS_BASIC_CAST part;
11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->redefCounter++;
1142360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "any")) {
11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = (xmlSchemaTreeItemPtr)
11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseAny(ctxt, schema, child);
11428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "choice")) {
11429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = xmlSchemaParseModelGroup(ctxt, schema, child,
11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_CHOICE, 1);
11431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "sequence")) {
11432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = xmlSchemaParseModelGroup(ctxt, schema, child,
11433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part != NULL) {
11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->children = part;
11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = part;
11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = part;
11441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (element | group | choice | sequence | any)*)");
11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max == 0) && (min == 0))
11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasRefs) {
11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need to resolve references.
11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, item);
11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (withParticle)
1146060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return ((xmlSchemaTreeItemPtr) particle);
11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaTreeItemPtr) item);
11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseRestriction:
11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Restriction definition
11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlNodePtr node, xmlSchemaTypeType parentType)
11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1151260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Attribute
11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract the base type. The "base" attribute is mandatory if inside
11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a complex type or if redefining.
11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1.2) "...otherwise (<restriction> has no <simpleType> "
11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * among its [children]), the simple type definition which is
1152060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the {content type} of the type definition �resolved� to by
1152160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the �actual value� of the base [attribute]"
11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base",
11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&(type->baseNs), &(type->base)) == 0)
11525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
11526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) {
11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "base", NULL);
11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((ctxt->isRedefine) &&
11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->flags & XML_SCHEMAS_TYPE_GLOBAL))
11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
11533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->base == NULL) {
11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPMissingAttrErr(ctxt,
11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_MISSING,
11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, "base", NULL);
11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((! xmlStrEqual(type->base, type->name)) ||
11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(! xmlStrEqual(type->baseNs, type->targetNamespace)))
11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
11540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str1 = NULL, *str2 = NULL;
11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* REDEFINE: SPEC src-redefine (5)
11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "Within the [children], each <simpleType> must have a
1154460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* <restriction> among its [children] ... the �actual value� of
1154560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* whose base [attribute] must be the same as the �actual value�
11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of its own name attribute plus target namespace;"
11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE,
11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, "This is a redefinition, but the QName "
11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "value '%s' of the 'base' attribute does not match the "
11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type's designation '%s'",
11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str1, type->baseNs, type->base),
11553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str2, type->targetNamespace,
11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->name), NULL);
11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str1);
11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str2);
11557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Avoid confusion and erase the values. */
11558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->base = NULL;
11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->baseNs = NULL;
11560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1156160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the simple type ancestor.
11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><restriction><simpleType>.
11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "simpleType")) {
11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->base != NULL) {
11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* src-restriction-base-or-simpleType
11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Either the base [attribute] or the simpleType [child] of the
11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <restriction> element must be present, but not both.
11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
11589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'base' and the <simpleType> child are "
11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->baseType = (xmlSchemaTypePtr)
11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseSimpleType(ctxt, schema, child, 0);
11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (type->base == NULL) {
11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Either the attribute 'base' or a <simpleType> child "
11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be present", NULL);
11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent><restriction>...
11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* followed by:
11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model groups <all>, <choice> and <sequence>.
11609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "all")) {
11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL, 1);
11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "choice")) {
11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt,
11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schema, child, XML_SCHEMA_TYPE_CHOICE, 1);
11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "sequence")) {
11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model group reference <group>.
11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1162860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (IS_SCHEMA(child, "group")) {
11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
11633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent><restriction>...
11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "1.1 the simple type definition corresponding to the <simpleType>
11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* among the [children] of <restriction> if there is one;"
11643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "simpleType")) {
11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will store the to-be-restricted simple type in
11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type->contentTypeDef *temporarily*.
11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = (xmlSchemaTypePtr)
11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( type->contentTypeDef == NULL)
11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr facet, lastfacet = NULL;
11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent><restriction>...
11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <simpleType><restriction>...
11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the facets to the simple type ancestor.
11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Datatypes: 4.1.3 Constraints on XML Representation of
11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Simple Type Definition Schema Representation Constraint:
11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* *Single Facet Value*
11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "minInclusive")) ||
11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "minExclusive")) ||
11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxInclusive")) ||
11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxExclusive")) ||
11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "totalDigits")) ||
11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "fractionDigits")) ||
11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "pattern")) ||
11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "enumeration")) ||
11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "whiteSpace")) ||
11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "length")) ||
11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxLength")) ||
11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "minLength"))) {
11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = xmlSchemaParseFacet(ctxt, schema, child);
11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet != NULL) {
11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastfacet == NULL)
11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->facets = facet;
11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastfacet->next = facet;
11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastfacet = facet;
11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastfacet->next = NULL;
11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create links for derivation and validation.
11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->facets != NULL) {
11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL;
11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = type->facets;
11703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink = (xmlSchemaFacetLinkPtr)
11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlMalloc(sizeof(xmlSchemaFacetLink));
11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facetLink == NULL) {
11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL);
11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(facetLink);
11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (NULL);
11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink->facet = facet;
11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink->next = NULL;
11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastFacetLink == NULL)
11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->facetSet = facetLink;
11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastFacetLink->next = facetLink;
11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastFacetLink = facetLink;
11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = facet->next;
11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (facet != NULL);
11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_COMPLEX) {
11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute uses/declarations.
11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute wildcard.
11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attributeWildcard =
11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAnyAttribute(ctxt, schema, child);
11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"annotation?, (group | all | choice | sequence)?, "
11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"((attribute | attributeGroup)*, anyAttribute?))");
11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPContentErr(ctxt,
11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"length | minLength | maxLength | enumeration | whiteSpace | "
11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Simple type */
11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"length | minLength | maxLength | enumeration | whiteSpace | "
11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pattern)*))");
11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseExtension:
11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses an <extension>, which is found inside a
11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <simpleContent> or <complexContent>.
11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change.
11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Returns the type definition or NULL in case of error
11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
11781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr node, xmlSchemaTypeType parentType)
11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "base" - mandatory.
11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node,
11818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"base", &(type->baseNs), &(type->base)) == 0) &&
11819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->base == NULL)) {
11820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
11821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
11822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "base", NULL);
11823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the type ancestor.
11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent><extension>... and:
11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model groups <all>, <choice>, <sequence> and <group>.
11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "all")) {
11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child, XML_SCHEMA_TYPE_ALL, 1);
11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "choice")) {
11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child, XML_SCHEMA_TYPE_CHOICE, 1);
11851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "sequence")) {
11853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child, XML_SCHEMA_TYPE_SEQUENCE, 1);
11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "group")) {
11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute uses/declarations.
11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_EXTENSION, NULL) == -1)
11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute wildcard.
11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->ctxtType->attributeWildcard =
11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAnyAttribute(ctxt, schema, child);
11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Complex content extension. */
11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, ((group | all | choice | sequence)?, "
11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"((attribute | attributeGroup)*, anyAttribute?)))");
11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Simple content extension. */
11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, ((attribute | attributeGroup)*, "
11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"anyAttribute?))");
11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSimpleContent:
11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema SimpleContent definition
11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
11917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSchemaPtr schema, xmlNodePtr node,
11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *hasRestrictionOrExtension)
11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(hasRestrictionOrExtension == NULL))
11926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *hasRestrictionOrExtension = 0;
11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) {
11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the complex type ancestor.
11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
11963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL, NULL,
1196660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "(annotation?, (restriction | extension))");
11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL, NULL,
1197260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "(annotation?, (restriction | extension))");
11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "restriction")) {
11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "extension")) {
11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseExtension(ctxt, schema, child,
11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | extension))");
11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseComplexContent:
11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema ComplexContent definition
12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlSchemaPtr schema, xmlNodePtr node,
12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int *hasRestrictionOrExtension)
12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(hasRestrictionOrExtension == NULL))
12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *hasRestrictionOrExtension = 0;
12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
12024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "mixed")))
12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Set the 'mixed' on the complex type ancestor.
12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlGetBooleanProp(ctxt, node, "mixed", 0))  {
12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_MIXED;
12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the complex type ancestor.
12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "restriction")) {
12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "extension")) {
12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseExtension(ctxt, schema, child,
12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseComplexType:
12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Complex Type definition
12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlNodePtr node, int topLevel)
12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type, ctxtType;
12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = NULL;
12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue;
12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
12110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char buf[40];
12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int final = 0, block = 0, hasRestrictionOrExtension = 0;
12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxtType = ctxt->ctxtType;
12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL);
12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1212960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel == 0) {
12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as local complex type definition.
12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1);
12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->targetNamespace, node, 0);
12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ctxt->targetNamespace, node, 0);
12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = type->name;
12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node = node;
12151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_COMPLEX;
12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We need the target namespace.
12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as global complex type definition.
12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name, ctxt->targetNamespace, node, 1);
12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node = node;
12165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_COMPLEX;
12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->targetNamespace = ctxt->targetNamespace;
12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle attributes.
12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->name, BAD_CAST "id")) {
12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attribute "id".
12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) {
12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attribute "mixed".
12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaPGetBoolNodeValue(ctxt,
12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr))
12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_MIXED;
12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (topLevel) {
12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attributes of global complex type definitions.
12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Pass. */
12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) {
12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "abstract".
12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPGetBoolNodeValue(ctxt,
12198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr))
12199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "final")) {
12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "final".
12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(ctxt,
12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPValAttrBlockFinal(attrValue,
12207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&(type->flags),
12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1,
12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_FINAL_EXTENSION,
12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1, -1, -1) != 0)
12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(ctxt,
12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr, NULL,
12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(#all | List of (extension | restriction))",
12217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
1221860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } else
12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			final = 1;
12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "block")) {
12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "block".
12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(ctxt,
12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1,
12228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1, -1, -1) != 0) {
12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(ctxt,
12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr, NULL,
12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(#all | List of (extension | restriction)) ",
12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
1223660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } else
12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			block = 1;
12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
12244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
1224760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaPIllegalAttrErr(ctxt,
12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! block) {
12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply default "block" values.
12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! final) {
12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply default "block" values.
12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = type;
12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleContent")) {
12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType><simpleContent>...
12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.4.3 : 2.2
12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Specifying mixed='true' when the <simpleContent>
12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* alternative is chosen has no effect
12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->flags & XML_SCHEMAS_TYPE_MIXED)
12287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags ^= XML_SCHEMAS_TYPE_MIXED;
12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseSimpleContent(ctxt, schema, child,
12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &hasRestrictionOrExtension);
12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "complexContent")) {
12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType><complexContent>...
12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_EMPTY;
12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseComplexContent(ctxt, schema, child,
12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &hasRestrictionOrExtension);
12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* E.g <complexType><sequence>... or <complexType><attribute>... etc.
12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC
12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "...the third alternative (neither <simpleContent> nor
12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexContent>) is chosen. This case is understood as shorthand
1230660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* for complex content restricting the �ur-type definition�, and the
12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* details of the mappings should be modified as necessary.
12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse model groups.
12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_SCHEMA(child, "all")) {
12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL, 1);
12318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "choice")) {
12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_CHOICE, 1);
12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "sequence")) {
12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
12328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "group")) {
12330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse attribute decls/refs.
12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse attribute wildcard.
12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child);
12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (simpleContent | complexContent | "
12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "((group | all | choice | sequence)?, ((attribute | "
12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "attributeGroup)*, anyAttribute?))))");
12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REDEFINE: SPEC src-redefine (5)
12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "This is a redefinition, thus the "
12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "<complexType> must have a <restriction> or <extension> "
12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "grand-child", NULL);
12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = ctxtType;
12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (type);
12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1237594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1237694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Validating using Schemas			*
1237794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1238194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1238294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Reading/Writing Schemas				*
1238394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* Will be enabled if it is clear what options are needed. */
12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParserCtxtSetOptions:
12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:	a schema parser context
12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of xmlSchemaParserOption
12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the options to be used during the parse.
12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of an
12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * API error.
12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int options)
12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * WARNING: Change the start value if adding to the
12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaParseOption.
12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < (int) sizeof(int) * 8; i++) {
12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (options & 1<<i) {
12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->options = options;
12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidCtxtGetOptions:
12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema parser context
12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the option combination of the parser context.
12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->options);
12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewParserCtxt:
12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that file/resource expected
12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewParserCtxt(const char *URL)
12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL == NULL)
12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
12457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1);
12458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewMemParserCtxt:
12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  a pointer to a char array containing the schemas
12464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the size of the array
12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that memory buffer expected
12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewMemParserCtxt(const char *buffer, int size)
12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (size <= 0))
12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = buffer;
12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->size = size;
1248360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->dict = xmlDictCreate();
12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewDocParserCtxt:
12489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a preparsed document tree
12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that document.
12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NB. The document may be modified during the parsing process.
12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewDocParserCtxt(xmlDocPtr doc)
12498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      return (NULL);
12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
12507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The application has responsibility for the document */
12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->preserve = 1;
12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeParserCtxt:
12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context
12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->doc != NULL && !ctxt->preserve)
1252660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        xmlFreeDoc(ctxt->doc);
12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL) {
12528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValidCtxt(ctxt->vctxt);
12529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) {
12531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ctxt->constructor);
12532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = NULL;
12533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 0;
12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->attrProhibs != NULL)
12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(ctxt->attrProhibs);
12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(ctxt->dict);
12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Building the content models			*
12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12547df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
12548df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSchemaBuildContentModelForSubstGroup:
12549df143a5041f03a22808b59c76698770b74692815Selim Gurun *
12550df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if nillable, 0 otherwise
12551df143a5041f03a22808b59c76698770b74692815Selim Gurun */
12552df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end)
12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr start, tmp;
12557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl, member;
12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr substGroup;
12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12560df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0;
12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl = (xmlSchemaElementPtr) particle->children;
12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Wrap the substitution group with a CHOICE.
12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = pctxt->state;
12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end = xmlAutomataNewState(pctxt->am);
12569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL) {
12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "declaration is marked having a subst. group but none "
12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "available.\n", elemDecl->name, NULL);
12576df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(0);
12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (counter >= 0) {
12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that we put the declaration in, even if it's abstract.
12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* However, an error will be raised during *validation* if an element
12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* information item shall be validated against an abstract element
12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* declaration.
12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter);
12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlAutomataNewTransition2(pctxt->am, tmp, end,
12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            elemDecl->name, elemDecl->targetNamespace, elemDecl);
12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add subst. group members.
12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAutomataNewTransition2(pctxt->am, tmp, end,
12594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		               member->name, member->targetNamespace, member);
12595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (particle->maxOccurs == 1) {
12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that we put the declaration in, even if it's abstract,
12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am,
12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewTransition2(pctxt->am,
12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start, NULL,
12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->name, elemDecl->targetNamespace, elemDecl), end);
12604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add subst. group members.
12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2()
12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  was incorrectly used instead of xmlAutomataNewTransition2()
12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL
12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  section in xmlSchemaBuildAContentModel() ).
1261460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * TODO: Check if xmlAutomataNewOnceTrans2() was instead
12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  intended for the above "counter" section originally. I.e.,
12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  check xs:all with subst-groups.
12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL,
12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	               member->name, member->targetNamespace,
12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *		       1, 1, member);
12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL,
1262360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		member->name, member->targetNamespace, member);
12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(pctxt->am, tmp, end);
12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataStatePtr hop;
12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    UNBOUNDED : particle->maxOccurs - 1;
12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	counter =
12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewCounter(pctxt->am, minOccurs,
12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    maxOccurs);
12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hop = xmlAutomataNewState(pctxt->am);
12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am,
12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewTransition2(pctxt->am,
12639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start, NULL,
12640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->name, elemDecl->targetNamespace, elemDecl),
12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hop);
12642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Add subst. group members.
12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
12645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(pctxt->am,
12648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewTransition2(pctxt->am,
12649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		start, NULL,
12650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member->name, member->targetNamespace, member),
12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hop);
12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
12654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
12655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12656df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (particle->minOccurs == 0) {
12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am, start, end);
12658df143a5041f03a22808b59c76698770b74692815Selim Gurun        ret = 1;
12659df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->state = end;
12661df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12664df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
12665df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSchemaBuildContentModelForElement:
12666df143a5041f03a22808b59c76698770b74692815Selim Gurun *
12667df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if nillable, 0 otherwise
12668df143a5041f03a22808b59c76698770b74692815Selim Gurun */
12669df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaParticlePtr particle)
12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12673df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0;
12674df143a5041f03a22808b59c76698770b74692815Selim Gurun
12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((xmlSchemaElementPtr) particle->children)->flags &
12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
12677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Substitution groups.
12679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12680df143a5041f03a22808b59c76698770b74692815Selim Gurun	ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL);
12681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr elemDecl;
12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataStatePtr start;
12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	elemDecl = (xmlSchemaElementPtr) particle->children;
12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
12688df143a5041f03a22808b59c76698770b74692815Selim Gurun	    return(0);
12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle->maxOccurs == 1) {
12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = ctxt->state;
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	} else if ((particle->maxOccurs >= UNBOUNDED) &&
12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (particle->minOccurs < 2)) {
12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Special case. */
1269660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    start = ctxt->state;
12697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
1269860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
1270060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
12702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int counter;
12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    UNBOUNDED : particle->maxOccurs - 1;
12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int minOccurs = particle->minOccurs < 1 ?
12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    0 : particle->minOccurs - 1;
12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter);
12713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, counter);
12715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12716df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (particle->minOccurs == 0) {
12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state);
12718df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
12719df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
12720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12721df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
12722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaBuildAContentModel:
12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle:  the particle component
12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the complex type's name whose content is being built
12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the automaton for the {content type} of a complex type.
12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12732df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if the content is nillable, 0 otherwise
12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12734df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr particle)
12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12738df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0, tmp2;
12739df143a5041f03a22808b59c76698770b74692815Selim Gurun
12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL) {
1274160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL");
12742df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(1);
12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children == NULL) {
12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Just return in this case. A missing "term" of the particle
12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* might arise due to an invalid "term" component.
12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12749df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(1);
12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (particle->children->type) {
12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY: {
12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataStatePtr start, end;
12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardPtr wild;
12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr ns;
12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    wild = (xmlSchemaWildcardPtr) particle->children;
12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = pctxt->state;
12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = xmlAutomataNewState(pctxt->am);
12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (particle->maxOccurs == 1) {
12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (wild->any == 1) {
12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * We need to add both transitions:
12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 1. the {"*", "*"} for elements in a namespace.
12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 2. the {"*"} for elements in no namespace.
12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", NULL, wild);
12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->nsSet != NULL) {
12783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = wild->nsSet;
12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state = start;
12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state = xmlAutomataNewTransition2(pctxt->am,
12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    pctxt->state, NULL, BAD_CAST "*", ns->value, wild);
12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = ns->next;
12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ns != NULL);
12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->negNsSet != NULL) {
12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, end, BAD_CAST "*", wild->negNsSet->value,
12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wild);
12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int counter;
12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataStatePtr hop;
12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int maxOccurs =
12801df143a5041f03a22808b59c76698770b74692815Selim Gurun		    particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
12802df143a5041f03a22808b59c76698770b74692815Selim Gurun                                           particle->maxOccurs - 1;
12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int minOccurs =
12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hop = xmlAutomataNewState(pctxt->am);
12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (wild->any == 1) {
12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", NULL, wild);
12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->nsSet != NULL) {
12818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = wild->nsSet;
12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state =
12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlAutomataNewTransition2(pctxt->am,
12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				start, NULL, BAD_CAST "*", ns->value, wild);
12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = ns->next;
12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ns != NULL);
12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->negNsSet != NULL) {
12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, hop, BAD_CAST "*", wild->negNsSet->value,
12830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wild);
12831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
12833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
12834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (particle->minOccurs == 0) {
12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewEpsilon(pctxt->am, start, end);
12837df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
12838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pctxt->state = end;
12840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_ELEMENT:
12843df143a5041f03a22808b59c76698770b74692815Selim Gurun	    ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
12844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SEQUENCE:{
12846df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaTreeItemPtr sub;
12847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12848df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
12849df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
12850df143a5041f03a22808b59c76698770b74692815Selim Gurun             * If max and min occurances are default (1) then
12851df143a5041f03a22808b59c76698770b74692815Selim Gurun             * simply iterate over the particles of the <sequence>.
12852df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
12853df143a5041f03a22808b59c76698770b74692815Selim Gurun            if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
12854df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12856df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (sub != NULL) {
12857df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
12858df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12859df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 != 1) ret = 0;
12860df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
12861df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
12862df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
12863df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataStatePtr oldstate = pctxt->state;
12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12865df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (particle->maxOccurs >= UNBOUNDED) {
12866df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (particle->minOccurs > 1) {
12867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlAutomataStatePtr tmp;
12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        int counter;
12869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12871df143a5041f03a22808b59c76698770b74692815Selim Gurun                            oldstate, NULL);
12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        oldstate = pctxt->state;
12873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        counter = xmlAutomataNewCounter(pctxt->am,
12875df143a5041f03a22808b59c76698770b74692815Selim Gurun                            particle->minOccurs - 1, UNBOUNDED);
12876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = particle->children->children;
12878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (sub != NULL) {
12879df143a5041f03a22808b59c76698770b74692815Selim Gurun                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
12880df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            (xmlSchemaParticlePtr) sub);
12881df143a5041f03a22808b59c76698770b74692815Selim Gurun                            if (tmp2 != 1) ret = 0;
12882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            sub = sub->next;
12883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = pctxt->state;
12885df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCountedTrans(pctxt->am, tmp,
12886df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   oldstate, counter);
12887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pctxt->state =
12888df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlAutomataNewCounterTrans(pctxt->am, tmp,
12889df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                       NULL, counter);
12890df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (ret == 1)
12891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlAutomataNewEpsilon(pctxt->am,
12892df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                oldstate, pctxt->state);
12893df143a5041f03a22808b59c76698770b74692815Selim Gurun
12894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
12895df143a5041f03a22808b59c76698770b74692815Selim Gurun                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12896df143a5041f03a22808b59c76698770b74692815Selim Gurun                            oldstate, NULL);
12897df143a5041f03a22808b59c76698770b74692815Selim Gurun                        oldstate = pctxt->state;
12898df143a5041f03a22808b59c76698770b74692815Selim Gurun
12899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = particle->children->children;
12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (sub != NULL) {
12901df143a5041f03a22808b59c76698770b74692815Selim Gurun                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
12902df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12903df143a5041f03a22808b59c76698770b74692815Selim Gurun                            if (tmp2 != 1) ret = 0;
12904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            sub = sub->next;
12905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12906df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
12907df143a5041f03a22808b59c76698770b74692815Selim Gurun                                              oldstate);
12908df143a5041f03a22808b59c76698770b74692815Selim Gurun                        /*
12909df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * epsilon needed to block previous trans from
12910df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * being allowed to enter back from another
12911df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * construct
12912df143a5041f03a22808b59c76698770b74692815Selim Gurun                         */
12913df143a5041f03a22808b59c76698770b74692815Selim Gurun                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12914df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            pctxt->state, NULL);
12915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (particle->minOccurs == 0) {
12916df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlAutomataNewEpsilon(pctxt->am,
12917df143a5041f03a22808b59c76698770b74692815Selim Gurun                                oldstate, pctxt->state);
12918df143a5041f03a22808b59c76698770b74692815Selim Gurun                            ret = 1;
12919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12921df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else if ((particle->maxOccurs > 1)
12922df143a5041f03a22808b59c76698770b74692815Selim Gurun                           || (particle->minOccurs > 1)) {
12923df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataStatePtr tmp;
12924df143a5041f03a22808b59c76698770b74692815Selim Gurun                    int counter;
12925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12926df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12927df143a5041f03a22808b59c76698770b74692815Selim Gurun                        oldstate, NULL);
12928df143a5041f03a22808b59c76698770b74692815Selim Gurun                    oldstate = pctxt->state;
12929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12930df143a5041f03a22808b59c76698770b74692815Selim Gurun                    counter = xmlAutomataNewCounter(pctxt->am,
12931df143a5041f03a22808b59c76698770b74692815Selim Gurun                        particle->minOccurs - 1,
12932df143a5041f03a22808b59c76698770b74692815Selim Gurun                        particle->maxOccurs - 1);
12933df143a5041f03a22808b59c76698770b74692815Selim Gurun
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                    tmp = pctxt->state;
12942df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewCountedTrans(pctxt->am,
12943df143a5041f03a22808b59c76698770b74692815Selim Gurun                        tmp, oldstate, counter);
12944df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state =
12945df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL,
12946df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   counter);
12947df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if ((particle->minOccurs == 0) || (ret == 1)) {
12948df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am,
12949df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            oldstate, pctxt->state);
12950df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ret = 1;
12951df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
12952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
12953df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = particle->children->children;
12954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (sub != NULL) {
12955df143a5041f03a22808b59c76698770b74692815Selim Gurun                        tmp2 = xmlSchemaBuildAContentModel(pctxt,
12956df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12957df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (tmp2 != 1) ret = 0;
12958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = sub->next;
12959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
1296094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1296194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    /*
1296294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		     * epsilon needed to block previous trans from
1296394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		     * being allowed to enter back from another
1296494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		     * construct
1296594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		     */
1296694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
1296794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun					pctxt->state, NULL);
1296894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
12969df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (particle->minOccurs == 0) {
12970df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am, oldstate,
12971df143a5041f03a22808b59c76698770b74692815Selim Gurun                                              pctxt->state);
12972df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ret = 1;
12973df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
12974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
12975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12976df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
12977df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
12978df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_SCHEMA_TYPE_CHOICE:{
12979df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaTreeItemPtr sub;
12980df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataStatePtr start, end;
12981df143a5041f03a22808b59c76698770b74692815Selim Gurun
12982df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 0;
12983df143a5041f03a22808b59c76698770b74692815Selim Gurun            start = pctxt->state;
12984df143a5041f03a22808b59c76698770b74692815Selim Gurun            end = xmlAutomataNewState(pctxt->am);
12985df143a5041f03a22808b59c76698770b74692815Selim Gurun
12986df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
12987df143a5041f03a22808b59c76698770b74692815Selim Gurun             * iterate over the subtypes and remerge the end with an
12988df143a5041f03a22808b59c76698770b74692815Selim Gurun             * epsilon transition
12989df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
12990df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->maxOccurs == 1) {
12991df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
12992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (sub != NULL) {
12993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    pctxt->state = start;
12994df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
12995df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12996df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 == 1) ret = 1;
12997df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12998df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
12999df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
13000df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
13001df143a5041f03a22808b59c76698770b74692815Selim Gurun                int counter;
13002df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataStatePtr hop, base;
13003df143a5041f03a22808b59c76698770b74692815Selim Gurun                int maxOccurs = particle->maxOccurs == UNBOUNDED ?
13004df143a5041f03a22808b59c76698770b74692815Selim Gurun                    UNBOUNDED : particle->maxOccurs - 1;
13005df143a5041f03a22808b59c76698770b74692815Selim Gurun                int minOccurs =
13006df143a5041f03a22808b59c76698770b74692815Selim Gurun                    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
13007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13008df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
13009df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * use a counter to keep track of the number of transtions
13010df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * which went through the choice.
13011df143a5041f03a22808b59c76698770b74692815Selim Gurun                 */
13012df143a5041f03a22808b59c76698770b74692815Selim Gurun                counter =
13013df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
13014df143a5041f03a22808b59c76698770b74692815Selim Gurun                hop = xmlAutomataNewState(pctxt->am);
13015df143a5041f03a22808b59c76698770b74692815Selim Gurun                base = xmlAutomataNewState(pctxt->am);
13016df143a5041f03a22808b59c76698770b74692815Selim Gurun
13017df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
13018df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (sub != NULL) {
13019df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state = base;
13020df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
13021df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
13022df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 == 1) ret = 1;
13023df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
13024df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
13025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
13026df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, base);
13027df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter);
13028df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
13029df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (ret == 1)
13030df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, base, end);
13031df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13032df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->minOccurs == 0) {
13033df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, end);
13034df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
13035df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13036df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state = end;
13037df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
13038df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
13039df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_SCHEMA_TYPE_ALL:{
13040df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataStatePtr start, tmp;
13041df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaParticlePtr sub;
13042df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaElementPtr elemDecl;
13043df143a5041f03a22808b59c76698770b74692815Selim Gurun
13044df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
13045df143a5041f03a22808b59c76698770b74692815Selim Gurun
13046df143a5041f03a22808b59c76698770b74692815Selim Gurun            sub = (xmlSchemaParticlePtr) particle->children->children;
13047df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (sub == NULL)
13048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
13049df143a5041f03a22808b59c76698770b74692815Selim Gurun
13050df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 0;
13051df143a5041f03a22808b59c76698770b74692815Selim Gurun
13052df143a5041f03a22808b59c76698770b74692815Selim Gurun            start = pctxt->state;
13053df143a5041f03a22808b59c76698770b74692815Selim Gurun            tmp = xmlAutomataNewState(pctxt->am);
13054df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
13055df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state = tmp;
13056df143a5041f03a22808b59c76698770b74692815Selim Gurun            while (sub != NULL) {
13057df143a5041f03a22808b59c76698770b74692815Selim Gurun                pctxt->state = tmp;
13058df143a5041f03a22808b59c76698770b74692815Selim Gurun
13059df143a5041f03a22808b59c76698770b74692815Selim Gurun                elemDecl = (xmlSchemaElementPtr) sub->children;
13060df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (elemDecl == NULL) {
13061df143a5041f03a22808b59c76698770b74692815Selim Gurun                    PERROR_INT("xmlSchemaBuildAContentModel",
13062df143a5041f03a22808b59c76698770b74692815Selim Gurun                        "<element> particle has no term");
13063df143a5041f03a22808b59c76698770b74692815Selim Gurun                    return(ret);
13064df143a5041f03a22808b59c76698770b74692815Selim Gurun                };
13065df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
13066df143a5041f03a22808b59c76698770b74692815Selim Gurun                * NOTE: The {max occurs} of all the particles in the
13067df143a5041f03a22808b59c76698770b74692815Selim Gurun                * {particles} of the group must be 0 or 1; this is
13068df143a5041f03a22808b59c76698770b74692815Selim Gurun                * already ensured during the parse of the content of
13069df143a5041f03a22808b59c76698770b74692815Selim Gurun                * <all>.
13070df143a5041f03a22808b59c76698770b74692815Selim Gurun                */
13071df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
13072df143a5041f03a22808b59c76698770b74692815Selim Gurun                    int counter;
13073df143a5041f03a22808b59c76698770b74692815Selim Gurun
13074df143a5041f03a22808b59c76698770b74692815Selim Gurun                    /*
13075df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * This is an abstract group, we need to share
13076df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * the same counter for all the element transitions
13077df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * derived from the group
13078df143a5041f03a22808b59c76698770b74692815Selim Gurun                     */
13079df143a5041f03a22808b59c76698770b74692815Selim Gurun                    counter = xmlAutomataNewCounter(pctxt->am,
13080df143a5041f03a22808b59c76698770b74692815Selim Gurun                                       sub->minOccurs, sub->maxOccurs);
13081df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlSchemaBuildContentModelForSubstGroup(pctxt,
13082df143a5041f03a22808b59c76698770b74692815Selim Gurun                                       sub, counter, pctxt->state);
13083df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else {
13084df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if ((sub->minOccurs == 1) &&
13085df143a5041f03a22808b59c76698770b74692815Selim Gurun                        (sub->maxOccurs == 1)) {
13086df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
13087df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                pctxt->state,
13088df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                elemDecl->name,
13089df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                elemDecl->targetNamespace,
13090df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                1, 1, elemDecl);
13091df143a5041f03a22808b59c76698770b74692815Selim Gurun                    } else if ((sub->minOccurs == 0) &&
13092df143a5041f03a22808b59c76698770b74692815Selim Gurun                        (sub->maxOccurs == 1)) {
13093df143a5041f03a22808b59c76698770b74692815Selim Gurun
13094df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
13095df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 pctxt->state,
13096df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl->name,
13097df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl->targetNamespace,
13098df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 0,
13099df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 1,
13100df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl);
13101df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
13102df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
13103df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = (xmlSchemaParticlePtr) sub->next;
13104df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13105df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state =
13106df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0);
13107df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->minOccurs == 0) {
13108df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state);
13109df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13111df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
13112df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * If we hit a model group definition, then this means that
13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * it was empty, thus was not substituted for the containing
13117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * model group. Just do nothing in this case.
13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: But the group should be substituted and not occur at
13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * all in the content model at this point. Fix this.
13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13121df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaInternalErr2(ACTXT_CAST pctxt,
13125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlSchemaBuildAContentModel",
13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"found unexpected term of type '%s' in content model",
13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(particle->children), NULL);
13128df143a5041f03a22808b59c76698770b74692815Selim Gurun            return(ret);
13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13130df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaBuildContentModel:
13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the element name
13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds the content model of the complex type.
13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModel(xmlSchemaTypePtr type,
13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParserCtxtPtr ctxt)
13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->type != XML_SCHEMA_TYPE_COMPLEX) ||
13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->contModel != NULL) ||
13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->contentType != XML_SCHEMA_CONTENT_MIXED)))
13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT
13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Building content model for %s\n", name);
13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = NULL;
13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = xmlNewAutomata();
13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->am == NULL) {
13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Cannot create automata for complex type %s\n", type->name);
13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = xmlAutomataGetInitState(ctxt->am);
13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Build the automaton.
13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type));
13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataSetFinalState(ctxt->am, ctxt->state);
13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contModel = xmlAutomataCompile(ctxt->am);
13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contModel == NULL) {
13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPCustomErr(ctxt,
13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, type->node,
13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Failed to compile the content model", NULL);
13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlRegexpIsDeterminist(type->contModel) != 1) {
13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPCustomErr(ctxt,
13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NOT_DETERMINISTIC,
13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAS_ERR_NOTDETERMINIST, */
13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, type->node,
13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The content model is not determinist", NULL);
13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT_REGEXP
13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Content model of %s:\n", type->name);
13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegexpPrint(stderr, type->contModel);
13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = NULL;
13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFreeAutomata(ctxt->am);
13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = NULL;
13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveElementReferences:
13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  the schema element context
13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the references of an element declaration
13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or particle, which has an element declaration as it's
13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * term.
13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParserCtxtPtr ctxt)
13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elemDecl == NULL) ||
13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemDecl != NULL) &&
13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) {
13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr type;
13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1321460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* (type definition) ... otherwise the type definition �resolved�
1321560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to by the �actual value� of the type [attribute] ...
13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->namedTypeNs);
13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL) {
13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, elemDecl->node,
13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type", elemDecl->namedType, elemDecl->namedTypeNs,
13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_BASIC, "type definition");
13225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->subtypes = type;
13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->substGroup != NULL) {
13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr substHead;
13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* FIXME TODO: Do we need a new field in _xmlSchemaElement for
13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* substitutionGroup?
13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->substGroupNs);
13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (substHead == NULL) {
13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, NULL,
13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitutionGroup", elemDecl->substGroup,
13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL);
13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaResolveElementReferences(substHead, ctxt);
13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Set the "substitution group affiliation".
13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that now we use the "refDecl" field for this.
13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_SUBST_HEAD(elemDecl) = substHead;
13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The type definitions is set to:
13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC "...the {type definition} of the element
1325360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * declaration �resolved� to by the �actual value�
13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the substitutionGroup [attribute], if present"
13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elemDecl->subtypes == NULL)
13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->subtypes = substHead->subtypes;
13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC "The definition of anyType serves as the default type definition
13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for element declarations whose XML representation does not specify one."
13263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->subtypes == NULL) &&
13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->namedType == NULL) &&
13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->substGroup == NULL))
13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveUnionMemberTypes:
13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the schema simple type definition
13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks and builds the "member type definitions" property of the union
13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * simple type. This handles part (1), part (2) is done in
13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFinishMemberTypeDefinitionsProperty()
13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of an internal error, 0 otherwise.
13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr link, lastLink, newLink;
13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr memberType;
13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "If the <union> alternative is chosen, then [Definition:]
1329160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * define the explicit members as the type definitions �resolved�
1329260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * to by the items in the �actual value� of the memberTypes [attribute],
13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if any, followed by the type definitions corresponding to the
13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * <simpleType>s among the [children] of <union>, if any."
13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve references.
13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    link = type->memberTypes;
13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lastLink = NULL;
13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *name, *nsName;
13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = ((xmlSchemaQNameRefPtr) link->type)->name;
13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace;
13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = xmlSchemaGetType(ctxt->schema, name, nsName);
13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) {
13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node, "memberTypes",
13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL);
13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Remove the member type link.
13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lastLink == NULL)
13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->memberTypes = link->next;
13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastLink->next = link->next;
13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    newLink = link;
13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(newLink);
13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->type = memberType;
13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastLink = link;
13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add local simple types,
13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memberType = type->subtypes;
13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (memberType != NULL) {
13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink));
13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (link == NULL) {
13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL);
13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link->type = memberType;
13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link->next = NULL;
13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (lastLink == NULL)
13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->memberTypes = link;
13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastLink->next = link;
13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lastLink = link;
13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = memberType->next;
13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsDerivedFromBuiltInType:
13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the value type
13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type has the given value type, or
13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is derived from such a type.
13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType == valType)
13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->builtInType == XML_SCHEMAS_ANYTYPE))
13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsDerivedFromBuiltInType:
13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the value type
13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type has the given value type, or
13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is derived from such a type.
13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType == valType)
13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaQueryBuiltInType(xmlSchemaTypePtr type)
13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC)
13414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(type);
13415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaQueryBuiltInType(type->subtypes));
13416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1341760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPrimitiveType:
13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simpleType definition
13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the primitive type of the given type or
13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error.
13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPrimitiveType(xmlSchemaTypePtr type)
13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (type != NULL) {
13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that anySimpleType is actually not a primitive type
13433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* but we need that here.
13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type);
13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetBuiltInTypeAncestor:
13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simpleType definition
13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the primitive type of the given type or
13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error.
13451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type)
13454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type) || WXS_IS_UNION(type))
13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (type != NULL) {
13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->type == XML_SCHEMA_TYPE_BASIC)
13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type);
13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCloneWildcardNsConstraints:
13469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dest:  the destination wildcard
13471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @source: the source wildcard
13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clones the namespace constraints of source
13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and assignes them to dest.
13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 on internal error, 0 otherwise.
13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
13479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaWildcardPtr dest,
13480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaWildcardPtr source)
13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, tmp, last;
13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((source == NULL) || (dest == NULL))
13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dest->any = source->any;
13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = source->nsSet;
13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp->value = cur->value;
13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (last == NULL)
13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dest->nsSet = tmp;
13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last->next = tmp;
13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	last = tmp;
13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dest->negNsSet != NULL)
13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeWildcardNsSet(dest->negNsSet);
13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (source->negNsSet != NULL) {
13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (dest->negNsSet == NULL)
13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet->value = source->negNsSet->value;
13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet = NULL;
13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaUnionWildcards:
13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild:  the first wildcard
13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @curWild: the second wildcard
13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unions the namespace constraints of the given wildcards.
13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild will hold the resulting union.
13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a positive error code on failure, -1 in case of an
13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal error, 0 otherwise.
13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr completeWild,
13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr curWild)
13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, curB, tmp;
13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If O1 and O2 are the same value, then that value must be the
13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * value.
13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any == curWild->any) &&
13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((completeWild->negNsSet == NULL) ||
13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int found = 0;
13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Check equality of sets.
13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = completeWild->nsSet;
13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 0;
13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curWild->nsSet;
13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (curB != NULL) {
13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (cur->value == curB->value) {
13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curB = curB->next;
13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!found)
13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->next;
13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (found)
13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 If either O1 or O2 is any, then any must be the value
13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (completeWild->any != curWild->any) {
13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->any == 0) {
13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->any = 1;
13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet != NULL) {
13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(completeWild->negNsSet);
13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = NULL;
13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1358760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 3 If both O1 and O2 are sets of (namespace names or �absent�),
13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the union of those sets must be the value.
13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaWildcardNsPtr start;
13593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = curWild->nsSet;
13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	start = completeWild->nsSet;
13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = start;
13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (curB != NULL) {
13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == curB->value) {
13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = curB->next;
13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == NULL)
13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp->value = cur->value;
13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp->next = completeWild->nsSet;
13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = tmp;
13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 4 If the two are negations of different values (namespace names
1362160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * or �absent�), then a pair of not and �absent� must be the value.
13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) &&
13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet != NULL) &&
13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value)) {
13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	completeWild->negNsSet->value = NULL;
13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 5.
13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) &&
13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != NULL) &&
13635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->nsSet != NULL)) ||
13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) &&
13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value != NULL) &&
13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->nsSet != NULL))) {
13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int nsFound, absentFound = 0;
13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet != NULL) {
13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = curWild->negNsSet;
13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = curWild->nsSet;
13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = completeWild->negNsSet;
13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsFound = 0;
13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL)
13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		absentFound = 1;
13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (cur->value == curB->value)
13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsFound = 1;
13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsFound && absentFound)
13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsFound && absentFound) {
13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.1 If the set S includes both the negated namespace
1366360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * name and �absent�, then any must be the value.
13664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->any = 1;
13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet != NULL) {
13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(completeWild->negNsSet);
13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = NULL;
13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (nsFound && (!absentFound)) {
13675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.2 If the set S includes the negated namespace name
1367760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * but not �absent�, then a pair of not and �absent� must
13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be the value.
13679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL) {
13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet == NULL)
13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet->value = NULL;
13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!nsFound) && absentFound) {
13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1369260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 5.3 If the set S includes �absent� but not the negated
13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * namespace name, then the union is not expressible.
13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, completeWild->node,
13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_UNION_NOT_EXPRESSIBLE,
13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The union of the wilcard is not expressible.\n",
13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE);
13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!nsFound) && (!absentFound)) {
13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.4 If the set S does not include either the negated namespace
1370360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * name or �absent�, then whichever of O1 or O2 is a pair of not
13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * and a namespace name must be the value.
13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL) {
13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->nsSet != NULL) {
13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = NULL;
13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet == NULL)
13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet->value = curWild->negNsSet->value;
13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 6.
13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) &&
13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value == NULL) &&
13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->nsSet != NULL)) ||
13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) &&
13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value == NULL) &&
13727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->nsSet != NULL))) {
13728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet != NULL) {
13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = curWild->nsSet;
13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL) {
13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1373760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 6.1 If the set S includes �absent�, then any must be the
13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* value.
13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->any = 1;
13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->nsSet != NULL) {
13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = NULL;
13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet != NULL) {
13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(completeWild->negNsSet);
13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->negNsSet = NULL;
13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->negNsSet == NULL) {
13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1375560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 6.2 If the set S does not include �absent�, then a pair of not
1375660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * and �absent� must be the value.
13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL)
13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet->value = NULL;
13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIntersectWildcards:
13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild:  the first wildcard
13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @curWild: the second wildcard
13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Intersects the namespace constraints of the given wildcards.
13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild will hold the resulting intersection.
13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a positive error code on failure, -1 in case of an
13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal error, 0 otherwise.
13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr completeWild,
13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr curWild)
13788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, curB, prev,  tmp;
13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If O1 and O2 are the same value, then that value must be the
13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * value.
13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any == curWild->any) &&
13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((completeWild->negNsSet == NULL) ||
13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int found = 0;
13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Check equality of sets.
13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = completeWild->nsSet;
13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 0;
13811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curWild->nsSet;
13812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (curB != NULL) {
13813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (cur->value == curB->value) {
13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curB = curB->next;
13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!found)
13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->next;
13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (found)
13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 If either O1 or O2 is any, then the other must be the value.
13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any != curWild->any) && (completeWild->any)) {
13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 If either O1 or O2 is a pair of not and a value (a namespace
1383960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * name or �absent�) and the other is a set of (namespace names or
1384060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * �absent�), then that set, minus the negated value if it was in
1384160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the set, minus �absent� if it was in the set, must be the value.
13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) ||
13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) {
13845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *neg;
13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet == NULL) {
13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = completeWild->negNsSet->value;
13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = curWild->negNsSet->value;
13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Remove absent and negated.
13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = NULL;
13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = completeWild->nsSet;
13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL) {
13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prev == NULL)
13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = cur->next;
13862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prev->next = cur->next;
13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(cur);
13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (neg != NULL) {
13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = NULL;
13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == neg) {
13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (prev == NULL)
13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			completeWild->nsSet = cur->next;
13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prev->next = cur->next;
13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(cur);
13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prev = cur;
13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1389060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 4 If both O1 and O2 are sets of (namespace names or �absent�),
13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the intersection of those sets must be the value.
13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = completeWild->nsSet;
13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = NULL;
13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = curWild->nsSet;
13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (curB != NULL) {
13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == curB->value) {
13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = curB->next;
13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prev == NULL)
13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = cur->next;
13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
13912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prev->next = cur->next;
13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = cur->next;
13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(cur);
13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = tmp;
13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 5 If the two are negations of different namespace names,
13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the intersection is not expressible
13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) &&
13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet != NULL) &&
13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != NULL) &&
13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value != NULL)) {
13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE,
13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The intersection of the wilcard is not expressible.\n",
13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE);
13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 6 If the one is a negation of a namespace name and the other
1394060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * is a negation of �absent�, then the one which is the negation
13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a namespace name must be the value.
13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) &&
13944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value == NULL)) {
13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	completeWild->negNsSet->value =  curWild->negNsSet->value;
13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsWildcardNsConstraintSubset:
13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub:  the first wildcard
13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @super: the second wildcard
13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Wildcard Subset (cos-ns-subset)
13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the namespace constraint of @sub is an intensional
13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subset of @super, 1 otherwise.
13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaWildcardPtr super)
13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 super must be any.
13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (super->any)
13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1397260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.1 sub must be a pair of not and a namespace name or �absent�.
13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2 super must be a pair of not and the same value.
13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((sub->negNsSet != NULL) &&
13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(super->negNsSet != NULL) &&
1397794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	(sub->negNsSet->value == super->negNsSet->value))
13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1398060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 3.1 sub must be a set whose members are either namespace names or �absent�.
13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->nsSet != NULL) {
13983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.1 super must be the same set or a superset thereof.
13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (super->nsSet != NULL) {
13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr cur, curB;
13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int found = 0;
13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = sub->nsSet;
13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 0;
13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = super->nsSet;
13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (curB != NULL) {
13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->value == curB->value) {
13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			found = 1;
13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curB->next;
14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!found)
14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (1);
14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found)
14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (super->negNsSet != NULL) {
14008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr cur;
14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.2.2 super must be a pair of not and a namespace name or
1401160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �absent� and that value must not be in sub's set.
14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = sub->nsSet;
14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == super->negNsSet->value)
14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (1);
14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     int *fixed,
14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar **value,
14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaValPtr *val)
14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *fixed = 0;
14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *value = NULL;
14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != 0)
14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*val = NULL;
14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1403660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (attruse->defValue != NULL) {
14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = attruse->defValue;
14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val != NULL)
14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = attruse->defVal;
14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *fixed = 1;
14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((attruse->attrDecl != NULL) &&
14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(attruse->attrDecl->defValue != NULL)) {
14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = attruse->attrDecl->defValue;
14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val != NULL)
14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = attruse->attrDecl->defVal;
14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *fixed = 1;
14050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCVCWildcardNamespace:
14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wild:  the wildcard
14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the namespace
14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation Rule: Wildcard allows Namespace Name
14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (cvc-wildcard-namespace)
14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the given namespace matches the wildcard,
14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 otherwise and -1 on API errors.
14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar* ns)
14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild == NULL)
14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->any)
14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (wild->nsSet != NULL) {
14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaWildcardNsPtr cur;
14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = wild->nsSet;
14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->value, ns))
14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((wild->negNsSet != NULL) && (ns != NULL) &&
14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlStrEqual(wild->negNsSet->value, ns)))
14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
14088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ACTION_DERIVE 0
14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ACTION_REDEFINE 1
14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ACTION_STR(a) \
14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Schema Component Constraint:
14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Derivation Valid (Restriction, Complex)
14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   derivation-ok-restriction (2) - (4)
14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* ATTENTION:
14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* In XML Schema 1.1 this will be:
14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Validation Rule:
14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*     Checking complex type subsumption (practicalSubsumption) (1, 2 and 3)
14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       int action,
14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr item,
14111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr baseItem,
14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaItemListPtr uses,
14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaItemListPtr baseUses,
14114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaWildcardPtr wild,
14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaWildcardPtr baseWild)
1411660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr cur = NULL, bcur;
14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, found; /* err = 0; */
14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *bEffValue;
14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int effFixed;
1412160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (uses != NULL) {
14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < uses->nbItems; i++) {
14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = uses->items[i];
14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (baseUses == NULL)
14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto not_found;
14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < baseUses->nbItems; j++) {
1412960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		bcur = baseUses->items[j];
14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ATTRUSE_DECL_NAME(cur) ==
14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(bcur)) &&
14132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTRUSE_DECL_TNS(cur) ==
14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(bcur)))
14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * (2.1) "If there is an attribute use in the {attribute
14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * uses} of the {base type definition} (call this B) whose
14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * {attribute declaration} has the same {name} and {target
14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * namespace}, then  all of the following must be true:"
14140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
1414260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
14145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1) "one of the following must be true:"
14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1.1) "B's {required} is false."
14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1.2) "R's {required} is true."
14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPAttrUseErr4(pctxt,
14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1,
14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item), item, cur,
14155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The 'optional' attribute use is inconsistent "
14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "with the corresponding 'required' attribute use of "
14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "the %s %s",
14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ACTION_STR(action),
14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, baseItem),
14160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, NULL);
14161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* err = pctxt->err; */
14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_TYPEDEF(cur),
14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
1416860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (2.1.2) "R's {attribute declaration}'s
14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* {type definition} must be validly derived from
14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* B's {type definition} given the empty set as
1417360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* defined in Type Derivation OK (Simple) (�3.14.6)."
14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPAttrUseErr4(pctxt,
14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2,
14177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item), item, cur,
14178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The attribute declaration's %s "
14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "is not validly derived from "
14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "the corresponding %s of the "
14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "attribute declaration in the %s %s",
14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strA,
14183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(cur)),
14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strB,
14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(bcur)),
14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ACTION_STR(action),
14187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strC, baseItem));
14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* xmlSchemaGetComponentDesignation(&str, baseItem), */
14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strA);
14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strB);
14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strC);
14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* err = pctxt->err; */
14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* 2.1.3 [Definition:]  Let the effective value
14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* constraint of an attribute use be its {value
14197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* constraint}, if present, otherwise its {attribute
14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* declaration}'s {value constraint} .
14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetEffectiveValueConstraint(bcur,
14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    &effFixed, &bEffValue, NULL);
14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* 2.1.3 ... one of the following must be true
14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*
1420560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* 2.1.3.1 B's �effective value constraint� is
1420660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* �absent� or default.
14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((bEffValue != NULL) &&
14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (effFixed == 1)) {
14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *rEffValue = NULL;
1421160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetEffectiveValueConstraint(bcur,
14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				&effFixed, &rEffValue, NULL);
14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
1421560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * 2.1.3.2 R's �effective value constraint� is
14216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * fixed with the same string as B's.
14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * MAYBE TODO: Compare the computed values.
14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *       Hmm, it says "same string" so
14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *       string-equality might really be sufficient.
14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
14221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if ((effFixed == 0) ||
14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
14223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlChar *str = NULL;
1422560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPAttrUseErr4(pctxt,
14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3,
14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    WXS_ITEM_NODE(item), item, cur,
14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "The effective value constraint of the "
14230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "attribute use is inconsistent with "
14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "its correspondent in the %s %s",
14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    WXS_ACTION_STR(action),
14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaGetComponentDesignation(&str,
14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					baseItem),
14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    NULL, NULL);
14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(str);
14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/* err = pctxt->err; */
14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1424460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottnot_found:
14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
14246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (2.2) "otherwise the {base type definition} must have an
14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {attribute wildcard} and the {target namespace} of the
1424960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* R's {attribute declaration} must be �valid� with respect
14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to that wildcard, as defined in Wildcard allows Namespace
1425160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Name (�3.10.4)."
14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((baseWild == NULL) ||
14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaCheckCVCWildcardNamespace(baseWild,
14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0))
14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
1425860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPAttrUseErr4(pctxt,
14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2,
14261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(item), item, cur,
14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Neither a matching attribute use, "
14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"nor a matching wildcard exists in the %s %s",
14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ACTION_STR(action),
14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentDesignation(&str, baseItem),
14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* err = pctxt->err; */
14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1427460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC derivation-ok-restriction (3):
14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (3) "For each attribute use in the {attribute uses} of the {base type
14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition} whose {required} is true, there must be an attribute
14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * use with an {attribute declaration} with the same {name} and
14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {target namespace} as its {attribute declaration} in the {attribute
14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * uses} of the complex type definition itself whose {required} is true.
14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseUses != NULL) {
14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0; j < baseUses->nbItems; j++) {
14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bcur = baseUses->items[j];
14284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (uses != NULL) {
14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < uses->nbItems; i++) {
1428960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    cur = uses->items[i];
14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(cur) ==
14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(bcur)) &&
14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(cur) ==
14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(bcur))) {
14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			found = 1;
14295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL;
1430160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3,
14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, item,
14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "A matching attribute use for the "
14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'required' %s of the %s %s is missing",
14307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strA, bcur),
14308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ACTION_STR(action),
14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strB, baseItem),
14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA);
14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB);
14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * derivation-ok-restriction (4)
14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild != NULL) {
14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (4) "If there is an {attribute wildcard}, all of the
14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* following must be true:"
1432360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (baseWild == NULL) {
14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4.1) "The {base type definition} must also have one."
1432960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
14330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1,
14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, item,
14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The %s has an attribute wildcard, "
14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"but the %s %s '%s' does not have one",
1433560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		WXS_ITEM_TYPE_NAME(item),
14336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem));
14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((baseWild->any == 0) &&
14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckCOSNSSubset(wild, baseWild))
14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4.2) "The complex type definition's {attribute wildcard}'s
14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {namespace constraint} must be a subset of the {base type
14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition}'s {attribute wildcard}'s {namespace constraint},
1434960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * as defined by Wildcard Subset (�3.10.6)."
14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2,
14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, item,
14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute wildcard is not a valid "
14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"subset of the wildcard in the %s %s '%s'",
14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem),
14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1436360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* 4.3 Unless the {base type definition} is the �ur-type
1436460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* definition�, the complex type definition's {attribute
14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* wildcard}'s {process contents} must be identical to or
14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* stronger than the {base type definition}'s {attribute
14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* wildcard}'s {process contents}, where strict is stronger
14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* than lax is stronger than skip.
14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_IS_ANYTYPE(baseItem)) &&
14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (wild->processContents < baseWild->processContents)) {
14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3,
14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, baseItem,
14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The {process contents} of the attribute wildcard is "
14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"weaker than the one in the %s %s '%s'",
14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem),
14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(pctxt->err);
14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaBasicItemPtr item,
14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaWildcardPtr *completeWild,
14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr list,
14395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr prohibs);
14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFixupTypeAttributeUses:
14398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds the wildcard and the attribute uses on the given complex type.
14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if an internal error occurs, 0 otherwise.
14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ATTENTION TODO: Experimantally this uses pointer comparisons for
14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * strings, so recheck this if we start to hardcode some schemata, since
14407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they might not be in the same dict.
14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: It is allowed to "extend" the xs:anyType type.
14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaTypePtr type)
14413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = NULL;
1441560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttributeUsePtr use;
14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr uses, baseUses, prohibs = NULL;
14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == NULL) {
14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no base type");
14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1442360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    baseType = type->baseType;
14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
14426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    uses = type->attrUses;
14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    baseUses = baseType->attrUses;
14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Expand attribute group references. And build the 'complete'
14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard, i.e. intersect multiple wildcards.
14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Move attribute prohibitions into a separate list.
14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1443560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (uses != NULL) {
14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one will transfer all attr. prohibitions
14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * into pctxt->attrProhibs.
14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->attrProhibs) == -1)
14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to expand attributes");
14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pctxt->attrProhibs->nbItems != 0)
14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prohibs = pctxt->attrProhibs;
14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL) == -1)
14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to expand attributes");
14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Inherit the attribute uses of the base type.
14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseUses != NULL) {
14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j;
14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUseProhibPtr pro;
14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int usesCount;
1446960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaAttributeUsePtr tmp;
14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (uses != NULL)
14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		usesCount = uses->nbItems;
14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		usesCount = 0;
14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Restriction. */
14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < baseUses->nbItems; i++) {
14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = baseUses->items[i];
14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prohibs) {
14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Filter out prohibited uses.
14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < prohibs->nbItems; j++) {
14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pro = prohibs->items[j];
14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				pro->targetNamespace))
14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto inherit_next;
14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (usesCount) {
14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Filter out existing uses.
14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < usesCount; j++) {
14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = uses->items[j];
14499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) ==
14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_NAME(tmp)) &&
14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_TNS(tmp)))
14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto inherit_next;
14505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (uses == NULL) {
14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->attrUses = xmlSchemaItemListCreate();
14510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->attrUses == NULL)
14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uses = type->attrUses;
14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaItemListAddSize(uses, 2, use);
14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinherit_next: {}
14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Extension. */
1451960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    for (i = 0; i < baseUses->nbItems; i++) {
1452060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		use = baseUses->items[i];
14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (uses == NULL) {
14522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->attrUses = xmlSchemaItemListCreate();
14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->attrUses == NULL)
14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uses = type->attrUses;
14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1452760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Shrink attr. uses.
14533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (uses) {
14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uses->nbItems == 0) {
14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(uses);
14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attrUses = NULL;
14538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We could shrink the size of the array
14541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to fit the actual number of items.
14542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Compute the complete wildcard.
14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1454760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (WXS_IS_EXTENSION(type)) {
14548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (baseType->attributeWildcard != NULL) {
14549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1455060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2.1) "If the �base wildcard� is non-�absent�, then
14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the appropriate case among the following:"
14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->attributeWildcard != NULL) {
14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Union the complete wildcard with the base wildcard.
14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC {attribute wildcard}
14557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (3.2.2.1.2) "otherwise a wildcard whose {process contents}
1455860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* and {annotation} are those of the �complete wildcard�,
14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and whose {namespace constraint} is the intensional union
1456060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* of the {namespace constraint} of the �complete wildcard�
1456160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* and of the �base wildcard�, as defined in Attribute
1456260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Wildcard Union (�3.10.6)."
14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard,
14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    baseType->attributeWildcard) == -1)
1456660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    goto exit_failure;
14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1456960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (3.2.2.1.1) "If the �complete wildcard� is �absent�,
1457060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* then the �base wildcard�."
14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->attributeWildcard = baseType->attributeWildcard;
1457360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1457660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the
1457760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �complete wildcard"
14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOOP
14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC {attribute wildcard}
14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (3.1) "If the <restriction> alternative is chosen, then the
1458560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �complete wildcard�;"
14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOOP
14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1458960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeFinalContains:
14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema
14599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @final: the final
14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if a type definition contains the given "final".
14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This does take "finalDefault" into account as well.
14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type does containt the given "final",
14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 otherwise.
14607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final)
14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->flags & final)
14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetUnionSimpleTypeMemberTypes:
14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the Union Simple Type
14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of member types of @type if existing,
14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns NULL otherwise.
14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypeLinkPtr
14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type)
14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) {
14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->memberTypes != NULL)
14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type->memberTypes);
14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = type->baseType;
14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParticleTotalRangeMin:
14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Effective Total Range
14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (all and sequence) + (choice)
14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the minimun Effective Total Range.
14646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle->children == NULL) ||
14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->minOccurs == 0))
14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int min = -1, cur;
14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (part == NULL)
14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (part != NULL) {
14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->minOccurs;
14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMin(part);
14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == 0)
14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((min > cur) || (min == -1))
14669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = cur;
14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) part->next;
14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->minOccurs * min);
14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <all> and <sequence> */
14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int sum = 0;
14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (part == NULL)
14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sum += part->minOccurs;
14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sum += xmlSchemaGetParticleTotalRangeMin(part);
14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) part->next;
14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (part != NULL);
14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->minOccurs * sum);
14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1469360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if 0
14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParticleTotalRangeMax:
14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Effective Total Range
14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (all and sequence) + (choice)
14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the maximum Effective Total Range.
14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle->children == NULL) ||
14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->children->children == NULL))
14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int max = -1, cur;
14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part->children == NULL)
14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->maxOccurs;
14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMax(part);
14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == UNBOUNDED)
14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((max < cur) || (max == -1))
14725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = cur;
14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Handle overflows? */
14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->maxOccurs * max);
14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <all> and <sequence> */
14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int sum = 0, cur;
14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part->children == NULL)
14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->maxOccurs;
14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMax(part);
14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == UNBOUNDED)
14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur > 0) && (particle->maxOccurs == UNBOUNDED))
14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sum += cur;
14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Handle overflows? */
14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->maxOccurs * sum);
14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1475360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsParticleEmptiable:
14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Particle Emptiable
14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the given particle is emptiable.
14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if emptiable, 0 otherwise.
14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "Its {min occurs} is 0."
14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle == NULL) || (particle->minOccurs == 0) ||
14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->children == NULL))
14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "Its {term} is a group and the minimum part of the
14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * effective total range of that group, [...] is 0."
14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_MODEL_GROUP(particle->children)) {
14778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaGetParticleTotalRangeMin(particle) == 0)
14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSSTDerivedOK:
14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @actxt: a context
14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the derived simple type definition
14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base type definition
14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @subset: the subset of ('restriction', ect.)
14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Simple) (cos-st-derived-OK)
14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks wheter @type can be validly
14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * derived from @baseType.
14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, an positive error code otherwise.
14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int subset)
14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 They are the same type definition.
14807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: The identy check might have to be more complex than this.
14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == baseType)
14810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.1 restriction is not in the subset, or in the {final}
14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of its own {base type definition};
14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that this will be used also via "xsi:type".
14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Revise this, it looks strange. How can the "type"
14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not be fixed or *in* fixing?
14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(type))
14821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(type, actxt) == -1)
14822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(baseType, actxt) == -1)
14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((subset & SUBSET_RESTRICTION) ||
14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaTypeFinalContains(type->baseType,
14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1);
14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 2.2 */
14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == baseType) {
14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1483460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 2.2.1 D's �base type definition� is B.
14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1483960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.2 D's �base type definition� is not the �ur-type definition�
14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * and is validly derived from B given the subset, as defined by this
14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * constraint.
14842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! WXS_IS_ANYTYPE(type->baseType)) &&
14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, subset) == 0)) {
14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1484960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.3 D's {variety} is list or union and B is the �simple ur-type
1485060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�.
14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_LIST(type) || WXS_IS_UNION(type))) {
14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2.4 B's {variety} is union and D is validly derived from a type
14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition in B's {member type definitions} given the subset, as
14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * defined by this constraint.
14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: This seems not to involve built-in types, since there is no
14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * built-in Union Simple Type.
14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_UNION(baseType)) {
14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr cur;
14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = baseType->memberTypes;
14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(cur->type))
14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaTypeFixup(cur->type, actxt) == -1)
14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSSTDerivedOK(actxt,
14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type, cur->type, subset) == 0)
14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* It just has to be validly derived from at least one
14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* member-type.
14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2);
14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckTypeDefCircularInternal:
14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context
14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtType:  the type definition
14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor: an ancestor of @ctxtType
14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks st-props-correct (2) + ct-props-correct (3).
14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Circular type definitions are not allowed.
14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is
14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * circular, 0 otherwise.
14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr ctxtType,
14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr ancestor)
14903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxtType == ancestor) {
14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(pctxt,
14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_2,
14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The definition is circular", NULL);
14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_2);
14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Avoid inifinite recursion on circular types not yet checked.
14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ancestor->baseType);
14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckTypeDefCircular:
14931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the complex/simple type definition
14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular type definitions.
14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item,
14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaParserCtxtPtr ctxt)
14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((item == NULL) ||
14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->type == XML_SCHEMA_TYPE_BASIC) ||
14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->baseType == NULL))
14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckTypeDefCircularInternal(ctxt, item,
14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->baseType);
14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Simple Type Definition Representation OK (src-simple-type) 4
14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* "4 Circular union type definition is disallowed. That is, if the
14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* <union> alternative is chosen, there must not be any entries in the
14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* memberTypes [attribute] at any depth which resolve to the component
14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* corresponding to the <simpleType>."
14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Note that this should work on the *representation* of a component,
14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* thus assumes any union types in the member types not being yet
14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* substituted. At this stage we need the variety of the types
14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* to be already computed.
14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					xmlSchemaTypePtr ctxType,
14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					xmlSchemaTypeLinkPtr members)
1496660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr member;
14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr memberType;
1496960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    member = members;
14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (member != NULL) {
14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = member->type;
14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((memberType != NULL) &&
14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (memberType == ctxType) {
14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_SIMPLE_TYPE_4,
14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST ctxType, NULL,
14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The union type definition is circular", NULL);
14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4);
14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_IS_UNION(memberType)) &&
14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int res;
14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxType,
14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (res != 0)
14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(res);
14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memberType = memberType->baseType;
14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	member = member->next;
14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaTypePtr type)
15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_UNION(type))
15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type,
15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->memberTypes));
15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveTypeReferences:
15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the complex/simple type definition
15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolvese type definition references
15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaParserCtxtPtr ctxt)
15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDef == NULL)
15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve the base type.
15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDef->baseType == NULL) {
15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	typeDef->baseType = xmlSchemaGetType(ctxt->schema,
15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    typeDef->base, typeDef->baseNs);
15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef->baseType == 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		"base", typeDef->base, typeDef->baseNs,
15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL);
15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(typeDef)) {
15042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_UNION(typeDef)) {
15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Resolve the memberTypes.
15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_LIST(typeDef)) {
15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Resolve the itemType.
15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) {
15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    typeDef->base, typeDef->baseNs);
15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((typeDef->subtypes == NULL) ||
15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (! WXS_IS_SIMPLE(typeDef->subtypes)))
15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    typeDef->subtypes = NULL;
15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPResCompAttrErr(ctxt,
15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_RESOLVE,
15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST typeDef, typeDef->node,
15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"itemType", typeDef->base, typeDef->baseNs,
15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SIMPLE, NULL);
15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1507060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The ball of letters below means, that if we have a particle
15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which has a QName-helper component as its {term}, we want
15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to resolve it...
15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) &&
15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_TYPE_CONTENTTYPE(typeDef))->type ==
15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_PARTICLE) &&
15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) &&
15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_TYPE_PARTICLE_TERM(typeDef))->type ==
15081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_EXTRA_QNAMEREF))
15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref =
15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
15085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaModelGroupDefPtr groupDef;
15086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: Test this.
15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_TYPE_PARTICLE_TERM(typeDef) = NULL;
15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Resolve the MG definition reference.
15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	groupDef =
15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref->itemType, ref->name, ref->targetNamespace);
15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (groupDef == NULL) {
15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"ref", ref->name, ref->targetNamespace, ref->itemType,
15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove the particle. */
15103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL)
15105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove the particle. */
15106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
15107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
15108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Assign the MG definition's {model group} to the
15110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * particle's {term}.
15111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
1511360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) {
15115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1.2)
15117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "1.2 the {term} property of a particle with
15118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {max occurs}=1 which is part of a pair which constitutes
15119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the {content type} of a complex type definition."
15120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
15122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
15123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
15124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
15125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL,
15126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The particle's {max occurs} must be 1, since the "
15127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"reference resolves to an 'all' model group",
15128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
15129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSTPropsCorrect:
15139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks st-props-correct.
15143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the properties are correct,
15145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not, a positive error code and -1 on internal
15146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
15150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = type->baseType;
15153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
15154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* STATE: error funcs converted. */
15156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Definition Properties Correct
15158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: This is somehow redundant, since we actually built a simple type
15160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to have all the needed information; this acts as an self test.
15161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1516260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Base type: If the datatype has been �derived� by �restriction�
1516360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the Simple Type Definition component from which it is �derived�,
1516460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * otherwise the Simple Type Definition for anySimpleType (�4.1.6).
15165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType == NULL) {
15167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Think about: "modulo the impact of Missing
1516960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Sub-components (�5.3)."
15170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No base type existent", NULL);
15175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_SIMPLE(baseType)) {
15179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The base type '%s' is not a simple type",
15183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15187df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((WXS_IS_LIST(type) || WXS_IS_UNION(type)) &&
15188df143a5041f03a22808b59c76698770b74692815Selim Gurun	(WXS_IS_RESTRICTION(type) == 0) &&
15189df143a5041f03a22808b59c76698770b74692815Selim Gurun	((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) &&
15190df143a5041f03a22808b59c76698770b74692815Selim Gurun         (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) {
15191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
1519460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "A type, derived by list or union, must have "
15195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the simple ur-type definition as base type, not '%s'",
15196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Variety: One of {atomic, list, union}.
15202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) &&
15204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! WXS_IS_LIST(type))) {
15205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The variety is absent", NULL);
15209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Finish this. Hmm, is this finished? */
15212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 The {final} of the {base type definition} must not contain restriction.
15215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypeFinalContains(baseType,
15217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_3,
15220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The 'final' of its base type '%s' must not contain "
15222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "'restriction'",
15223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_3);
15226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1522960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2 All simple type definitions must be derived ultimately from the �simple
1523060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * ur-type definition (so� circular definitions are disallowed). That is, it
1523160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be possible to reach a built-in primitive datatype or the �simple
1523260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * ur-type definition� by repeatedly following the {base type definition}.
15233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: this is done in xmlSchemaCheckTypeDefCircular().
15235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSSTRestricts:
15241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
15245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Restriction, Simple) (cos-st-restricts)
15246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if the given @type (simpleType) is derived validly by restriction.
15248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
15249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 on internal errors, 0 if the type is validly derived,
15251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a positive error code otherwise.
15252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
15255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
15258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE) {
15260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "given type is not a user-derived simpleType");
15262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
15263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ATOMIC(type)) {
15266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr primitive;
15267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.1 The {base type definition} must be an atomic simple
15269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition or a built-in primitive datatype.
15270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_IS_ATOMIC(type->baseType)) {
15272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_1_1,
15274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The base type '%s' is not an atomic simple type",
15276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, type->baseType));
15277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1);
15279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* 1.2 The {final} of the {base type definition} must not contain
15281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* restriction.
15282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */
15284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFinalContains(type->baseType,
15285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_1_2,
15288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The final of its base type '%s' must not contain 'restriction'",
15290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, type->baseType));
15291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2);
15293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.3.1 DF must be an allowed constraining facet for the {primitive
15297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition}, as specified in the appropriate subsection of 3.2
15298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Primitive datatypes.
15299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->facets != NULL) {
15301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetPtr facet;
15302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int ok = 1;
15303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    primitive = xmlSchemaGetPrimitiveType(type);
15305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (primitive == NULL) {
15306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to get primitive type");
15308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
15309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = type->facets;
15311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
15312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
15313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ok = 0;
15314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalFacetAtomicErr(pctxt,
15315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1,
15316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type, primitive, facet);
15317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = facet->next;
15319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (facet != NULL);
15320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ok == 0)
15321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1);
15322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.3.2) "If there is a facet of the same kind in the {facets}
15325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the {base type definition} (call this BF),then the DF's {value}
15326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a valid restriction of BF's {value} as defined in
15327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* [XML Schemas: Datatypes]."
15328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE (1.3.2) Facet derivation constraints are currently handled in
15330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* xmlSchemaDeriveAndValidateFacets()
15331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
15333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr itemType = NULL;
15334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	itemType = type->subtypes;
15336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) {
15337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to evaluate the item type");
15339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
15340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED(itemType))
15342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
15343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.1 The {item type definition} must have a {variety} of atomic or
15345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* union (in which case all the {member type definitions}
15346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be atomic).
15347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_IS_ATOMIC(itemType)) &&
15349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (! WXS_IS_UNION(itemType))) {
15350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
15352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The item type '%s' does not have a variety of atomic or union",
15354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, itemType));
15355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
15357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_UNION(itemType)) {
15358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeLinkPtr member;
15359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = itemType->memberTypes;
15361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (member != NULL) {
15362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! WXS_IS_ATOMIC(member->type)) {
15363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(pctxt,
15364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
15365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The item type is a union type, but the "
15367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"member type '%s' of this item type is not atomic",
15368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, member->type));
15369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
15371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member = member->next;
15373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) {
15377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetPtr facet;
15378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is the case if we have: <simpleType><list ..
15380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1
15383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1.1 The {final} of the {item type definition} must not
15384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain list.
15385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(itemType,
15387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_LIST)) {
15388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1,
15390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The final of its item type '%s' must not contain 'list'",
15392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, itemType));
15393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1);
15395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1.2 The {facets} must only contain the whiteSpace
15398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * facet component.
15399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: the S4S already disallows any facet
15400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to be specified.
15401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
15406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalFacetListUnionErr(pctxt,
15407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2,
15408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    type, facet);
15409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2);
15410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * MAYBE TODO: (Hmm, not really) Datatypes states:
1541660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * A �list� datatype can be �derived� from an �atomic� datatype
1541760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * whose �lexical space� allows space (such as string or anyURI)or
1541860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * a �union� datatype any of whose {member type definitions}'s
1541960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �lexical space� allows space.
15420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
15422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is the case if we have: <simpleType><restriction ...
15424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * I.e. the variety of "list" is inherited.
15425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2
15428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.1 The {base type definition} must have a {variety} of list.
15429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_IS_LIST(type->baseType)) {
15431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1,
15433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base type '%s' must be a list type",
15435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1);
15438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.2 The {final} of the {base type definition} must not
15441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain restriction.
15442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(type->baseType,
15444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2,
15447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The 'final' of the base type '%s' must not contain 'restriction'",
15449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2);
15452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.3 The {item type definition} must be validly derived
15455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * from the {base type definition}'s {item type definition} given
1545660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6).
15457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
15459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr baseItemType;
15460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		baseItemType = type->baseType->subtypes;
15462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
15463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to eval the item type of a base type");
15465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
15466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((itemType != baseItemType) &&
15468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
15469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			baseItemType, 0) != 0)) {
15470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *strBIT = NULL, *strBT = NULL;
15471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErrExt(pctxt,
15472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3,
15473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The item type '%s' is not validly derived from "
15475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"the item type '%s' of the base type '%s'",
15476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, itemType),
15477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strBIT, baseItemType),
15478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strBT, type->baseType));
15479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strBIT)
15482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strBT)
15483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3);
15484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr facet;
15489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int ok = 1;
15490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern
15492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and enumeration facet components are allowed among the {facets}.
15493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    switch (facet->type) {
15497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_LENGTH:
15498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_MINLENGTH:
15499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_MAXLENGTH:
15500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_WHITESPACE:
15501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
15502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * TODO: 2.5.1.2 List datatypes
1550360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * The value of �whiteSpace� is fixed to the value collapse.
15504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
15505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_PATTERN:
15506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_ENUMERATION:
15507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
15508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			default: {
15509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPIllegalFacetListUnionErr(pctxt,
15510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4,
15511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				type, facet);
15512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
15513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * We could return, but it's nicer to report all
15514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * invalid facets.
15515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
15516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ok = 0;
15517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
15518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ok == 0)
15522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4);
15523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (2.3.2.5) (same as 1.3.2)
15525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
15526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE (2.3.2.5) This is currently done in
15527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xmlSchemaDeriveAndValidateFacets()
15528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
15532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.1 The {member type definitions} must all have {variety} of
15534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* atomic or list.
15535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr member;
15537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	member = type->memberTypes;
15539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (member != NULL) {
15540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(member->type))
15541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt);
15542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((! WXS_IS_ATOMIC(member->type)) &&
15544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(! WXS_IS_LIST(member->type))) {
15545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_1,
15547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The member type '%s' is neither an atomic, nor a list type",
15549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, member->type));
15550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1);
15552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = member->next;
15554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1555660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 3.3.1 If the {base type definition} is the �simple ur-type
1555760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* definition�
15558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
15560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.1.1 All of the {member type definitions} must have a
15562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {final} which does not contain union.
15563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = type->memberTypes;
15565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (member != NULL) {
15566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaTypeFinalContains(member->type,
15567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_FINAL_UNION)) {
15568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(pctxt,
15569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1,
15570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The 'final' of member type '%s' contains 'union'",
15572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, member->type));
15573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1);
15575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member = member->next;
15577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.1.2 The {facets} must be empty.
15580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facetSet != NULL) {
15582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2,
15584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "No facets allowed", NULL);
15586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2);
15587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
15589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.1 The {base type definition} must have a {variety} of union.
15591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * I.e. the variety of "list" is inherited.
15592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_IS_UNION(type->baseType)) {
15594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1,
15596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base type '%s' is not a union type",
15598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1);
15601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.2 The {final} of the {base type definition} must not contain restriction.
15604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(type->baseType,
15606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2,
15609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The 'final' of its base type '%s' must not contain 'restriction'",
15611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2);
15614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.3 The {member type definitions}, in order, must be validly
15617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the corresponding type definitions in the {base
15618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type definition}'s {member type definitions} given the empty set,
1561960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * as defined in Type Derivation OK (Simple) (�3.14.6).
15620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
15622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeLinkPtr baseMember;
15623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE: if the type is restricting, it has no local defined
15626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* member types and inherits the member types of the base type;
15627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* thus a check for equality can be skipped.
15628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Even worse: I cannot see a scenario where a restricting
15631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* union simple type can have other member types as the member
15632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* types of it's base type. This check seems not necessary with
15633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* respect to the derivation process in libxml2.
15634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* But necessary if constructing types with an API.
15635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->memberTypes != NULL) {
15637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    member = type->memberTypes;
15638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType);
15639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((member == NULL) && (baseMember != NULL)) {
15640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "different number of member types in base");
15642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (member != NULL) {
15644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (baseMember == NULL) {
15645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "different number of member types in base");
15647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if ((member->type != baseMember->type) &&
15648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
15649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				member->type, baseMember->type, 0) != 0)) {
15650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *strBMT = NULL, *strBT = NULL;
15651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPCustomErrExt(pctxt,
15653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3,
15654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_BASIC_CAST type, NULL,
15655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The member type %s is not validly "
15656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"derived from its corresponding member "
15657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"type %s of the base type %s",
15658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&str, member->type),
15659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&strBMT, baseMember->type),
15660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&strBT, type->baseType));
15661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
15662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(strBMT)
15663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(strBT)
15664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3);
15665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
15666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			member = member->next;
15667df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (baseMember != NULL)
15668df143a5041f03a22808b59c76698770b74692815Selim Gurun                            baseMember = baseMember->next;
15669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.4 Only pattern and enumeration facet components are
15674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * allowed among the {facets}.
15675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr facet;
15678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int ok = 1;
15679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
15683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
15684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalFacetListUnionErr(pctxt,
15685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4,
15686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				type, facet);
15687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ok = 0;
15688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ok == 0)
15692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4);
15693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.3.2.5) (same as 1.3.2)
15697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
15698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE (3.3.2.5) This is currently done in
15699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaDeriveAndValidateFacets()
15700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSRCSimpleType:
15709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1571260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Checks crc-simple-type constraints.
15713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied,
15715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not a positive error code and -1 on internal
15716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
15719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
15721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaTypePtr type)
15722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * src-simple-type.1 The corresponding simple type definition, if any,
15725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must satisfy the conditions set out in Constraints on Simple Type
1572660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.14.6).
1572760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
15728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_RESTRICTION(type)) {
15729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-simple-type.2 "If the <restriction> alternative is chosen,
15731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* either it must have a base [attribute] or a <simpleType> among its
15732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* [children], but not both."
15733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: This is checked in the parse function of <restriction>.
15734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1573660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*
15737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
15739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* src-simple-type.3 "If the <list> alternative is chosen, either it must have
15740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* an itemType [attribute] or a <simpleType> among its [children],
15741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* but not both."
15742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: This is checked in the parse function of <list>.
15744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1574560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (WXS_IS_UNION(type)) {
1574660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
15747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular().
15748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
15753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
15756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   if (ctxt->vctxt == NULL) {
15758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->vctxt = xmlSchemaNewValidCtxt(NULL);
15759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->vctxt == NULL) {
15760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, NULL,
15761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
15762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
15763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to create a temp. validation context.\n",
15764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
15765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
15766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Pass user data. */
15768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidErrors(ctxt->vctxt,
15769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->error, ctxt->warning, ctxt->errCtxt);
15770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
15771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->serror, ctxt->errCtxt);
15772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
15778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
15779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
15780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value,
15781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaValPtr *retVal,
15782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int fireErrors,
15783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int normalize,
15784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isNormalized);
15785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseCheckCOSValidDefault:
15788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context
15789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the default value
15791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: an optional node (the holder of the value)
15792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Element Default Valid (Immediate)
15794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (cos-valid-default)
15795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will be used by the parser only. For the validator there's
15796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an other version.
15797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied,
15799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not, a positive error code and -1 on internal
15800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
15804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr node,
15805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaTypePtr type,
15806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar *value,
15807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaValPtr *val)
15808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
15810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cos-valid-default:
15813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Element Default Valid (Immediate)
15814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For a string to be a valid default with respect to a type
15815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition the appropriate case among the following must be true:
15816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if WXS_IS_COMPLEX(type) {
15818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Complex type.
15820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "its {content type} must be a simple type definition
15822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* or mixed."
15823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
1582460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* type}'s particle must be �emptiable� as defined by
1582560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Particle Emptiable (�3.9.6)."
15826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_HAS_SIMPLE_CONTENT(type)) &&
15828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) {
15829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* NOTE that this covers (2.2.2) as well. */
15830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_VALID_DEFAULT_2_1,
15832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node,
15833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"For a string to be a valid default, the type definition "
15834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be a simple type or a complex type with mixed content "
15835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"and a particle emptiable", NULL);
15836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1);
15837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If the type definition is a simple type definition, then the string
1584160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be �valid� with respect to that definition as defined by String
1584260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Valid (�3.14.4).
15843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
15845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2.1 If the {content type} is a simple type definition, then the
1584760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * string must be �valid� with respect to that simple type definition
1584860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * as defined by String Valid (�3.14.4).
15849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(type))
15851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
15852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, val, 1, 1, 0);
15853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_HAS_SIMPLE_CONTENT(type))
15854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
15855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef, value, val, 1, 1, 0);
15856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
15857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
15858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
15860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseCheckCOSValidDefault",
15861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVCheckCVCSimpleType()");
15862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
15865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCTPropsCorrect:
15869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
15871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *.(4.6) Constraints on Complex Type Definition Schema Components
15873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
15874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Complex Type Definition Properties Correct (ct-props-correct)
15875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: (seems) complete
15876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
15878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
15879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
15882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily.
15886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The values of the properties of a complex type definition must
15888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be as described in the property tableau in The Complex Type Definition
1588960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Schema Component (�3.4.1), modulo the impact of Missing
1589060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
15891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->baseType != NULL) &&
15893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_SIMPLE(type->baseType)) &&
15894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_EXTENSION(type) == 0)) {
15895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If the {base type definition} is a simple type definition,
15897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the {derivation method} must be extension."
15898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomErr(ACTXT_CAST pctxt,
15900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_CT_1,
1590160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    NULL, WXS_BASIC_CAST type,
15902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "If the base type is a simple type, the derivation method must be "
15903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "'extension'", NULL, NULL);
15904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_SRC_CT_1);
15905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1590760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (3) "Circular definitions are disallowed, except for the �ur-type
1590860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�. That is, it must be possible to reach the �ur-type
15909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition by repeatedly following the {base type definition}."
15910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (3) is done in xmlSchemaCheckTypeDefCircular().
15912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that (4) and (5) need the following:
15915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - attribute uses need to be already inherited (apply attr. prohibitions)
15916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - attribute group references need to be expanded already
15917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - simple types need to be typefixed already
1591860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
15919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses &&
15920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1))
15921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
15922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses;
15923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUsePtr use, tmp;
15924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, hasId = 0;
15925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = uses->nbItems -1; i >= 0; i--) {
15927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use = uses->items[i];
1592860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1592960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
15930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ct-props-correct
15931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4) "Two distinct attribute declarations in the
15932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute uses} must not have identical {name}s and
15933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace}s."
15934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i > 0) {
15936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = i -1; j >= 0; j--) {
15937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = uses->items[j];
15938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
15939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(tmp)) &&
15940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(use) ==
15941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(tmp)))
15942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
15943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
15944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
15946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
15947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, WXS_BASIC_CAST type,
15948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Duplicate %s",
15949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
15950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
15951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
15952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
15953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate.
15954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
15955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
15956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto exit_failure;
15957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_use;
15958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ct-props-correct
15963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (5) "Two distinct attribute declarations in the
15964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute uses} must not have {type definition}s which
15965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are or are derived from ID."
15966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
15968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsDerivedFromBuiltInType(
15969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
1597060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
15971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (hasId) {
15972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1597360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
15975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
15976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, WXS_BASIC_CAST type,
15977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "There must not exist more than one attribute "
15978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "declaration of type 'xs:ID' "
15979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(or derived from 'xs:ID'). The %s violates this "
15980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "constraint",
15981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
15982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
15983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
15984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
15985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto exit_failure;
15986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1598760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasId = 1;
15989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_use: {}
15992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
15996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
15997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
16001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr typeB)
16002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This should implement component-identity
16005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * in the future.
16006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((typeA == NULL) || (typeB == NULL))
16008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (typeA == typeB);
16010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSCTDerivedOK:
16014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the to-be derived complex type definition
16016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base complex type definition
16017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the given set
16018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Complex) (cos-ct-derived-ok)
16021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: completed
16023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, or 1
16025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not.
16026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
16030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
16031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int set)
16032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int equal = xmlSchemaAreEqualTypes(type, baseType);
16034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes. */
16035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC "For a complex type definition (call it D, for derived)
16037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to be validly derived from a type definition (call this
16038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * B, for base) given a subset of {extension, restriction}
16039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * all of the following must be true:"
16040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! equal) {
16042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1) "If B and D are not the same type definition, then the
16044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {derivation method} of D must not be in the subset."
16045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) ||
16047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type))))
16048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
16049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "B and D must be the same type definition."
16052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2.2) "B must be D's {base type definition}."
16057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == baseType)
16059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1606160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type
1606260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�."
16063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANYTYPE(type->baseType))
16065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type->baseType)) {
16068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.3.2.1) "If D's {base type definition} is complex, then it
16070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be validly derived from B given the subset as defined by this
16071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* constraint."
16072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType,
16074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, set));
16075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.3.2.2) "If D's {base type definition} is simple, then it
16078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be validly derived from B given the subset as defined in Type
1607960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Derivation OK (Simple) (�3.14.6).
16080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
16082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, set));
16083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSDerivedOK:
16088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the derived simple type definition
16089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base type definition
16090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calls:
16092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Simple) AND Type Derivation OK (Complex)
16093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks wheter @type can be validly derived from @baseType.
16095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, an positive error code otherwise.
16097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type,
16101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr baseType,
16102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int set)
16103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(type))
16105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set));
16106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
16107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set));
16108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSCTExtends:
16112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.6) Constraints on Complex Type Definition Schema Components
16116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Extension) (cos-ct-extends)
16118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing:
16121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (1.5)
16122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (1.4.3.2.2.2) "Particle Valid (Extension)"
16123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
16129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type)
16130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base = type->baseType;
16132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used
16134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * temporarily only.
16135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "If the {base type definition} is a complex type definition,
16138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then all of the following must be true:"
16139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1614060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (WXS_IS_COMPLEX(base)) {
16141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.1) "The {final} of the {base type definition} must not
16143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* contain extension."
16144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'final' of the base type definition "
16150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"contains 'extension'", NULL);
16151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1615360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* ATTENTION: The constrains (1.2) and (1.3) are not applied,
16156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* since they are automatically satisfied through the
16157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* inheriting mechanism.
16158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that even if redefining components, the inheriting mechanism
16159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* is used.
16160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
16162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute
16164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* uses}
16165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the complex type definition itself, that is, for every attribute
16166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* use in the {attribute uses} of the {base type definition}, there
16167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be an attribute use in the {attribute uses} of the complex
16168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition itself whose {attribute declaration} has the same
16169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {name}, {target namespace} and {type definition} as its attribute
16170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* declaration"
16171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->attrUses != NULL) {
16173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, j, found;
16174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAttributeUsePtr use, buse;
16175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) {
16177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		buse = (WXS_LIST_CAST base->attrUses)->items[i];
16178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 0;
16179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attrUses != NULL) {
16180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    use = (WXS_LIST_CAST type->attrUses)->items[j];
16181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++)
16182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
16183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) ==
16184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_NAME(buse)) &&
16185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
16186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_TNS(buse)) &&
16187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_TYPEDEF(use) ==
16188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(buse))
16189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
16190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
16191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
16192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
16193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
16194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! found) {
16196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
1619760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
16199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_CT_EXTENDS_1_2,
16200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, WXS_BASIC_CAST type,
1620160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
16202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* TODO: The report does not indicate that also the
16203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* type needs to be the same.
16204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
16205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"This type is missing a matching correspondent "
16206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"for its {base type}'s %s in its {attribute uses}",
16207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentDesignation(&str,
16208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    buse->children),
16209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
16210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
16211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.3) "If it has an {attribute wildcard}, the complex type
16216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition must also have one, and the base type definition's
16217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {attribute  wildcard}'s {namespace constraint} must be a subset
16218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the complex  type definition's {attribute wildcard}'s {namespace
1621960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* constraint}, as defined by Wildcard Subset (�3.10.6)."
16220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1622160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* MAYBE TODO: Enable if ever needed. But this will be needed only
16224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if created the type via a schema construction API.
16225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->attributeWildcard != NULL) {
16227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->attributeWilcard == NULL) {
16228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
1622960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
16231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
16232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, type,
16233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base %s has an attribute wildcard, "
16234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "but this type is missing an attribute wildcard",
16235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&str, base));
16236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlSchemaCheckCOSNSSubset(
16239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		base->attributeWildcard, type->attributeWildcard))
16240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
16241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
1624260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
16244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
16245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, type,
16246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute wildcard is not a valid "
16247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "superset of the one in the base %s",
16248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&str, base));
16249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
16253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.4) "One of the following must be true:"
16255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->contentTypeDef != NULL) &&
16257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->contentTypeDef == base->contentTypeDef)) {
16258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.1) "The {content type} of the {base type definition}
16260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * and the {content type} of the complex type definition itself
16261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * must be the same simple type definition"
16262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
16265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
16266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.2) "The {content type} of both the {base type
16268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} and the complex type definition itself must
16269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be empty."
16270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.3) "All of the following must be true:"
16275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->subtypes == NULL) {
16277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC 1.4.3.1 The {content type} of the complex type
16279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition itself must specify a particle.
16280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The content type must specify a particle", NULL);
16285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.3.2) "One of the following must be true:"
16289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.4.3.2.1) "The {content type} of the {base type
16293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition} must be empty.
16294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* PASS
16295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.4.3.2.2) "All of the following must be true:"
16299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((type->contentType != base->contentType) ||
16301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
16302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
16303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed
16305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * or both must be element-only."
16306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
16307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
16308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
16310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The content type of both, the type and its base "
16311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"type, must either 'mixed' or 'element-only'", NULL);
16312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the
1631660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* complex type definition must be a �valid extension�
16317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of the {base type definition}'s particle, as defined
1631860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* in Particle Valid (Extension) (�3.9.6)."
16319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
16320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that we won't check "Particle Valid (Extension)",
16321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* since it is ensured by the derivation process in
16322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xmlSchemaTypeFixup(). We need to implement this when heading
16323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for a construction API
16324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: !! This is needed to be checked if redefining a type !!
16325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO (1.5)
16329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If the {base type definition} is a simple type definition,
16334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then all of the following must be true:"
16335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->contentTypeDef != base) {
16337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.1) "The {content type} must be the same simple type
16339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition."
16340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type must be the simple base type", NULL);
16345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.2) "The {final} of the {base type definition} must not
16350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain extension"
16351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that this is the same as (1.1).
16352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'final' of the base type definition "
16357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"contains 'extension'", NULL);
16358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckDerivationOKRestriction:
16366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.6) Constraints on Complex Type Definition Schema Components
16370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Restriction, Complex) (derivation-ok-restriction)
16372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing:
16375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (5.4.2) ???
16376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ATTENTION:
16378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In XML Schema 1.1 this will be:
16379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation Rule: Checking complex type subsumption
16380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
16386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaTypePtr type)
16387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base;
16389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used
16392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * temporarily only.
16393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    base = type->baseType;
16395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_COMPLEX(base)) {
1639660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCustomErr(ACTXT_CAST ctxt,
16397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->node, WXS_BASIC_CAST type,
16399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The base type must be a complex type", NULL, NULL);
16400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
16401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
16403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1) "The {base type definition} must be a complex type
16405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition whose {final} does not contain restriction."
16406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1640760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCustomErr(ACTXT_CAST ctxt,
16408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->node, WXS_BASIC_CAST type,
16410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The 'final' of the base type definition "
16411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "contains 'restriction'", NULL, NULL);
16412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
16413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2), (3) and (4)
16416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Those are handled in a separate function, since the
16417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * same constraints are needed for redefinition of
16418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * attribute groups as well.
16419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
16421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ACTION_DERIVE,
16422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST type, WXS_BASIC_CAST base,
16423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->attrUses, base->attrUses,
16424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->attributeWildcard,
16425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	base->attributeWildcard) == -1)
16426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
16427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
16428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (5) "One of the following must be true:"
16431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (base->builtInType == XML_SCHEMAS_ANYTYPE) {
16433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.1) "The {base type definition} must be the
1643560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �ur-type definition�."
16436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PASS
16437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.2.1) "The {content type} of the complex type definition
16442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a simple type definition"
16443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
16444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.2.2) "One of the following must be true:"
16445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_BASIC))
16448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
16449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int err;
16450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.2.2.1) "The {content type} of the {base type
16452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must be a simple type definition from which
16453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {content type} is validly derived given the empty
1645460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * set as defined in Type Derivation OK (Simple) (�3.14.6)."
16455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
16456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * ATTENTION TODO: This seems not needed if the type implicitely
16457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the base type.
1645860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *
16459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
16461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef, base->contentTypeDef, 0);
16462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (err != 0) {
16463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL;
16464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (err == -1)
16466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
16467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST ctxt,
16468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, WXS_BASIC_CAST type,
16470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The {content type} %s is not validly derived from the "
16471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type's {content type} %s",
16472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strA,
16473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->contentTypeDef),
16474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strB,
16475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			base->contentTypeDef));
16476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA);
16477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB);
16478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->err);
16479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaIsParticleEmptiable(
16482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaParticlePtr) base->subtypes))) {
16483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.2.2.2) "The {base type definition} must be mixed
1648560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * and have a particle which is �emptiable� as defined in
1648660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Particle Emptiable (�3.9.6)."
16487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type of the base type must be either "
16494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"a simple type or 'mixed' and an emptiable particle", NULL);
16495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.3.1) "The {content type} of the complex type itself must
16500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* be empty"
16501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.3.2.1) "The {content type} of the {base type
16505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must also be empty."
16506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
16510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIsParticleEmptiable(
16511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaParticlePtr) base->subtypes)) {
16512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.3.2.2) "The {content type} of the {base type
16514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must be elementOnly or mixed and have a particle
1651560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * which is �emptiable� as defined in Particle Emptiable (�3.9.6)."
16516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type of the base type must be either "
16523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"empty or 'mixed' (or 'elements-only') and an emptiable "
16524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"particle", NULL);
16525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_HAS_MIXED_CONTENT(type)) {
16529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.4.1.1) "The {content type} of the complex type definition
16531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* itself must be element-only"
1653260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
16533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) {
16534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.4.1.2) "The {content type} of the complex type
16536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition itself and of the {base type definition} must be
16537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * mixed"
16538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"If the content type is 'mixed', then the content type of the "
16543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"base type must also be 'mixed'", NULL);
16544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.4.2) "The particle of the complex type definition itself
1654860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* must be a �valid restriction� of the particle of the {content
16549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type} of the {base type definition} as defined in Particle Valid
1655060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (Restriction) (�3.9.6).
16551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
16552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: (5.4.2)
16553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
16556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
16558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The type is not a valid restriction of its base type", NULL);
16559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
16560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCTComponent:
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.6) Constraints on Complex Type Definition Schema Components
16570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
16576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
16577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
16579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Complex Type Definition Properties Correct
16581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckCTPropsCorrect(ctxt, type);
16583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
16584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
16585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_EXTENSION(type))
16586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaCheckCOSCTExtends(ctxt, type);
16587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
16588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type);
16589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
16590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSRCCT:
16594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.3) Constraints on XML Representations of Complex Type Definitions:
16598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Representation Constraint:
16599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Complex Type Definition Representation OK (src-ct)
16600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
16606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaTypePtr type)
16607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base;
16609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
16610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Adjust the error codes here, as I used
16613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMAP_SRC_CT_1 only yet.
16614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    base = type->baseType;
16616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_HAS_SIMPLE_CONTENT(type)) {
16617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1 If the <complexContent> alternative is chosen, the type definition
1661960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �resolved� to by the �actual value� of the base [attribute]
16620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a complex type definition;
16621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_IS_COMPLEX(base)) {
16623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
16624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_CT_1,
16626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node,
16627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"If using <complexContent>, the base type is expected to be "
16628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"a complex type. The base type '%s' is a simple type",
16629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, base->targetNamespace,
16630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		base->name));
16631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
16632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_SRC_CT_1);
16633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC
16637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2 If the <simpleContent> alternative is chosen, all of the
16638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* following must be true:
1663960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 2.1 The type definition �resolved� to by the �actual value� of the
16640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* base [attribute] must be one of the following:
16641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(base)) {
16643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_EXTENSION(type) == 0) {
16644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
16645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.3 only if the <extension> alternative is also
16647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chosen, a simple type definition.
16648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Change error code to ..._SRC_CT_2_1_3. */
16650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If using <simpleContent> and <restriction>, the base "
16654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type must be a complex type. The base type '%s' is "
16655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "a simple type",
16656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			base->name));
16658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_SRC_CT_1);
16660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Base type is a complex type. */
16663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.1 a complex type definition whose {content type} is a
16667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* simple type definition;
16668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* PASS
16669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (base->contentTypeDef == NULL) {
16671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL,
16672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
16673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Internal error: xmlSchemaCheckSRCCT, "
16674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'%s', base type has no content type",
16675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->name);
16676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
16677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_IS_RESTRICTION(type))) {
16680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.2 only if the <restriction> alternative is also
16683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chosen, a complex type definition whose {content type}
16684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is mixed and a particle emptiable.
16685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaIsParticleEmptiable(
16687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaParticlePtr) base->subtypes)) {
16688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_SRC_CT_1;
1668960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else
16690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attention: at this point the <simpleType> child is in
16692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * ->contentTypeDef (put there during parsing).
1669360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
16694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->contentTypeDef == NULL) {
16695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
16696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 2.2 If clause 2.1.2 above is satisfied, then there
16698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * must be a <simpleType> among the [children] of
16699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <restriction>.
16700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
16701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: Change error code to ..._SRC_CT_2_2. */
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			"A <simpleType> is expected among the children "
16706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"of <restriction>, if <simpleContent> is used and "
16707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"the base type '%s' 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		    FREE_AND_NULL(str)
16711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_SRC_CT_1);
16712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_SRC_CT_1;
16715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret > 0) {
16718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
16719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_RESTRICTION(type)) {
16720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If <simpleContent> and <restriction> is used, the "
16724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type must be a simple type or a complex type with "
16725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mixed content and particle emptiable. The base type "
16726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'%s' is none of those",
16727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base->name));
16729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If <simpleContent> and <extension> is used, the "
16734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type must be a simple type. The base type '%s' "
16735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "is a complex type",
16736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base->name));
16738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
16740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3) "The corresponding complex type definition component must
16744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * satisfy the conditions set out in Constraints on Complex Type
1674560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.4.6);"
16746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (3) will be done in xmlSchemaTypeFixup().
16747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification
16750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * above for {attribute wildcard} is satisfied, the intensional
16751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * intersection must be expressible, as defined in Attribute Wildcard
1675260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Intersection (�3.10.6).
16753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses().
16754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
16756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_PARTICLE_RESTRICTION
16759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckParticleRangeOK:
16761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Occurrence Range OK (range-ok)
16767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckParticleRangeOK(int rmin, int rmax,
16775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int bmin, int bmax)
16776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (rmin < bmin)
16778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bmax != UNBOUNDED) &&
16780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(rmax > bmax))
16781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNameAndTypeOK:
16787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base element declaration particle
16790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Restriction OK (Elt:Elt -- NameAndTypeOK)
16794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NameAndTypeOK)
16795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   MISSING (3.2.3)
16798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CLARIFY: (3.2.2)
16799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
16805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr r,
16806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr b)
16807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemR, elemB;
16809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NameAndTypeOK). */
16811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemR = (xmlSchemaElementPtr) r->children;
16812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemB = (xmlSchemaElementPtr) b->children;
16813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The declarations' {name}s and {target namespace}s are
16815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the same."
16816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemR != elemB) &&
16818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((! xmlStrEqual(elemR->name, elemB->name)) ||
16819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
16820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's occurrence range is a valid restriction of B's
1682360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
16827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's
16830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {scope} are global."
16831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemR == elemB)
16833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false."
16836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
16838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
16839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.2) "either B's declaration's {value constraint} is absent,
16842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * or is not fixed, or R's declaration's {value constraint} is fixed
16843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * with the same value."
16844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
16846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemR->value == NULL) ||
16847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
16848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 /* TODO: Equality of the initial value or normalized or canonical? */
16849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (! xmlStrEqual(elemR->value, elemB->value))))
16850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint
16853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definitions} is a subset of B's declaration's {identity-constraint
16854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definitions}, if any."
16855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemB->idcs != NULL) {
16857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO */
16858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a
16861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * superset of B's declaration's {disallowed substitutions}."
16862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
16864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
16865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
16866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
16867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
16868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
16869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.5) "R's {type definition} is validly derived given
16872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {extension, list, union} from B's {type definition}"
16873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
16874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * BADSPEC TODO: What's the point of adding "list" and "union" to the
16875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * set, if the corresponding constraints handle "restriction" and
16876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "extension" only?
16877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
16878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
16880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int set = 0;
16881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_EXTENSION;
16883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_LIST;
16884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_UNION;
16885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
16886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemB->subtypes, set) != 0)
16887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
16888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSCompat:
16894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
16897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Elt:Any -- NSCompat)
16901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSCompat)
16902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
16910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr r,
16911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr b)
16912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:Error codes (rcase-NSCompat). */
16914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1691560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For an element declaration particle to be a �valid restriction�
16916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a wildcard particle all of the following must be true:"
16917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
1691860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (1) "The element declaration's {target namespace} is �valid�
16919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * with respect to the wildcard's {namespace constraint} as defined by
1692060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Wildcard allows Namespace Name (�3.10.4)."
16921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children,
16923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((xmlSchemaElementPtr) r->children)->targetNamespace) != 0)
16924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's occurrence range is a valid restriction of B's
1692760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
16931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseRecurseAsIfGroup:
16938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base model group particle
16941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)
16945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-RecurseAsIfGroup)
16946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO
16948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
16954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr r,
16955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr b)
16956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-RecurseAsIfGroup). */
16958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
16959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSSubset:
16964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting wildcard particle
16966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
16967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Any:Any -- NSSubset)
16971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSSubset)
16972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
16980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr r,
16981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr b,
16982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int isAnyTypeBase)
16983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NSSubset). */
16985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "R's occurrence range is a valid restriction of B's
1698760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs))
16991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's {namespace constraint} must be an intensional subset
1699460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)."
16995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children,
16997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaWildcardPtr) b->children))
16998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1700060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (3) "Unless B is the content model wildcard of the �ur-type
1700160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�, R's {process contents} must be identical to or stronger
17002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * than B's {process contents}, where strict is stronger than lax is
17003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * stronger than skip."
17004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isAnyTypeBase) {
17006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( ((xmlSchemaWildcardPtr) r->children)->processContents <
17007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlSchemaWildcardPtr) b->children)->processContents)
17008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
17009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
17015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSParticleRestrict:
17016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
17017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
17018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
17020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
17021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Valid (Restriction) (cos-particle-restrict)
17022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO
17024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
17026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
17027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
17030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParticlePtr r,
17031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParticlePtr b)
17032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
17034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*part = WXS_TYPE_PARTICLE(type);
17036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    basePart = WXS_TYPE_PARTICLE(base);
17037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
17040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "They are the same particle."
17043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (r == b)
17045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1705160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if 0
17052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
17053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSRecurseCheckCardinality:
17054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
17055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the model group particle
17056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
17057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
17059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
17060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (All/Choice/Sequence:Any --
17061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                         NSRecurseCheckCardinality)
17062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSRecurseCheckCardinality)
17063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO: subst-groups
17065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
17067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
17068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
17071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaParticlePtr r,
17072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaParticlePtr b)
17073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr part;
17075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */
17076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((r->children == NULL) || (r->children->children == NULL))
17077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
17078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1707960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For a group particle to be a �valid restriction� of a
17080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard particle..."
17081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
1708260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (1) "Every member of the {particles} of the group is a �valid
1708360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of the wildcard as defined by
1708460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Particle Valid (Restriction) (�3.9.6)."
17085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    part = (xmlSchemaParticlePtr) r->children->children;
17087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
17088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b))
17089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
17090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	part = (xmlSchemaParticlePtr) part->next;
17091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (part != NULL);
17092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "The effective total range of the group [...] is a
17094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * valid restriction of B's occurrence range as defined by
1709560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Occurrence Range OK (�3.9.6)."
17096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(
17098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetParticleTotalRangeMin(r),
17099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetParticleTotalRangeMax(r),
17100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
17101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
17102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1710460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
17105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
17107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseRecurse:
17108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
17109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the <all> or <sequence> model group particle
17110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base <all> or <sequence> model group particle
17111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
17113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
17114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (All:All,Sequence:Sequence --
17115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           Recurse)
17116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-Recurse)
17117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:  ?
17119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: subst-groups
17120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
17122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
17123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
17126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParticlePtr r,
17127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParticlePtr b)
17128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaParticlePtr part; */
17130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-Recurse). */
17131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((r->children == NULL) || (b->children == NULL) ||
17132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(r->children->type != b->children->type))
17133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
17134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1713560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For an all or sequence group particle to be a �valid
1713660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of another group particle with the same {compositor}..."
17137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "R's occurrence range is a valid restriction of B's
1713960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
17140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
17142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs))
17143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
17144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
17150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
17152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErrExt(pctxt,      \
17153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac1, fac1->node, \
17155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"It is an error for both '%s' and '%s' to be specified on the "\
17156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"same type definition", \
17157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
17158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
17159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_ERR(fac1, msg) \
17161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt,      \
17162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac1, fac1->node, \
17164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, NULL);
17165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_FIXED_ERR(fac) \
17167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt, \
17168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac, fac->node, \
17170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"The base type's facet is 'fixed', thus the value must not " \
17171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"differ", NULL);
17172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
17175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetPtr facet1,
17176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetPtr facet2,
17177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int lessGreater,
17178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int orEqual,
17179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ofBase)
17180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
17182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "'");
17184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type));
17185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "' has to be");
17186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lessGreater == 0)
17187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " equal to");
17188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lessGreater == 1)
17189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " greater than");
17190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
17191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " less than");
17192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (orEqual)
17194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " or equal to");
17195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST " '");
17196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type));
17197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ofBase)
17198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "' of the base type");
17199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
17200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'");
17201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt,
17203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE,
17204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST facet1, NULL,
17205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, NULL);
17206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg != NULL)
17208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(msg);
17209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
17212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaDeriveAndValidateFacets:
17213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
17214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Schema Component Constraint: Simple Type Restriction (Facets)
17215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* (st-restrict-facets)
17216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
17217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
17219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
17220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base = type->baseType;
17222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetLinkPtr link, cur, last = NULL;
17223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet, bfacet,
17224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flength = NULL, ftotdig = NULL, ffracdig = NULL,
17225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fmaxlen = NULL, fminlen = NULL, /* facets of the current type */
17226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fmininc = NULL, fmaxinc = NULL,
17227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fminexc = NULL, fmaxexc = NULL,
17228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bflength = NULL, bftotdig = NULL, bffracdig = NULL,
17229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */
17230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfmininc = NULL, bfmaxinc = NULL,
17231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfminexc = NULL, bfmaxexc = NULL;
17232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res; /* err = 0, fixedErr; */
17233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 1:
1723660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * "The {variety} of R is the same as that of B."
17237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 2:
17240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "If {variety} is atomic, the {primitive type definition}
17241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of R is the same as that of B."
17242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: we leave 1 & 2 out for now, since this will be
17244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * satisfied by the derivation process.
17245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * CONSTRUCTION TODO: Maybe needed if using a construction API.
17246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 3:
17249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The {facets} of R are the union of S and the {facets}
17250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of B, eliminating duplicates. To eliminate duplicates,
17251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * when a facet of the same kind occurs in both S and the
17252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {facets} of B, the one in the {facets} of B is not
17253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * included, with the exception of enumeration and pattern
17254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * facets, for which multiple occurrences with distinct values
17255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * are allowed."
17256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->facetSet == NULL) && (base->facetSet == NULL))
17259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = type->facetSet;
17262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (last != NULL)
17263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (last->next != NULL)
17264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = last->next;
17265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = type->facetSet; cur != NULL; cur = cur->next) {
17267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = cur->facet;
17268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facet->type) {
17269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
17270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		flength = facet; break;
17271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
17272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fminlen = facet; break;
17273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MININCLUSIVE:
17274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmininc = facet; break;
17275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
17276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fminexc = facet; break;
17277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
17278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxlen = facet; break;
17279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
17280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxinc = facet; break;
17281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxexc = facet; break;
17283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_TOTALDIGITS:
17284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ftotdig = facet; break;
17285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
17286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ffracdig = facet; break;
17287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
17288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
17292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = cur->facet;
17293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facet->type) {
17294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
17295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bflength = facet; break;
17296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
17297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfminlen = facet; break;
17298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MININCLUSIVE:
17299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmininc = facet; break;
17300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
17301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfminexc = facet; break;
17302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
17303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxlen = facet; break;
17304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
17305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxinc = facet; break;
17306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxexc = facet; break;
17308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_TOTALDIGITS:
17309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bftotdig = facet; break;
17310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
17311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bffracdig = facet; break;
17312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
17313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * length and minLength or maxLength (2.2) + (3.2)
17318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength && (fminlen || fmaxlen)) {
17320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_ERR(flength, "It is an error for both 'length' and "
17321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "either of 'minLength' or 'maxLength' to be specified on "
17322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the same type definition")
17323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mutual exclusions in the same derivation step.
17326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((fmaxinc) && (fmaxexc)) {
17328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxInclusive and maxExclusive"
17330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
17332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((fmininc) && (fminexc)) {
17334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "minInclusive and minExclusive"
17336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
17338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength && bflength) {
17341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "length valid restriction"
17343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The values have to be equal.
17344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(flength->val, bflength->val);
17346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0)
17349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
17350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bflength->fixed)) {
17351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(flength)
17352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fminlen && bfminlen) {
17356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "minLength valid restriction"
17358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* minLength >= BASE minLength
17359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
17361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1)
17364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
17365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bfminlen->fixed)) {
17366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(fminlen)
17367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxlen && bfmaxlen) {
17370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxLength valid restriction"
17372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* maxLength <= BASE minLength
17373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
17375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
17379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bfmaxlen->fixed)) {
17380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(fmaxlen)
17381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SCC "length and minLength or maxLength"
17385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! flength)
17387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flength = bflength;
17388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength) {
17389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! fminlen)
17390df143a5041f03a22808b59c76698770b74692815Selim Gurun	    fminlen = bfminlen;
17391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fminlen) {
17392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* (1.1) length >= minLength */
17393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(flength->val, fminlen->val);
17394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1)
17397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
17398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! fmaxlen)
17400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fmaxlen = bfmaxlen;
17401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxlen) {
17402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* (2.1) length <= maxLength */
17403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
17404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1)
17407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
17408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxinc) {
17411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxInclusive"
17413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmininc) {
17415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* SCC "maxInclusive >= minInclusive" */
17416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
17417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
17421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxInclusive valid restriction"
17425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive <= BASE maxInclusive */
17428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
17429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1)
17432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
17433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmaxinc->fixed)) {
17434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmaxinc)
17435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive < BASE maxExclusive */
17439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
17440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
17444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive >= BASE minInclusive */
17448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
17449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
17453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive > BASE minExclusive */
17457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
17458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
17462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxexc) {
17466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxExclusive >= minExclusive"
17468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fminexc) {
17470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
17471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
17475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxExclusive valid restriction"
17479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive <= BASE maxExclusive */
17482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
17483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
17487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmaxexc->fixed)) {
17489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmaxexc)
17490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive <= BASE maxInclusive */
17494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
17495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
17499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive > BASE minInclusive */
17503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
17504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
17508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive > BASE minExclusive */
17512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
17513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
17517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fminexc) {
17521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive < maxInclusive"
17523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxinc) {
17525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
17526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
17530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive valid restriction"
17534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive >= BASE minExclusive */
17537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
17538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
17542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfminexc->fixed)) {
17544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fminexc)
17545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive <= BASE maxInclusive */
17549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
17550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
17554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive >= BASE minInclusive */
17558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
17559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
17563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive < BASE maxExclusive */
17567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
17568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
17572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmininc) {
17576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minInclusive < maxExclusive"
17578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxexc) {
17580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
17581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
17585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive valid restriction"
17589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive >= BASE minInclusive */
17592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
17593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
17597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmininc->fixed)) {
17599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmininc)
17600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive <= BASE maxInclusive */
17604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
17605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
17609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive > BASE minExclusive */
17613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
17614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1)
17617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
17618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive < BASE maxExclusive */
17621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
17622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1)
17625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
17626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ftotdig && bftotdig) {
17629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC " totalDigits valid restriction"
17631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* totalDigits <= BASE totalDigits
17632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
17634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
17638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1, 1, 1);
17639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bftotdig->fixed)) {
17640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(ftotdig)
17641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ffracdig && bffracdig) {
17644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC  "fractionDigits valid restriction"
17646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* fractionDigits <= BASE fractionDigits
17647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
17649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
17653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1, 1, 1);
17654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bffracdig->fixed)) {
17655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(ffracdig)
17656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SCC "fractionDigits less than or equal to totalDigits"
17660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! ftotdig)
17662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ftotdig = bftotdig;
17663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! ffracdig)
17664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ffracdig = bffracdig;
17665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ftotdig && ffracdig) {
17666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
17667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
17671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, 1, 0);
17672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *Enumerations* won' be added here, since only the first set
17675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of enumerations in the ancestor-or-self axis is used
17676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for validation, plus we need to use the base type of those
17677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * enumerations for whitespace.
17678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *Patterns*: won't be add here, since they are ORed at
17680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * type level and ANDed at ancestor level. This will
17681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * happed during validation by walking the base axis
17682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the type.
17683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
17685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfacet = cur->facet;
17686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Special handling of enumerations and patterns.
17688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: hmm, they should not appear in the set, so remove this.
17689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
17691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
17692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
17693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Search for a duplicate facet in the current type.
17695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = type->facetSet;
17697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* err = 0; */
17698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* fixedErr = 0; */
17699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (link != NULL) {
17700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = link->facet;
17701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == bfacet->type) {
17702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (facet->type) {
17703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMA_FACET_WHITESPACE:
17704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
17705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* The whitespace must be stronger.
17706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
17707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (facet->whitespace < bfacet->whitespace) {
1770860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    FACET_RESTR_ERR(facet,
17709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The 'whitespace' value has to be equal to "
17710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"or stronger than the 'whitespace' value of "
17711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"the base type")
17712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((bfacet->fixed) &&
17714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (facet->whitespace != bfacet->whitespace)) {
17715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FACET_RESTR_FIXED_ERR(facet)
17716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
17718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    default:
17719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
17720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Duplicate found. */
17722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
17725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If no duplicate was found: add the base types's facet
17728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to the set.
17729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (link == NULL) {
17731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = (xmlSchemaFacetLinkPtr)
17732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlMalloc(sizeof(xmlSchemaFacetLink));
17733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (link == NULL) {
17734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPErrMemory(pctxt,
17735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "deriving facets, creating a facet link", NULL);
17736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
17737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->facet = cur->facet;
17739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->next = NULL;
17740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (last == NULL)
17741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->facetSet = link;
17742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
17743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last->next = link;
17744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = link;
17745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
17751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PERROR_INT("xmlSchemaDeriveAndValidateFacets",
17752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"an error occured");
17753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
17754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
17758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaTypePtr type)
17759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink;
17761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The actual value is then formed by replacing any union type
1776360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition in the �explicit members� with the members of their
17764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {member type definitions}, in order.
17765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: There's a bug entry at
17767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html"
17768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which indicates that we'll keep the union types the future.
17769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    link = type->memberTypes;
17771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
17772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED(link->type))
17774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt);
17775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_UNION(link->type)) {
17777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type);
17778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (subLink != NULL) {
17779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = subLink->type;
17780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (subLink->next != NULL) {
17781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastLink = link->next;
17782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    subLink = subLink->next;
17783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prevLink = link;
17784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (subLink != NULL) {
17785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink = (xmlSchemaTypeLinkPtr)
17786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlMalloc(sizeof(xmlSchemaTypeLink));
17787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (newLink == NULL) {
17788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPErrMemory(pctxt, "allocating a type link",
17789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
17790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
17791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink->type = subLink->type;
17793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prevLink->next = newLink;
17794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prevLink = newLink;
17795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink->next = lastLink;
17796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			subLink = subLink->next;
17798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
17799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = link->next;
17803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type)
1780960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
17810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int has = 0, needVal = 0, normVal = 0;
17811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    has	= (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
17813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has) {
17814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	needVal = (type->baseType->flags &
17815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
17816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	normVal = (type->baseType->flags &
17817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
17818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facets != NULL) {
17820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr fac;
1782160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (fac = type->facets; fac != NULL; fac = fac->next) {
17823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (fac->type) {
17824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_WHITESPACE:
17825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_PATTERN:
17827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    normVal = 1;
17828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_ENUMERATION:
17831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    needVal = 1;
17832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    normVal = 1;
17833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
17836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1783960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
17840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normVal)
17842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
17843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (needVal)
17844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has)
17846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
17847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has && (! needVal) && WXS_IS_ATOMIC(type)) {
17849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type);
17850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* OPTIMIZE VAL TODO: Some facets need a computed value.
17852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
17854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (prim->builtInType != XML_SCHEMAS_STRING)) {
17855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
1785660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1785760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
17858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type)
17862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1786360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1786460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the whitespace-facet value.
1786760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
17868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type)) {
17869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type))
17872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
1787360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet != NULL) {
17875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetLinkPtr lin;
17876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (lin = type->facetSet; lin != NULL; lin = lin->next) {
17878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
17879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (lin->facet->whitespace) {
17880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_PRESERVE:
17881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_REPLACE:
17884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_COLLAPSE:
17887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
17890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
17891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
17893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1789760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * For all �atomic� datatypes other than string (and types �derived�
1789860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * by �restriction� from it) the value of whiteSpace is fixed to
17899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * collapse
17900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
17902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr anc;
17903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1790460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	for (anc = type->baseType; anc != NULL &&
17905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		anc->builtInType != XML_SCHEMAS_ANYTYPE;
17906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		anc = anc->baseType) {
17907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (anc->type == XML_SCHEMA_TYPE_BASIC) {
1790960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
17910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
1791360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
17914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
17917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
17927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
17928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
17930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
17931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED_1(type))
17932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
17933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
17934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type)) {
17936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><list>...
17938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->subtypes == NULL) {
17940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one is really needed, so get out.
17942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"list type has no item-type assigned");
17945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
17946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
17948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><union>...
1795060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
17951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->memberTypes == NULL) {
17952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one is really needed, so get out.
17954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"union type has no member-types assigned");
17957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1795860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1795960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
17960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><restriction>...
17962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseType == NULL) {
17964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type has no base-type assigned");
17966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
17967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType))
17969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1)
17970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
17971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Variety
17973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If the <restriction> alternative is chosen, then the
17974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {variety} of the {base type definition}.
17975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_ATOMIC(type->baseType))
17977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
17978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (WXS_IS_LIST(type->baseType)) {
17979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
17980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Inherit the itemType.
17982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = type->baseType->subtypes;
17984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_UNION(type->baseType)) {
17985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
17986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that we won't assign the memberTypes of the base,
17988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * since this will make trouble when freeing them; we will
17989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * use a lookup function to access them instead.
17990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
17994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
17997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt,
17999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type)
18000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->node != NULL) {
18002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
18003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Type of %s : %s:%d :", name,
18004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        type->node->doc->URL,
18005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGetLineNo(type->node));
18006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
18007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "Type of %s :", name);
18008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) {
18010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (type->contentType) {
18011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_SIMPLE:
18012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "simple\n");
18013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_ELEMENTS:
18015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "elements\n");
18016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_UNKNOWN:
18018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "unknown !!!\n");
18019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_EMPTY:
18021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "empty\n");
18022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_MIXED:
18024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr)
18025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes))
18026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
18027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"mixed as emptiable particle\n");
18028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
18029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext, "mixed\n");
18030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Removed, since not used. */
18032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
18034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "mixed or elems\n");
18035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_BASIC:
18038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "basic\n");
18039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
18041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
18042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "not registered !!!\n");
18043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
18050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.14.6 Constraints on Simple Type Definition Schema Components
18051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
18052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
18054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
18055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, olderrs = pctxt->nberrors;
18057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
18059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
18060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
18066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == NULL) {
18068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo",
18069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "missing baseType");
18070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
18071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(type->baseType))
18073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt);
1807460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
18075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If a member type of a union is a union itself, we need to substitute
18076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * that member type for its member types.
18077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that this might change in WXS 1.1; i.e. we will keep the union
18078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * types in WXS 1.1.
18079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->memberTypes != NULL) &&
18081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1))
1808260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
18083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1808460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC src-simple-type 1
18085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The corresponding simple type definition, if any, must satisfy
18086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the conditions set out in Constraints on Simple Type Definition
1808760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Schema Components (�3.14.6)."
18088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Definition Properties Correct
18091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (st-props-correct)
18092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckSTPropsCorrect(pctxt, type);
18094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
1809560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
18096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Derivation Valid (Restriction, Simple)
18097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (cos-st-restricts)
18098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckCOSSTRestricts(pctxt, type);
18100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Removed the error report, since it got annoying to get an
18103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * extra error report, if anything failed until now.
18104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Enable this if needed.
18105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
18106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaPErr(ctxt, type->node,
18107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
18108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    "Simple type '%s' does not satisfy the constraints "
18109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    "on simple type definitions.\n",
18110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    type->name, NULL);
18111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Restriction (Facets)
18114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (st-restrict-facets)
18115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckFacetValues(type, pctxt);
18117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->facetSet != NULL) ||
18119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->baseType->facetSet != NULL)) {
18120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaDeriveAndValidateFacets(pctxt, type);
18121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE HERROR
18122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Whitespace value.
18125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaTypeFixupWhitespace(type);
18127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
1812860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypeFixupOptimFacets(type);
18129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
18131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
18147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
18148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, olderrs = pctxt->nberrors;
18150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = type->baseType;
18151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType == NULL) {
18156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupComplexType",
18157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "missing baseType");
18158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
1815960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
18160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fixup the base type.
18162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
18164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
18165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
18166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip fixup if the base type is invalid.
18168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Generate a warning!
18169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1817160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
18172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This basically checks if the base type can be derived.
18174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckSRCCT(pctxt, type);
1817660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    HFAILURE HERROR
18177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fixup the content type.
18179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
18181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent>...
18183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_IS_COMPLEX(baseType)) &&
18185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (baseType->contentTypeDef != NULL) &&
18186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (WXS_IS_RESTRICTION(type))) {
18187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr contentBase, content;
18188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
18189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char buf[30];
18190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *tmpname;
18191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1) If <restriction> + base type is <complexType>,
18194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "whose own {content type} is a simple type..."
18195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentTypeDef != NULL) {
18197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.1) "the simple type definition corresponding to the
18199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <simpleType> among the [children] of <restriction> if there
18200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is one;"
18201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Note that this "<simpleType> among the [children]" was put
18202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* into ->contentTypeDef during parsing.
18203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contentBase = type->contentTypeDef;
18205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef = NULL;
18206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.2) "...otherwise (<restriction> has no <simpleType>
18209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* among its [children]), the simple type definition which
18210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is the {content type} of the ... base type."
18211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contentBase = baseType->contentTypeDef;
18213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC
18216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "... a simple type definition which restricts the simple
18217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type definition identified in clause 1.1 or clause 1.2
18218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * with a set of facet components"
18219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
18220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create the anonymous simple type, which will be the content
18221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type of the complex type.
18222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
18224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buf, 29, "#scST%d", ++(pctxt->counter));
18225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1);
18226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlSchemaAddType(pctxt, pctxt->schema,
18227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace,
18228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->node, 0);
18229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
18230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlSchemaAddType(pctxt, pctxt->schema,
18231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace,
18232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->node, 0);
18233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (content == NULL)
18235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will use the same node as for the <complexType>
18238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to have it somehow anchored in the schema doc.
18239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->type = XML_SCHEMA_TYPE_SIMPLE;
18241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->baseType = contentBase;
18242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Move the facets, previously anchored on the
18244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * complexType during parsing.
18245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->facets = type->facets;
18247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->facets = NULL;
18248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->facetSet = type->facetSet;
18249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->facetSet = NULL;
1825060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = content;
18252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(contentBase))
18253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
18254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fixup the newly created type. We don't need to check
18256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * for circularity here.
18257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content);
1825960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    HFAILURE HERROR
18260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content);
1826160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    HFAILURE HERROR
1826260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_COMPLEX(baseType)) &&
18264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
18265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (WXS_IS_RESTRICTION(type))) {
18266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2) If <restriction> + base is a mixed <complexType> with
18268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * an emptiable particle, then a simple type definition which
18269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * restricts the <restriction>'s <simpleType> child.
18270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type->contentTypeDef == NULL) ||
18272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(type->contentTypeDef->baseType == NULL)) {
18273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check if this ever happens.
18275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
18277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_INTERNAL,
18278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
18279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Internal error: xmlSchemaTypeFixup, "
18280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "complex type '%s': the <simpleContent><restriction> "
18281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "is missing a <simpleType> child, but was not catched "
18282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "by xmlSchemaCheckSRCCT()", type->name);
18283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) {
18286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3) If <extension> + base is <complexType> with
18288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * <simpleType> content, "...then the {content type} of that
18289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * complex type definition"
18290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (baseType->contentTypeDef == NULL) {
18292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check if this ever happens. xmlSchemaCheckSRCCT
18294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* should have catched this already.
18295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
18297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_INTERNAL,
18298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
18299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Internal error: xmlSchemaTypeFixup, "
18300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "complex type '%s': the <extension>ed base type is "
18301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "a complex type with no simple content type",
18302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->name);
18303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = baseType->contentTypeDef;
18306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) {
18307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (4) <extension> + base is <simpleType>
18309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "... then that simple type definition"
18310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = baseType;
18312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Check if this ever happens.
18315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
18317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
18318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
18319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaTypeFixup, "
18320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"complex type '%s' with <simpleContent>: unhandled "
18321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"derivation case", type->name);
18322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
18323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
18325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int dummySequence = 0;
18326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle =
18327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) type->subtypes;
18328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent>...
18330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
18331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that the effective mixed was already set during parsing of
18332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType> and <complexContent>; its flag value is
18333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML_SCHEMAS_TYPE_MIXED.
18334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
18335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compute the "effective content":
18336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (2.1.1) + (2.1.2) + (2.1.3)
18337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((particle == NULL) ||
18339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
18340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
18341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
18342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
18343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (particle->minOccurs == 0))) &&
18344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) {
18345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_MIXED) {
18346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1834760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* SPEC (2.1.4) "If the �effective mixed� is true, then
18348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* a particle whose properties are as follows:..."
18349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
18350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Empty sequence model group with
18351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* minOccurs/maxOccurs = 1 (i.e. a "particle emptiable").
18352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that we sill assign it the <complexType> node to
18353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* somehow anchor it in the doc.
18354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((particle == NULL) ||
18356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
18357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the particle.
18359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = xmlSchemaAddParticle(pctxt,
18361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node, 1, 1);
18362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle == NULL)
18363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the model group.
18366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */ /* URGENT TODO: avoid adding to pending items. */
18367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children = (xmlSchemaTreeItemPtr)
18368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SEQUENCE, type->node);
18370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children == NULL)
18371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
1837260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes = (xmlSchemaTypePtr) particle;
18374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dummySequence = 1;
18376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (2.1.5) "otherwise empty"
18380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = XML_SCHEMA_CONTENT_EMPTY;
18382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.2) "otherwise the particle corresponding to the
18386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * <all>, <choice>, <group> or <sequence> among the
18387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [children]."
18388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compute the "content type".
18393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
18395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.1) "If <restriction>..."
18397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1.1) + (3.1.2) */
18398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
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	    }
18402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.2) "If <extension>..."
18405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.1)
1840960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* "If the �effective content� is empty, then the
18410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  {content type} of the [...] base ..."
18411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = baseType->contentType;
18413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->subtypes = baseType->subtypes;
18414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fixes bug #347316:
18416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This is the case when the base type has a simple
18417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type definition as content.
18418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef = baseType->contentTypeDef;
18420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that the effective mixed is ignored here.
18422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.2)
18426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
18428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
18429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.3)
18432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
18434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
18435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * "A model group whose {compositor} is sequence and whose
18437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * {particles} are..."
18438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_PARTICLE(type) != NULL) &&
18440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_PARTICLE_TERM(type) != NULL) &&
18441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((WXS_TYPE_PARTICLE_TERM(type))->type ==
18442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_ALL))
18443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
18444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC cos-all-limited (1)
18446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
18449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
18450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(type), NULL,
18451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The type has an 'all' model group in its "
18452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"{content type} and thus cannot be derived from "
18453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"a non-empty type, since this would produce a "
18454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'sequence' model group containing the 'all' "
18455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"model group; 'all' model groups are not "
18456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allowed to appear inside other model groups",
18457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
18458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((WXS_TYPE_PARTICLE(baseType) != NULL) &&
18460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) &&
18461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((WXS_TYPE_PARTICLE_TERM(baseType))->type ==
18462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_ALL))
18463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
18464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC cos-all-limited (1)
18466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
18469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
18470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(type), NULL,
18471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"A type cannot be derived by extension from a type "
18472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"which has an 'all' model group in its "
18473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"{content type}, since this would produce a "
18474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'sequence' model group containing the 'all' "
18475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"model group; 'all' model groups are not "
18476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allowed to appear inside other model groups",
18477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
18478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (! dummySequence) {
18480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaTreeItemPtr effectiveContent =
18481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) type->subtypes;
18482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the particle.
18484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = xmlSchemaAddParticle(pctxt,
18486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node, 1, 1);
18487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle == NULL)
18488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the "sequence" model group.
18491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children = (xmlSchemaTreeItemPtr)
18493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SEQUENCE, type->node);
18495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children == NULL)
18496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle;
18498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC "the particle of the {content type} of
18500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the ... base ..."
18501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create a duplicate of the base type's particle
18502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * and assign its "term" to it.
18503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children->children =
18505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
18506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node,
1850794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs,
1850894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs);
18509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children->children == NULL)
18510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = (xmlSchemaParticlePtr)
18512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			particle->children->children;
18513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children =
18514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParticlePtr) baseType->subtypes)->children;
18515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1851660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * SPEC "followed by the �effective content�."
18517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->next = effectiveContent;
18519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This all will result in:
18521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * new-particle
18522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   --> new-sequence(
18523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *         new-particle
18524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *           --> base-model,
18525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *         this-particle
18526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *	        --> this-model
18527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *	    )
18528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
18530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the case when there is already an empty
18532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <sequence> with minOccurs==maxOccurs==1.
18533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Just add the base types's content type.
18534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * NOTE that, although we miss to add an intermediate
18535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <sequence>, this should produce no difference to
18536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * neither the regex compilation of the content model,
18537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * nor to the complex type contraints.
18538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children->children =
18540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) baseType->subtypes;
18541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now fixup attribute uses:
18547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - expand attr. group references
18548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     - intersect attribute wildcards
18549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - inherit attribute uses of the base type
18550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - inherit or union attr. wildcards if extending
18551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - apply attr. use prohibitions if restricting
18552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaFixupTypeAttributeUses(pctxt, type);
18554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply the complex type component constraints; this will not
18557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * check attributes, since this is done in
18558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaFixupTypeAttributeUses().
18559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckCTComponent(pctxt, type);
18561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
18569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
18572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
18577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeFixup:
18589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
18591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fixes the content model of the type.
18593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: We need an int result!
18594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixup(xmlSchemaTypePtr type,
18597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlSchemaAbstractCtxtPtr actxt)
18598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
18600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
18601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
18602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	AERROR_INT("xmlSchemaTypeFixup",
18603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "this function needs a parser context");
18604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
18605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_COMPLEX)
18609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type));
18610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (type->type == XML_SCHEMA_TYPE_SIMPLE)
18611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type));
18612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckFacet:
18617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet
18618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context or NULL
18620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the optional name of the type
18621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks and computes the values of facets.
18623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if valid, a positive error code if not valid and
18625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in case of an internal or API error.
18626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
18628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
18629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSchemaTypePtr typeDecl,
18630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSchemaParserCtxtPtr pctxt,
18631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar * name ATTRIBUTE_UNUSED)
18632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, ctxtGiven;
18634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet == NULL) || (typeDecl == NULL))
18636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
18637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: will the parser context be given if used from
18639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the relaxNG module?
18640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
18642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxtGiven = 0;
18643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
18644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxtGiven = 1;
18645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (facet->type) {
18647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MININCLUSIVE:
18648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINEXCLUSIVE:
18649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXINCLUSIVE:
18650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
18651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION: {
18652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
18653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Okay we need to validate the value
18654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * at that point.
18655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
18656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr base;
18657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* 4.3.5.5 Constraints on enumeration Schema Components
18659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Schema Component Constraint: enumeration valid restriction
1866060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* It is an �error� if any member of {value} is not in the
1866160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �value space� of {base type definition}.
18662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
18663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* minInclusive, maxInclusive, minExclusive, maxExclusive:
1866460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* The value �must� be in the
1866560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �value space� of the �base type�.
18666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This function is intended to deliver a compiled value
18669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* on the facet. In this implementation of XML Schemata the
18670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type holding a facet, won't be a built-in type.
18671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Thus to ensure that other API
18672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* calls (relaxng) do work, if the given type is a built-in
18673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type, we will assume that the given built-in type *is
18674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* already* the base type.
18675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
18677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base = typeDecl->baseType;
18678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (base == NULL) {
18679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "a type user derived type has no base type");
18681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
18682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
18684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base = typeDecl;
1868560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! ctxtGiven) {
18687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * A context is needed if called from RelaxNG.
1868960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
18690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt = xmlSchemaNewParserCtxt("*");
18691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (pctxt == NULL)
18692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
18693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE: This call does not check the content nodes,
18696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* since they are not available:
18697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* facet->node is just the node holding the facet
18698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition, *not* the attribute holding the *value*
18699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of the facet.
1870060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
18701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(
18702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ACTXT_CAST pctxt, facet->node, base,
18703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val), 1, 1, 0);
18704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
18705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
18706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* No error message for RelaxNG. */
1870760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			if (ctxtGiven) {
18708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_INTERNAL, facet->node, NULL,
1871060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				"Internal error: xmlSchemaCheckFacet, "
18711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"failed to validate the value '%s' of the "
18712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"facet '%s' against the base type",
18713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				facet->value, xmlSchemaFacetTypeToString(facet->type));
18714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
18715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
18716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* No error message for RelaxNG. */
18719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
18721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
18723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, facet->node, WXS_BASIC_CAST facet,
18724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The value '%s' of the facet does not validate "
18725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "against the base type '%s'",
18726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    facet->value,
18727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaFormatQName(&str,
18728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				base->targetNamespace, base->name));
18729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
18730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit;
18732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (facet->val == NULL) {
18733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "value was not computed");
18736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
18738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
18740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_PATTERN:
18742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            facet->regexp = xmlRegexpCompile(facet->value);
18743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (facet->regexp == NULL) {
18744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_REGEXP_INVALID;
18745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* No error message for RelaxNG. */
18746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxtGiven) {
18747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret, facet->node, WXS_BASIC_CAST typeDecl,
18749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The value '%s' of the facet 'pattern' is not a "
18750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"valid regular expression",
18751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			facet->value, NULL);
18752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
18755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_TOTALDIGITS:
18756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_FRACTIONDIGITS:
18757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_LENGTH:
18758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXLENGTH:
18759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINLENGTH:
18760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
18762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidatePredefinedType(
18763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
18764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val));
18765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidatePredefinedType(
18767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
18768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val));
18769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
18771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
18772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* No error message for RelaxNG. */
18773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "validating facet value");
18776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
18778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* No error message for RelaxNG. */
18781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxtGiven) {
18782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* error code */
18783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
18784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret, facet->node, WXS_BASIC_CAST typeDecl,
1878560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			"The value '%s' of the facet '%s' is not a valid '%s'",
18786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			facet->value,
18787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetTypeToString(facet->type),
1878860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			(facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
18789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    BAD_CAST "nonNegativeInteger" :
18790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    BAD_CAST "positiveInteger",
18791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
18792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1879560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_WHITESPACE:{
18797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(facet->value, BAD_CAST "preserve")) {
18798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
18799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) {
18800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
18801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) {
18802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
18803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
18804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* No error message for RelaxNG. */
18806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */
18808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
18809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, facet->node, WXS_BASIC_CAST typeDecl,
18810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The value '%s' of the facet 'whitespace' is not "
18811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "valid", facet->value, NULL);
18812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
18813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
18814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
18816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
18817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
18819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! ctxtGiven) && (pctxt != NULL))
18820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(pctxt);
18821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
18822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
18823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! ctxtGiven) && (pctxt != NULL))
18824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(pctxt);
18825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
18826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckFacetValues:
18830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
18832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks the default values types, especially for facets
18834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
18837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaParserCtxtPtr pctxt)
18838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, olderrs = pctxt->nberrors;
18840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = typeDecl->name;
18841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: It is intended to use the facets list, instead
18843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of facetSet.
18844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDecl->facets != NULL) {
18846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr facet = typeDecl->facets;
18847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Temporarily assign the "schema" to the validation context
18850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the parser context. This is needed for NOTATION validation.
18851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->vctxt == NULL) {
18853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
18854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
18855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->vctxt->schema = pctxt->schema;
18857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (facet != NULL) {
18858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name);
18859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE
18860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = facet->next;
18861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->vctxt->schema = NULL;
18863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCircModelGrDefRef:
18873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtMGroup: the searched model group
18874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @selfMGroup: the second searched model group
18875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the first particle
18876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used by
18878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckGroupDefCircular only.
18879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the particle with the circular model group definition reference,
18881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise NULL.
18882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
18884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
18885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaTreeItemPtr particle)
18886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr circ = NULL;
18888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr term;
18889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr gdef;
18890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (; particle != NULL; particle = particle->next) {
18892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	term = particle->children;
18893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (term == NULL)
18894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
18895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (term->type) {
18896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
18897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gdef = (xmlSchemaModelGroupDefPtr) term;
18898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef == groupDef)
18899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (particle);
18900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Mark this model group definition to avoid infinite
18902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* recursion on circular references not yet examined.
18903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
18905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
18906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef->children != NULL) {
18907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    circ = xmlSchemaGetCircModelGrDefRef(groupDef,
18909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			gdef->children->children);
18910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (circ != NULL)
18912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (circ);
18913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
18916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
18917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
18918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
18919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (circ != NULL)
18920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (circ);
18921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
18923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
18927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckGroupDefCircular:
18931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the model group definition
18932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
18933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
18934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular references to model group definitions.
18936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
18938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item,
18939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaParserCtxtPtr ctxt)
18940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Model Group Correct
18943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 Circular groups are disallowed. That is, within the {particles}
18944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a group there must not be at any depth a particle whose {term}
18945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * is the group itself.
18946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((item == NULL) ||
18948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->type != XML_SCHEMA_TYPE_GROUP) ||
18949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->children == NULL))
18950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
18951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
18952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr circ;
18953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children);
18955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
18956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
18957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: The error report is not adequate: this constraint
18959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * is defined for model groups but not definitions, but since
18960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * there cannot be any circular model groups without a model group
18961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition (if not using a construction API), we check those
18962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * defintions only.
18963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
18965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_MG_PROPS_CORRECT_2,
18966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(circ),
18967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Circular reference to the model group definition '%s' "
18968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"defined", xmlSchemaFormatQName(&str,
18969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->targetNamespace, item->name));
18970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
18971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: We will cut the reference to avoid further
18973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * confusion of the processor. This is a fatal error.
18974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ->children = NULL;
18976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaModelGroupToModelGroupDefFixup:
18982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
18983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mg:  the model group
18984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assigns the model group of model group definitions to the "term"
18986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the referencing particle.
18987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In xmlSchemaResolveModelGroupParticleReferences the model group
18988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * definitions were assigned to the "term", since needed for the
18989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * circularity check.
18990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
18992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     All Group Limited (cos-all-limited) (1.2)
18993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
18995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaModelGroupToModelGroupDefFixup(
18996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
18997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr mg)
18998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
19000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (particle != NULL) {
19002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
19003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_PARTICLE_TERM(particle))->type !=
19004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_GROUP))
19005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle = WXS_PTC_CAST particle->next;
19007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1900860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
19009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) {
19010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Remove the particle.
19012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_PARTICLE_TERM(particle) = NULL;
19014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle = WXS_PTC_CAST particle->next;
19015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
19016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Assign the model group to the {term} of the particle.
19019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_PARTICLE_TERM(particle) =
19021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
19022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = WXS_PTC_CAST particle->next;
19024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircularRecur:
19029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtGr: the searched attribute group
19030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the current attribute list to be processed
19031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used by
19033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircular only.
19034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the circular attribute grou reference, otherwise NULL.
19036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
19038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
19039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaItemListPtr list)
19040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr gr;
19042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref, circ;
19043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
19044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We will search for an attribute group reference which
19046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * references the context attribute group.
19047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->nbItems; i++) {
19049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = list->items[i];
19050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
19052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ref->item != NULL))
19053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    gr = WXS_ATTR_GROUP_CAST ref->item;
19055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr == ctxtGr)
19056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ref);
19057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
1905860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
19059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Mark as visited to avoid infinite recursion on
19061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * circular references not yet examined.
19062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((gr->attrUses) &&
19064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
19065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
19066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
19067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
1906860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (xmlSchemaItemListPtr) gr->attrUses);
19069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
19070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (circ != NULL)
19071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (circ);
19072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1907360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
19077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircular:
19081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * attrGr:  the attribute group definition
19082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
19083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
19084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular references of attribute groups.
19086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
19089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaParserCtxtPtr ctxt)
19090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Representation Constraint:
19093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute Group Definition Representation OK
19094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 Circular group reference is disallowed outside <redefine>.
19095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * That is, unless this element information item's parent is
19096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * <redefine>, then among the [children], if any, there must
19097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not be an <attributeGroup> with ref [attribute] which resolves
19098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the component corresponding to this <attributeGroup>. Indirect
19099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * circularity is also ruled out. That is, when QName resolution
1910060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * (Schema Document) (�3.15.3) is applied to a �QName� arising from
19101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * any <attributeGroup>s with a ref [attribute] among the [children],
1910260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * it must not be the case that a �QName� is encountered at any depth
19103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which resolves to the component corresponding to this <attributeGroup>.
19104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->attrUses == NULL)
19106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
19108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
19110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr circ;
1911160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
1911360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    (xmlSchemaItemListPtr) attrGr->attrUses);
19114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
19115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
19116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Report the referenced attr group as QName.
19118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
19120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3,
19121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
19122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Circular reference to the attribute group '%s' "
19123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"defined", xmlSchemaGetComponentQName(&str, attrGr));
19124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
19125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: We will cut the reference to avoid further
19127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * confusion of the processor.
19128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * BADSPEC TODO: The spec should define how to process in this case.
19129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ->item = NULL;
19131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
19132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr);
19140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaExpandAttributeGroupRefs:
19143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the parser context
19144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node of the component holding the attribute uses
1914560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @completeWild: the intersected wildcard to be returned
19146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list: the attribute uses
19147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
19150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute use prohibitions are removed from the list
19151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and returned via the @prohibs list.
19152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointlessness of attr. prohibs, if a matching attr. decl
19153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is existent a well, are checked.
19154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
19157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaBasicItemPtr item,
19158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaWildcardPtr *completeWild,
19159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr list,
19160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr prohibs)
19161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr gr;
19163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr use;
19164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr sublist;
19165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
19166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int created = (*completeWild == NULL) ? 0 : 1;
19167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohibs)
19169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohibs->nbItems = 0;
19170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->nbItems; i++) {
19172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = list->items[i];
19173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1917460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
19175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prohibs == NULL) {
19176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaExpandAttributeGroupRefs",
19177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "unexpected attr prohibition found");
19178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Remove from attribute uses.
19182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListRemove(list, i) == -1)
19184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i--;
19186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that duplicate prohibitions were already
19188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * handled at parsing time.
1918960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
19190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add to list of prohibitions.
19192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListAddSize(prohibs, 2, use);
19194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
19195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
19198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_QNAME_CAST use)->item == NULL)
19200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
19202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Expand the referenced attr. group.
19204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: remove this, this is done in a previous step, so
19205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * already done here.
19206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
19208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
19209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
19210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Build the 'complete' wildcard; i.e. intersect multiple
19213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * wildcards.
19214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr->attributeWildcard != NULL) {
19216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*completeWild == NULL) {
19217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *completeWild = gr->attributeWildcard;
19218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
19219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! created) {
19220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaWildcardPtr tmpWild;
19221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 /*
19223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Copy the first encountered wildcard as context,
19224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* except for the annotation.
19225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*
19226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Although the complete wildcard might not correspond
19227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* to any node in the schema, we will anchor it on
19228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the node of the owner component.
19229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
19230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmpWild =  xmlSchemaAddWildcard(pctxt, pctxt->schema,
19231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
19232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item));
19233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (tmpWild == NULL)
19234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
19235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaCloneWildcardNsConstraints(pctxt,
19236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmpWild, *completeWild) == -1)
19237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
19238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmpWild->processContents = (*completeWild)->processContents;
19239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*completeWild = tmpWild;
19240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			created = 1;
19241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1924260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
19244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			gr->attributeWildcard) == -1)
19245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Just remove the reference if the referenced group does not
19250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain any attribute uses.
19251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sublist = ((xmlSchemaItemListPtr) gr->attrUses);
19253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((sublist == NULL) || sublist->nbItems == 0) {
19254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaItemListRemove(list, i) == -1)
19255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
19256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i--;
19257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add the attribute uses.
19261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = sublist->items[0];
19263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sublist->nbItems != 1) {
19264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 1; j < sublist->nbItems; j++) {
19265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
19266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaItemListInsert(list,
19267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    sublist->items[j], i) == -1)
19268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle pointless prohibitions of declared attributes.
19276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) {
19278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUseProhibPtr prohib;
19279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = prohibs->nbItems -1; i >= 0; i--) {
19281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prohib = prohibs->items[i];
19282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < list->nbItems; j++) {
19283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = list->items[j];
19284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
19286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
19287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
19288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
19289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
19291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
19292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prohib->node, NULL,
19293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping pointless attribute use prohibition "
19294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'%s', since a corresponding attribute use "
19295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"exists already in the type definition",
19296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
19297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    prohib->targetNamespace, prohib->name),
19298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
19299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
19300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
19301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Remove the prohibition.
19302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
19303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaItemListRemove(prohibs, i) == -1)
19304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeGroupExpandRefs:
19315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the parser context
1931660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @attrGr:  the attribute group definition
19317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Computation of:
19319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * {attribute uses} property
19320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * {attribute wildcard} property
19321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
19324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr)
1932860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
19329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attrGr->attrUses == NULL) ||
19330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
19331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
19334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
19335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1)
1933660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
19337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeGroupExpandRefs:
19342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the parser context
1934360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @attrGr:  the attribute group definition
19344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
1934760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
19348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
1934960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *    Attribute Group Definition Properties Correct (ag-props-correct)
19350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr)
1935460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
19355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC ag-props-correct
19357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (1) "The values of the properties of an attribute group definition
19358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be as described in the property tableau in The Attribute
1935960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Group Definition Schema Component (�3.6.1), modulo the impact of
1936060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Missing Sub-components (�5.3);"
19361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1936260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attrGr->attrUses != NULL) &&
19364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
19365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
19366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
19367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUsePtr use, tmp;
19368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, hasId = 0;
19369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = uses->nbItems -1; i >= 0; i--) {
1937160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    use = uses->items[i];
19372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ag-props-correct
19374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (2) "Two distinct members of the {attribute uses} must not have
19375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute declaration}s both of whose {name}s match and whose
19376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace}s are identical."
19377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i > 0) {
19379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = i -1; j >= 0; j--) {
19380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = uses->items[j];
19381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
19382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(tmp)) &&
19383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(use) ==
19384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(tmp)))
19385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
19386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1938760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
19390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrGr->node, WXS_BASIC_CAST attrGr,
19391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Duplicate %s",
19392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
19393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
19394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
19395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
19396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate.
19397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
19398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
19399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
19400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_use;
19401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
19402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ag-props-correct
19406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3) "Two distinct members of the {attribute uses} must not have
19407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute declaration}s both of whose {type definition}s are or
19408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are derived from ID."
19409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Does 'derived' include member-types of unions?
19410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1941160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
19412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsDerivedFromBuiltInType(
19413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
1941460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
19415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (hasId) {
19416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1941760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
19420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrGr->node, WXS_BASIC_CAST attrGr,
19421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "There must not exist more than one attribute "
19422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "declaration of type 'xs:ID' "
19423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(or derived from 'xs:ID'). The %s violates this "
19424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "constraint",
19425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
19426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
19427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
19428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
19429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
1943060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
19431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasId = 1;
19432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_use: {}
19435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrGroupReferences:
19442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attrgrpDecl:  the schema attribute definition
19443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
19444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
19445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves references to attribute group definitions.
19447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref,
19450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParserCtxtPtr ctxt)
19451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr group;
19453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ref->item != NULL)
19455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
19456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    group = xmlSchemaGetAttributeGroup(ctxt->schema,
19457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref->name,
19458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref->targetNamespace);
19459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group == NULL) {
19460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPResCompAttrErr(ctxt,
19461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_RESOLVE,
19462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ref->node,
19463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "ref", ref->name, ref->targetNamespace,
19464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->itemType, NULL);
19465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
19466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ref->item = WXS_BASIC_CAST group;
19468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrPropsCorrect:
19473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an schema attribute declaration/use
19474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    Attribute Declaration Properties Correct (a-props-correct)
19480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value constraints of an attribute declaration/use.
19482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that this needs the simle type definitions to be already
19483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   builded and checked.
19484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaAttributePtr attr)
19488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC a-props-correct (1)
19492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The values of the properties of an attribute declaration must
19493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be as described in the property tableau in The Attribute
1949460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Declaration Schema Component (�3.2.1), modulo the impact of
1949560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Missing Sub-components (�5.3)."
19496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1949760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_ATTR_TYPEDEF(attr) == NULL)
19499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->defValue != NULL) {
19502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
19503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (3)
19506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "If the {type definition} is or is derived from ID then there
19507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must not be a {value constraint}."
19508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIsDerivedFromBuiltInType(
19510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID))
19511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
19513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_A_PROPS_CORRECT_3,
19514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST attr,
19515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Value constraints are not allowed if the type definition "
19516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"is or is derived from xs:ID",
19517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
19518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
19519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (2)
19522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "if there is a {value constraint}, the canonical lexical
1952360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of its value must be �valid� with respect
1952460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to the {type definition} as defined in String Valid (�3.14.4)."
19525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Don't care about the *cononical* stuff here, this requirement
19526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* will be removed in WXS 1.1 anyway.
19527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
19529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->node, WXS_ATTR_TYPEDEF(attr),
19530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->defValue, &(attr->defVal),
19531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    1, 1, 0);
19532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
19533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
19534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaCheckAttrPropsCorrect",
19535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
19536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
19539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_A_PROPS_CORRECT_2,
19540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST attr,
19541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the value constraint is not valid",
19542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
19543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
19544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1954660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
19551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
19552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaElementPtr ancestor)
19553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret;
19555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor) == NULL)
19557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
19558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor) == elemDecl)
19559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ancestor);
19560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR)
19562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
19563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
19564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
19565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_SUBST_HEAD(ancestor));
19566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
19567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
19569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElemPropsCorrect:
19573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @decl: the element declaration
19575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Element Declaration Properties Correct (e-props-correct)
19579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
19581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing: (6)
19582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaElementPtr elemDecl)
19586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
19588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
19589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The values of the properties of an element declaration
19591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be as described in the property tableau in The Element
1959260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Declaration Schema Component (�3.3.1), modulo the impact of Missing
1959360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
19594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(elemDecl) != NULL) {
19596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ;
19597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckElementDeclComponent(head, pctxt);
19599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1960060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* SPEC (3) "If there is a non-�absent� {substitution group
19601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* affiliation}, then {scope} must be global."
19602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
19604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
19605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_E_PROPS_CORRECT_3,
19606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, NULL,
19607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Only global element declarations can have a "
19608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitution group affiliation", NULL);
19609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_E_PROPS_CORRECT_3;
19610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: SPEC (6) "Circular substitution groups are disallowed.
19613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* That is, it must not be possible to return to an element declaration
19614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* by repeatedly following the {substitution group affiliation}
19615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* property."
19616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (head == elemDecl)
19618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = head;
19619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (WXS_SUBST_HEAD(head) != NULL)
19620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = xmlSchemaCheckSubstGroupCircular(head, head);
19621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
19622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = NULL;
19623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
19624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *strA = NULL, *strB = NULL;
19625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErrExt(pctxt,
19627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_E_PROPS_CORRECT_6,
19628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST circ, NULL,
19629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The element declaration '%s' defines a circular "
19630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitution group to element declaration '%s'",
19631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&strA, circ),
19632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&strB, head),
19633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
19634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(strA)
19635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(strB)
19636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_E_PROPS_CORRECT_6;
19637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (4) "If there is a {substitution group affiliation},
19640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the {type definition}
19641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the element declaration must be validly derived from the {type
19642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition} of the {substitution group affiliation}, given the value
19643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the {substitution group exclusions} of the {substitution group
1964460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6)
19645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (if the {type definition} is complex) or as defined in
1964660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is
19647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* simple)."
19648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
19649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: {substitution group exclusions} means the values of the
19650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* attribute "final".
19651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
19654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int set = 0;
19655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
19657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_EXTENSION;
19658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
19659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_RESTRICTION;
19660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
19662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(head), set) != 0) {
19663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
19664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_E_PROPS_CORRECT_4;
19666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(pctxt,
19667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_E_PROPS_CORRECT_4,
19668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST elemDecl, NULL,
19669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition '%s' was "
19670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "either rejected by the substitution group "
19671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "affiliation '%s', or not validly derived from its type "
19672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "definition '%s'",
19673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strA, typeDef),
19674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strB, head),
19675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head)));
19676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA)
19677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB)
19678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strC)
19679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (5) "If the {type definition} or {type definition}'s
19684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {content type}
19685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * is or is derived from ID then there must not be a {value constraint}.
19686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note: The use of ID as a type definition for elements goes beyond
19687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML 1.0, and should be avoided if backwards compatibility is desired"
19688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->value != NULL) &&
19690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_IS_SIMPLE(typeDef) &&
19691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
19692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (WXS_IS_COMPLEX(typeDef) &&
19693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  WXS_HAS_SIMPLE_CONTENT(typeDef) &&
19694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
19695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_ID)))) {
19696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_E_PROPS_CORRECT_5;
19698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(pctxt,
19699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_E_PROPS_CORRECT_5,
19700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST elemDecl, NULL,
19701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The type definition (or type definition's content type) is or "
19702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "is derived from ID; value constraints are not allowed in "
19703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "conjunction with such a type definition", NULL);
19704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (elemDecl->value != NULL) {
19705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int vcret;
19706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node = NULL;
19707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If there is a {value constraint}, the canonical lexical
1971060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of its value must be �valid� with respect to the
19711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {type definition} as defined in Element Default Valid (Immediate)
1971260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (�3.3.6)."
19713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef == NULL) {
19715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(pctxt, elemDecl->node,
19716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
19717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaCheckElemPropsCorrect, "
19718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type is missing... skipping validation of "
19719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the value constraint", NULL, NULL);
19720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
19721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl->node != NULL) {
19723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
19724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST "fixed");
19726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
19727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST "default");
19729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node,
19731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    typeDef, elemDecl->value, &(elemDecl->defVal));
19732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vcret != 0) {
19733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vcret < 0) {
19734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaElemCheckValConstr",
19735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to validate the value constraint of an "
19736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "element declaration");
19737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
19738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (vcret);
19740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
19744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElemSubstGroup:
19748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @decl: the element declaration
19750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitution Group (cos-equiv-class)
19754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In Libxml2 the subst. groups will be precomputed, in terms of that
19756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a list will be built for each subst. group head, holding all direct
19757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referents to this head.
19758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that this function needs:
19759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   1. circular subst. groups to be checked beforehand
19760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   2. the declaration's type to be derived from the head's type
19761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
19763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
19766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
19767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaElementPtr elemDecl)
19768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((WXS_SUBST_HEAD(elemDecl) == NULL) ||
19770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* SPEC (1) "Its {abstract} is false." */
19771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
19772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
19774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr head;
19775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr headType, type;
19776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int set, methSet;
19777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "It is validly substitutable for HEAD subject to HEAD's
19779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {disallowed substitutions} as the blocking constraint, as defined in
1978060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Substitution Group OK (Transitive) (�3.3.6)."
19781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (head = WXS_SUBST_HEAD(elemDecl); head != NULL;
19783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    head = WXS_SUBST_HEAD(head)) {
19784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set = 0;
19785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    methSet = 0;
19786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The blocking constraints.
19788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
19790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    headType = head->subtypes;
19792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = elemDecl->subtypes;
19793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (headType == type)
19794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto add_member;
19795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
19796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
19798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC: Substitution Group OK (Transitive) (2.3)
19801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "The set of all {derivation method}s involved in the
19802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derivation of D's {type definition} from C's {type definition}
19803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * does not intersect with the union of the blocking constraint,
19804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * C's {prohibited substitutions} (if C is complex, otherwise the
19805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * empty set) and the {prohibited substitutions} (respectively the
19806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * empty set) of any intermediate {type definition}s in the
19807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derivation of D's {type definition} from C's {type definition}."
19808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: Optimize this a bit, since, if traversing the
19811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * subst.head axis, the methSet does not need to be computed for
19812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the full depth over and over.
19813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The set of all {derivation method}s involved in the derivation
19816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((type != NULL) && (type != headType)) {
19818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_IS_EXTENSION(type)) &&
19819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_RESTRICTION(type) &&
19823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = type->baseType;
19827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The {prohibited substitutions} of all intermediate types +
19830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the head's type.
19831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = elemDecl->subtypes->baseType;
19833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (type != NULL) {
19834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_COMPLEX(type)) {
19835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((type->flags &
19836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
19838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((type->flags &
19840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
19844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type == headType)
19846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = type->baseType;
19848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((set != 0) &&
19850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
19852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
19854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectadd_member:
19857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl);
19858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
19859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
19860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */
19865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElementDeclComponent
19867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the schema parser context
19868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtComponent: the context component (an element declaration)
19869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtParticle: the first particle of the context component
19870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @searchParticle: the element declaration particle to be analysed
19871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1987260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Schema Component Constraint: Element Declarations Consistent
19873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
19876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaBasicItemPtr ctxtComponent,
1987760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				    xmlSchemaParticlePtr ctxtParticle,
19878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr searchParticle,
19879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr curParticle,
19880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int search)
19881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
19885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr cur = curParticle;
1988660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (curParticle == NULL) {
19887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_PARTICLE_TERM(curParticle) == NULL) {
19890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Just return in this case. A missing "term" of the particle
19892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* might arise due to an invalid "term" component.
19893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1989560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
19896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
19897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (WXS_PARTICLE_TERM(cur)->type) {
19898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ANY:
19899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
19901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (search == 0) {
19902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaCheckElementDeclConsistent(pctxt,
19903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxtComponent, ctxtParticle, cur, ctxtParticle, 1);
19904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
1990560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return(ret);
19906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
19907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaElementPtr elem =
19908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur));
19909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
19910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC Element Declarations Consistent:
19911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * "If the {particles} contains, either directly,
19912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * indirectly (that is, within the {particles} of a
1991360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * contained model group, recursively) or �implicitly�
19914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * two or more element declaration particles with
19915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the same {name} and {target namespace}, then
19916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all their type definitions must be the same
19917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * top-level definition [...]"
19918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
19919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name,
19920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) &&
19921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
19922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
19923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
19924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *strA = NULL, *strB = NULL;
1992560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* TODO: error code */
19928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_COS_NONAMBIG,
19929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(cur), NULL,
19930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "In the content model of %s, there are multiple "
19931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "element declarations for '%s' with different "
19932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "type definitions",
19933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strA,
19934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxtComponent),
19935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaFormatQName(&strB,
19936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
19937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_PARTICLE_TERM_AS_ELEM(cur)->name));
19938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strA);
19939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strB);
19940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(XML_SCHEMAP_COS_NONAMBIG);
19941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1994260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
19943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1994460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_SEQUENCE: {
19945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:{
19948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
19949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTreeItemPtr sub;
1995060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1995160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		sub = WXS_PARTICLE_TERM(particle)->children;  (xmlSchemaParticlePtr)
19952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (sub != NULL) {
19953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent,
19954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxtParticle, ctxtElem);
19955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
19956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
19957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sub = sub->next;
19958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
19960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
19963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
19965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
19967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInternalErr2(ACTXT_CAST pctxt,
19968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaCheckElementDeclConsistent",
19969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "found unexpected term of type '%s' in content model",
19970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL);
19971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = (xmlSchemaParticlePtr) cur->next;
19974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
19977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
19978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
19980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElementDeclComponent
19983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an schema element declaration/particle
19984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value constraints of an element declaration.
1998860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Adds substitution group members.
19989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
19991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
19992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt)
19993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl == NULL)
19995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
19997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
19999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
20000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Adds substitution group members.
20002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2000360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
20004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveModelGroupParticleReferences:
20009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle:  a particle component
20010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
20011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves references of a model group's {particles} to
20013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * model group definitions and to element declarations.
20014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
20016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveModelGroupParticleReferences(
20017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ctxt,
20018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr mg)
20019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
20021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref;
20022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr refItem;
20023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: Test this.
20026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (particle != NULL) {
20028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
20029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_PARTICLE_TERM(particle))->type !=
20030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_EXTRA_QNAMEREF))
20031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_particle;
2003360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
20035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Resolve the reference.
20037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NULL the {term} by default.
20038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = NULL;
20040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refItem = xmlSchemaGetNamedComponent(ctxt->schema,
20042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->itemType, ref->name, ref->targetNamespace);
20043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refItem == NULL) {
20044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
20045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(particle), "ref", ref->name,
20046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref->targetNamespace, ref->itemType, NULL);
20047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: remove the particle. */
20048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_particle;
2004960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
20051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL)
20052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: remove the particle. */
20053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_particle;
20054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that we will assign the model group definition
20056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * itself to the "term" of the particle. This will ease
20057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the check for circular model group definitions. After
20058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * that the "term" will be assigned the model group of the
20059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * model group definition.
20060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_MODELGROUPDEF_MODEL(refItem))->type ==
20062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL) {
20063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1)
20065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1.2)
20066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "It appears only as the value of one or both of the
20067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* following properties:"
20068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.1) "the {model group} property of a model group
20069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*        definition."
20070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.2) "the {term} property of a particle [... of] the "
20071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {content type} of a complex type definition."
20072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST ctxt,
20074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: error code */
20075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ALL_LIMITED,
20076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ITEM_NODE(particle), NULL,
20077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "A model group definition is referenced, but "
20078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "it contains an 'all' model group, which "
20079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "cannot be contained by model groups",
20080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL);
20081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: remove the particle. */
20082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_particle;
20083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->children = (xmlSchemaTreeItemPtr) refItem;
20085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Are referenced element declarations the only
20088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * other components we expect here?
20089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->children = (xmlSchemaTreeItemPtr) refItem;
20091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_particle:
20093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = WXS_PTC_CAST particle->next;
20094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAreValuesEqual(xmlSchemaValPtr x,
2009960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		       xmlSchemaValPtr y)
2010060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2010160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypePtr tx, ty, ptx, pty;
20102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
20103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (x != NULL) {
20105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Same types. */
20106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x));
20107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y));
20108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ptx = xmlSchemaGetPrimitiveType(tx);
20109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pty = xmlSchemaGetPrimitiveType(ty);
20110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2011160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (1) if a datatype T' is �derived� by �restriction� from an
2011260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* atomic datatype T then the �value space� of T' is a subset of
2011360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* the �value space� of T. */
20114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2011560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (2) if datatypes T' and T'' are �derived� by �restriction�
2011660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* from a common atomic ancestor T then the �value space�s of T'
20117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and T'' may overlap.
20118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ptx != pty)
20120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
20121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We assume computed values to be normalized, so do a fast
20123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* string comparison for string based types.
20124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
20126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
20127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! xmlStrEqual(
20128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValueGetAsString(x),
20129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValueGetAsString(y)))
20130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
20131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValuesWhtsp(
20133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		x, XML_SCHEMA_WHITESPACE_PRESERVE,
20134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		y, XML_SCHEMA_WHITESPACE_PRESERVE);
20135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
20136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
20138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
20139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Lists.
20142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	x = xmlSchemaValueGetNext(x);
20144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (x != NULL) {
20145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    y = xmlSchemaValueGetNext(y);
20146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (y == NULL)
2014760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return (0);
20148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlSchemaValueGetNext(y) != NULL)
20149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
20150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
20151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
20152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
20154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrUseReferences:
20158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an attribute use
20159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
20160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the referenced attribute declaration.
20162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
20165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParserCtxtPtr ctxt)
20166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ause == NULL))
20168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ause->attrDecl == NULL) ||
20170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
20171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
20172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl;
20175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Evaluate, what errors could occur if the declaration is not
20178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* found.
20179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
20181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->name, ref->targetNamespace);
20182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ause->attrDecl == NULL) {
20183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
2018494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		XML_SCHEMAP_SRC_RESOLVE,
20185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST ause, ause->node,
20186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"ref", ref->name, ref->targetNamespace,
20187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
20188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(ctxt->err);;
20189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
20190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrUsePropsCorrect:
20196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
2019760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @use:  an attribute use
20198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
20200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute Use Correct (au-props-correct)
2020160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
20202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
20205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaAttributeUsePtr use)
20206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (use == NULL))
20208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) ||
20210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE))
2021160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC au-props-correct (1)
20215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The values of the properties of an attribute use must be as
20216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * described in the property tableau in The Attribute Use Schema
2021760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Component (�3.5.1), modulo the impact of Missing
2021860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
20219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2022060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) &&
20222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) &&
20223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
20226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_AU_PROPS_CORRECT_2,
20227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST use, NULL,
20228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The attribute declaration has a 'fixed' value constraint "
20229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ", thus the attribute use must also have a 'fixed' value "
20230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "constraint",
20231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
20232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
20233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Compute and check the value constraint's value.
20236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) {
20238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
20239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2024060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* TODO: The spec seems to be missing a check of the
20241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* value constraint of the attribute use. We will do it here.
20242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (3)
20245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIsDerivedFromBuiltInType(
20247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
20248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
20250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT,
20251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST use,
20252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Value constraints are not allowed if the type definition "
20253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"is or is derived from xs:ID",
20254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2025760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
20259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->node, WXS_ATTRUSE_TYPEDEF(use),
20260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->defValue, &(use->defVal),
20261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    1, 1, 0);
20262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
20263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
20264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect",
20265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
20266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
20269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT,
20270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST use,
20271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the value constraint is not valid",
20272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC au-props-correct (2)
20278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "If the {attribute declaration} has a fixed
20279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {value constraint}, then if the attribute use itself has a
20280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {value constraint}, it must also be fixed and its value must match
20281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * that of the {attribute declaration}'s {value constraint}."
20282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) &&
20284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! xmlSchemaAreValuesEqual(use->defVal,
20287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTRUSE_DECL(use))->defVal))
20288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
20290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT_2,
20291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST use, NULL,
20292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'fixed' value constraint of the attribute use "
20293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must match the attribute declaration's value "
20294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"constraint '%s'",
20295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTRUSE_DECL(use))->defValue);
20296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
20298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrTypeReferences:
20307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an attribute declaration
2030860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt:  a parser context
20309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the referenced type definition component.
20311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item,
20314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt)
20315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The simple type definition corresponding to the <simpleType> element
20318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * information item in the [children], if present, otherwise the simple
2031960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * type definition �resolved� to by the �actual value� of the type
2032060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * [attribute], if present, otherwise the �simple ur-type definition�.
20321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
20323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
20324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
20325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->subtypes != NULL)
20326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
20327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->typeName != NULL) {
20328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaTypePtr type;
20329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaGetType(ctxt->schema, item->typeName,
20331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->typeNs);
20332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type == NULL) || (! WXS_IS_SIMPLE(type))) {
20333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
20334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
20335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST item, item->node,
20336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type", item->typeName, item->typeNs,
20337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL);
20338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
20340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->subtypes = type;
20341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
20343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The type defaults to the xs:anySimpleType.
20345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
20347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveIDCKeyReferences:
20353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idc:  the identity-constraint definition
20354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
20355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
20356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolve keyRef references to key/unique IDCs.
20358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
20359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Identity-constraint Definition Properties Correct (c-props-correct)
20360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
20363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaParserCtxtPtr pctxt)
20364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
20366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
20367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc->ref->name != NULL) {
20368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idc->ref->item = (xmlSchemaBasicItemPtr)
20369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
20370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idc->ref->targetNamespace);
20371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (idc->ref->item == NULL) {
20372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: It is actually not an error to fail to resolve
20374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at this stage. BUT we need to be that strict!
20375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(pctxt,
20377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
20378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST idc, idc->node,
20379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"refer", idc->ref->name,
20380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idc->ref->targetNamespace,
20381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_IDC_KEY, NULL);
20382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(pctxt->err);
20383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
20384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC c-props-correct (1)
20386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_C_PROPS_CORRECT,
20389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST idc,
20390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The keyref references a keyref",
20391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc->ref->item = NULL;
20393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
20394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (idc->nbFields !=
20396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
20397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
20398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaIDCPtr refer;
2039960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		refer = (xmlSchemaIDCPtr) idc->ref->item;
20401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC c-props-correct(2)
20403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "If the {identity-constraint category} is keyref,
20404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the cardinality of the {fields} must equal that of
20405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the {fields} of the {referenced key}.
20406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
20408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_C_PROPS_CORRECT,
20409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, WXS_BASIC_CAST idc,
20410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The cardinality of the keyref differs from the "
20411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "cardinality of the referenced key/unique '%s'",
20412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, refer->targetNamespace,
20413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			refer->name),
20414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
20415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
20416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(pctxt->err);
20417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
20425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaParserCtxtPtr pctxt)
20426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
20428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->targetNamespace) == NULL) {
20429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPResCompAttrErr(pctxt,
20431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_RESOLVE,
20432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, prohib->node,
20433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "ref", prohib->name, prohib->targetNamespace,
20434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
20435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_SCHEMAP_SRC_RESOLVE);
20436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_TYPE(c) \
20441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
20442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
20444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_ATTR_GROUP(c) \
20447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
20448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
20451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err = 0;
20453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr prev, item;
20455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int wasRedefined;
20456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (redef == NULL)
2045860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
20461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = redef->item;
20462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* First try to locate the redefined component in the
20464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* schema graph starting with the redefined schema.
20465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: According to this schema bug entry:
20466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html
20467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   it's not clear if the referenced component needs to originate
20468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   from the <redefine>d schema _document_ or the schema; the latter
20469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   would include all imported and included sub-schemas of the
20470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   <redefine>d schema. Currenlty we latter approach is used.
20471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   SUPPLEMENT: It seems that the WG moves towards the latter
20472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   approach, so we are doing it right.
2047360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*
20474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = xmlSchemaFindRedefCompInGraph(
20476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef->targetBucket, item->type,
20477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef->refName, redef->refTargetNs);
20478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prev == NULL) {
20479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
20480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node;
20481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-redefine:
2048460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (6.2.1) "The �actual value� of its own name attribute plus
2048560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * target namespace must successfully �resolve� to a model
20486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * group definition in I."
2048760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (7.2.1) "The �actual value� of its own name attribute plus
2048860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * target namespace must successfully �resolve� to an attribute
20489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * group definition in I."
20490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
20492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that, if we are redefining with the use of references
20493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to components, the spec assumes the src-resolve to be used;
20494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * but this won't assure that we search only *inside* the
20495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * redefined schema.
20496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (redef->reference)
20498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->reference);
20499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
20500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(item);
20501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: error code.
20504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the
2050560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* reference kind.
20506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
20508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The %s '%s' to be redefined could not be found in "
20509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the redefined schema",
20510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(item),
20511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, redef->refTargetNs,
20512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->refName));
2051360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str);
20514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = pctxt->err;
20515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Obtaining and setting the redefinition state is really
20520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* clumsy.
20521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wasRedefined = 0;
20523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_CAST prev)->flags &
20527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_REDEFINED)
20528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Mark it as redefined. */
20533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED;
20534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Assign the redefined type to the
20536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* base type of the redefining type.
20537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: How
20538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2053960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		((xmlSchemaTypePtr) item)->baseType =
20540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) prev;
20541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
20544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Mark it as redefined. */
20550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_MODEL_GROUPDEF_CAST prev)->flags |=
20551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
20552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (redef->reference != NULL) {
20553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Overwrite the QName-reference with the
20555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * referenced model group def.
20556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_PTC_CAST redef->reference)->children =
20558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_TREE_CAST prev;
20559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		redef->target = prev;
20561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ATTR_GROUP_CAST prev)->flags &
20564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ATTRGROUP_REDEFINED)
20565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTR_GROUP_CAST prev)->flags |=
20570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ATTRGROUP_REDEFINED;
20571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (redef->reference != NULL) {
20572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Assign the redefined attribute group to the
20574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * QName-reference component.
20575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the easy case, since we will just
20576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * expand the redefined group.
20577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_QNAME_CAST redef->reference)->item = prev;
20579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->target = NULL;
20580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
20581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the complicated case: we need
20583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * to apply src-redefine (7.2.2) at a later
20584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * stage, i.e. when attribute group references
20585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * have beed expanded and simple types have
20586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * beed fixed.
20587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->target = prev;
20589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaResolveRedefReferences",
20593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Unexpected redefined component type");
2059460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(-1);
20595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wasRedefined) {
20597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
20598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node;
20599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (redef->reference)
20601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->reference);
20602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
20603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->item);
2060460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: error code. */
20607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE,
20608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
20609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The referenced %s was already redefined. Multiple "
20610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"redefinition of the same component is not supported",
20611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentDesignation(&str, prev),
20612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
2061360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str)
20614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = pctxt->err;
20615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2061860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	redef = redef->next;
20619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (redef != NULL);
20620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(err);
20622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
20626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err = 0;
20628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item;
20630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (redef == NULL)
2063260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
20635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (redef->target == NULL) {
20636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = redef->item;
2064060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Since the spec wants the {name} of the redefined
20646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type to be 'absent', we'll NULL it.
20647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_TYPE_CAST redef->target)->name = NULL;
2064960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Seems like there's nothing more to do. The normal
20652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inheritance mechanism is used. But not 100% sure.
20653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO:
20658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC src-redefine:
20659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (6.2.2) "The {model group} of the model group definition
20660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* which corresponds to it per XML Representation of Model
2066160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Group Definition Schema Components (�3.7.2) must be a
2066260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �valid restriction� of the {model group} of that model
20663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* group definition in I, as defined in Particle Valid
2066460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (Restriction) (�3.9.6)."
20665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC src-redefine:
20670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (7.2.2) "The {attribute uses} and {attribute wildcard} of
20671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the attribute group definition which corresponds to it
20672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* per XML Representation of Attribute Group Definition Schema
2067360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Components (�3.6.2) must be �valid restrictions� of the
20674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {attribute uses} and {attribute wildcard} of that attribute
20675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* group definition in I, as defined in clause 2, clause 3 and
20676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* clause 4 of Derivation Valid (Restriction, Complex)
2067760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (�3.4.6) (where references to the base type definition are
20678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* understood as references to the attribute group definition
20679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* in I)."
20680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
20682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ACTION_REDEFINE,
20683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item, redef->target,
20684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST item)->attrUses,
20685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
20686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST item)->attributeWildcard,
20687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
20688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (err == -1)
20689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
20690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	redef = redef->next;
20695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (redef != NULL);
20696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2069860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
20702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaBucketPtr bucket)
20703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item;
20705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err;
20706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr *table;
20707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
20708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
20709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_GET_GLOBAL_HASH(c, slot) { \
20711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
20712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = &(WXS_IMPBUCKET((c))->schema->slot); \
20713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else \
20714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
20715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add global components to the schema's hash tables.
20718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This is the place where duplicate components will be
20719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * detected.
20720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: I think normally we should support imports of the
20721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   same namespace from multiple locations. We don't do currently,
20722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   but if we do then according to:
20723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224
20724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   we would need, if imported directly, to import redefined
20725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   components as well to be able to catch clashing components.
20726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   (I hope I'll still know what this means after some months :-()
20727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
20729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
20731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2073260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
2073360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < bucket->globals->nbItems; i++) {
20735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = bucket->globals->items[i];
20736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = NULL;
20737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_TYPE(item))
20741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_TYPE_CAST item)->name;
20743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, typeDecl)
20744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
20746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ELEM_CAST item)->name;
20747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, elemDecl)
20748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE:
20750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ATTR_CAST item)->name;
20751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, attrDecl)
20752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_MODEL_GROUP_DEF(item))
20755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_MODEL_GROUPDEF_CAST item)->name;
20757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, groupDecl)
20758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_ATTR_GROUP(item))
20761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ATTR_GROUP_CAST item)->name;
20763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
20764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEY:
20766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
20767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEYREF:
20768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_IDC_CAST item)->name;
20769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, idcDef)
20770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_NOTATION:
20772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = ((xmlSchemaNotationPtr) item)->name;
20773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, notaDecl)
2077460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
20775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaAddComponents",
20777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Unexpected global component type");
2077860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
2077960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*table == NULL) {
20781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *table = xmlHashCreateDict(10, pctxt->dict);
20782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*table == NULL) {
20783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaAddComponents",
20784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to create a component hash table");
20785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2078760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	err = xmlHashAddEntry(*table, name, item);
2078960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (err != 0) {
20790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
2079160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_REDEFINED_TYPE,
20794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_NODE(item),
20795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST item,
20796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"A global %s '%s' does already exist",
20797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(item),
20798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, item));
2079960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str);
20800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process imported/included schemas.
20804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
20806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel = bucket->relations;
20807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
20808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((rel->bucket != NULL) &&
20809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
20810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
20811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
20812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
20814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
20815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
20821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBucketPtr rootBucket)
20822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
20824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr item, *items;
20825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbItems, i, ret = 0;
20826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr oldbucket = con->bucket;
20827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl;
20828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
20830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((con->pending == NULL) ||
20832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(con->pending->nbItems == 0))
2083360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Since xmlSchemaFixupComplexType() will create new particles
20837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (local components), and those particle components need a bucket
20838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * on the constructor, we'll assure here that the constructor has
20839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a bucket.
2084060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * TODO: Think about storing locals _only_ on the main bucket.
2084160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->bucket == NULL)
2084360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	con->bucket = rootBucket;
20844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:
20846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (src-redefine):
20847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (6.2) "If it has no such self-reference, then all of the
20848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * following must be true:"
2084960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (6.2.2) The {model group} of the model group definition which
20851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * corresponds to it per XML Representation of Model Group
2085260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.7.2) must be a �valid
2085360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of the {model group} of that model group definition
2085460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * in I, as defined in Particle Valid (Restriction) (�3.9.6)."
20855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckSRCRedefineFirst(pctxt);
20857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add global components to the schemata's hash tables.
2086060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAddComponents(pctxt, rootBucket);
20862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->ctxtType = NULL;
20864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    items = (xmlSchemaTreeItemPtr *) con->pending->items;
20865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nbItems = con->pending->nbItems;
20866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now that we have parsed *all* the schema document(s) and converted
20868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * them to schema components, we can resolve references, apply component
20869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * constraints, create the FSA from the content model, etc.
2087060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve references of..
20873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
20874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1. element declarations:
20875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the type definition
20876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the substitution group affiliation
20877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2. simple/complex types:
20878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the base type definition
20879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the memberTypes of union types
20880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the itemType of list types
20881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3. attributes declarations and attribute uses:
20882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the type definition
20883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - if an attribute use, then the attribute declaration
20884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 4. attribute group references:
20885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the attribute group definition
20886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 5. particles:
20887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the term of the particle (e.g. a model group)
20888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 6. IDC key-references:
20889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the referenced IDC 'key' or 'unique' definition
20890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 7. Attribute prohibitions which had a "ref" attribute.
2089160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
20896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveElementReferences(
20897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaElementPtr) item, pctxt);
20898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveTypeReferences(
20903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) item, pctxt);
20904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE:
20907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrTypeReferences(
20908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributePtr) item, pctxt);
20909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
20912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrUseReferences(
20913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeUsePtr) item, pctxt);
20914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_EXTRA_QNAMEREF:
2091760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((WXS_QNAME_CAST item)->itemType ==
20918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
20919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaResolveAttrGroupReferences(
20921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_QNAME_CAST item, pctxt);
20922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
20926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
20927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
20928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveModelGroupParticleReferences(pctxt,
20929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_MODEL_GROUP_CAST item);
20930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEY:
20933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
20934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEYREF:
20935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveIDCKeyReferences(
20936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaIDCPtr) item, pctxt);
20937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
20940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle attribue prohibition which had a
20942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "ref" attribute.
20943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrUseProhibReferences(
20945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTR_PROHIB_CAST item, pctxt);
20946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
20953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2095460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now that all references are resolved we
20957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can check for circularity of...
2095860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 1. the base axis of type definitions
20959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2. nested model group definitions
20960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3. nested attribute group definitions
20961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: check for circual substitution groups.
20962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Let's better stop on the first error here.
20967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckTypeDefCircular(
20972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) item, pctxt);
20973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckGroupDefCircular(
20979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaModelGroupDefPtr) item, pctxt);
20980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAttrGroupCircular(
20986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeGroupPtr) item, pctxt);
20987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2099360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
20996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
20997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Model group definition references:
20999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Such a reference is reflected by a particle at the component
21000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * level. Until now the 'term' of such particles pointed
21001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the model group definition; this was done, in order to
21002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * ease circularity checks. Now we need to set the 'term' of
21003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * such particles to the model group of the model group definition.
21004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
2100960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_CHOICE:
21010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
21011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_MODEL_GROUP_CAST item);
21012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Expand attribute group references of attribute group definitions.
21021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((! WXS_ATTR_GROUP_EXPANDED(item)) &&
21027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTR_GROUP_HAS_REFS(item))
21028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaAttributeGroupExpandRefs(pctxt,
21030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTR_GROUP_CAST item);
21031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2104060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * First compute the variety of simple types. This is needed as
21042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a seperate step, since otherwise we won't be able to detect
21043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * circular union types in all cases.
21044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) {
21050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupSimpleTypeStageOne(pctxt,
21051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) item);
21052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Detect circular union types. Note that this needs the variety to
21063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be already computed.
21064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((xmlSchemaTypePtr) item)->memberTypes != NULL) {
2107060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCheckUnionTypeDefCircular(pctxt,
21071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) item);
21072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2108160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Do the complete type fixup for simple types.
21084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
21090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item);
21091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * At this point we need build and check all simple types.
21102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply contraints for attribute declarations.
21105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
2110960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_ATTRIBUTE:
21110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item);
21111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
2111260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
21113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for attribute uses.
2112160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
21122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) {
21127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckAttrUsePropsCorrect(pctxt,
21128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTR_USE_CAST item);
21129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for attribute group definitions.
21141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) &&
21147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1))
21148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
21149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item);
21150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
21151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
21154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for redefinitions.
21162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL)
21164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckSRCRedefineSecond(pctxt);
21165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2116860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Complex types are builded and checked.
21170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = con->pending->items[i];
21173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
21175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
21176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item);
21177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The list could have changed, since xmlSchemaFixupComplexType()
21189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * will create particles and model groups in some cases.
21190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    items = (xmlSchemaTreeItemPtr *) con->pending->items;
2119260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    nbItems = con->pending->nbItems;
2119360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply some constraints for element declarations.
21196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
21201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl = (xmlSchemaElementPtr) item;
2120260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
21204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckElementDeclComponent(
21206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaElementPtr) elemDecl, pctxt);
21207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef WXS_ELEM_DECL_CONS_ENABLED
21211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
21212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Schema Component Constraint: Element Declarations Consistent
21213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Apply this constraint to local types of element declarations.
21214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
21215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) &&
21216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
21217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
21218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckElementDeclConsistent(pctxt,
21220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST elemDecl,
21221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
21222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, 0);
21223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
21225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2123260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Finally we can build the automaton from the content model of
21235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * complex types.
21236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
21242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt);
21243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* FIXHFAILURE; */
21244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: cos-element-consistent
2125360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
2125460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    goto exit;
21255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2125660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottexit_error:
21257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = pctxt->err;
21258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto exit;
21259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
21261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = -1;
21262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
21264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the constructor. This is needed for XSI acquisition, since
21266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * those items will be processed over and over again for every XSI
21267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if not cleared here.
21268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    con->bucket = oldbucket;
2127060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    con->pending->nbItems = 0;
21271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->substGroups != NULL) {
21272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(con->substGroups,
21273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
21274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	con->substGroups = NULL;
2127560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
21276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->redefs != NULL) {
21277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaRedefListFree(con->redefs);
21278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	con->redefs = NULL;
21279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
21281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParse:
21284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
21285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal
21287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances.
21288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML Schema structure built from the resource or
21290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
21291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPtr
21293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
21294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr mainSchema = NULL;
21296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
21297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
21298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This one is used if the schema to be parsed was specified via
21301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the API; i.e. not automatically by the validated instance document.
21302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInitTypes();
21305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
21308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Init the context. Is this all we need?*/
21310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nberrors = 0;
21311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->err = 0;
21312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->counter = 0;
21313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the *main* schema. */
21315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema = xmlSchemaNewSchema(ctxt);
21316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mainSchema == NULL)
21317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the schema constructor.
21320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->constructor == NULL) {
21322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
21323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->constructor == NULL)
21324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
21325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Take ownership of the constructor to be able to free it. */
21326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 1;
21327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->constructor->mainSchema = mainSchema;
21329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Locate and add the schema document.
21331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
21333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL,
21334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL, &bucket);
21335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == -1)
21336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
2133860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	goto exit;
21339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL) {
21341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Error code, actually we failed to *locate* the schema. */
2134260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (ctxt->URL)
21343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
21344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
21345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to locate the main schema resource at '%s'",
21346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->URL, NULL);
21347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
21348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
21349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
21350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to locate the main schema resource",
21351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL);
21352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2135360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
21354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Then do the parsing for good. */
21355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
21356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nberrors != 0)
21358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2135960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema->doc = bucket->doc;
21361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema->preserve = ctxt->preserve;
2136260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = mainSchema;
21364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
21366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This is not nice, since we cannot distinguish from the
21370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * result if there was an internal error or not.
21371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2137260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottexit:
2137360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt->nberrors != 0) {
21374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema) {
21375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(mainSchema);
21376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema = NULL;
21377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->constructor) {
21379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaConstructionCtxtFree(ctxt->constructor);
21380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->constructor = NULL;
21381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->ownsConstructor = 0;
21382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = NULL;
21385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(mainSchema);
21386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
2138760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Quite verbose, but should catch internal errors, which were
21389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not communitated.
21390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mainSchema) {
21392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFree(mainSchema);
21393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mainSchema = NULL;
21394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->constructor) {
21396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ctxt->constructor);
21397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = NULL;
21398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 0;
21399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PERROR_INT2("xmlSchemaParse",
2140160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	"An internal error occured");
21402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = NULL;
21403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
21404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetParserErrors:
21408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
21409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback
21410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback
21411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
21412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context
21414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
21416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlSchemaValidityErrorFunc err,
21418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlSchemaValidityWarningFunc warn, void *ctx)
21419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
21422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
21423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
21424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
21425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL)
21426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx);
21427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetParserStructuredErrors:
21431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
21432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
21433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
21434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
21436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
21438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
21439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlStructuredErrorFunc serror,
21440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   void *ctx)
21441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
21444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
21445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
21446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL)
21447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx);
21448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParserErrors:
21452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a XMl-Schema parser context
21453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback result
21454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback result
21455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks result
21456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a parser context
21458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
21460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
21462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaValidityErrorFunc * err,
21464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaValidityWarningFunc * warn, void **ctx)
21465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt == NULL)
21467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
21468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err != NULL)
21469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*err = ctxt->error;
21470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (warn != NULL)
21471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*warn = ctxt->warning;
21472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctx != NULL)
21473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ctx = ctxt->errCtxt;
21474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
21475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFacetTypeToString:
21479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the facet type
21480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the xmlSchemaTypeType to a char string.
21482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the char string representation of the facet type if the
21484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     type is a facet and an "Internal Error" string otherwise.
21485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
21487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetTypeToString(xmlSchemaTypeType type)
21488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
21490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_PATTERN:
21491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "pattern");
21492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
21493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxExclusive");
21494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXINCLUSIVE:
21495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxInclusive");
21496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINEXCLUSIVE:
21497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minExclusive");
21498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MININCLUSIVE:
21499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minInclusive");
21500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_WHITESPACE:
21501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "whiteSpace");
21502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_ENUMERATION:
21503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "enumeration");
21504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_LENGTH:
21505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "length");
21506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXLENGTH:
21507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxLength");
21508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINLENGTH:
21509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minLength");
21510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_TOTALDIGITS:
21511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "totalDigits");
21512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_FRACTIONDIGITS:
21513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "fractionDigits");
21514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
21515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
21516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (BAD_CAST "Internal Error");
21518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWhitespaceValueType
21521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type)
21522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The normalization type can be changed only for types which are derived
21525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * from xsd:string.
21526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
21528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we assume a whitespace of preserve for anySimpleType.
21530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_STRING) ||
21532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
21533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_PRESERVE);
21534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (type->builtInType == XML_SCHEMAS_NORMSTRING)
21535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_REPLACE);
21536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
21537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2153860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * For all �atomic� datatypes other than string (and types �derived�
2153960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * by �restriction� from it) the value of whiteSpace is fixed to
21540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * collapse
21541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that this includes built-in list datatypes.
21542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
21543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_COLLAPSE);
21544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
21546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For list types the facet "whiteSpace" is fixed to "collapse".
21548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
21551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMA_WHITESPACE_UNKNOWN);
21552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_ATOMIC(type)) {
21553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
21554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_PRESERVE);
21555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
21556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_REPLACE);
21557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
21558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
21561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2156494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2156594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Simple type validation				*
2156694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
21567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2157194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2157294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			DOM Validation code				*
2157394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
21574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssembleByLocation:
21578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema parser context
21579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt:  a schema validation context
21580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the existing schema
21581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node that fired the assembling
21582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nsName: the namespace name of the new schema
21583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @location: the location of the schema
21584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expands an existing schema by an additional schema.
21586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the new schema is correct, a positive error code
21588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
21589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
21592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPtr schema,
21593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodePtr node,
21594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *nsName,
21595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *location)
21596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
21598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr pctxt;
21599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
21600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt == NULL) || (schema == NULL))
21602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
21603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->pctxt == NULL) {
21605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaAssembleByLocation",
21606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no parser context available");
21607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = vctxt->pctxt;
21610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->constructor == NULL) {
21611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaAssembleByLocation",
21612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no constructor");
21613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Acquire the schema document.
21617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
21619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	location, node);
21620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here;
21622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the process will automatically change this to
21623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document.
21624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
2162660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	location, NULL, NULL, 0, node, NULL, nsName,
21627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&bucket);
21628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
2162960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(ret);
2163060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (bucket == NULL) {
21631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Generate a warning that the document could not be located.
21633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
21635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node, NULL,
21636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The document at location '%s' could not be acquired",
21637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    location, NULL, NULL);
21638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
21639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The first located schema will be handled as if all other
21642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schemas imported by XSI were imported by this first schema.
21643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket != NULL) &&
21645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_CONSTRUCTOR(pctxt)->bucket == NULL))
21646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
21647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is this handled like an import? I.e. is it not an error
21649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if the schema cannot be located?
21650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket)))
21652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
21653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We will reuse the parser context for every schema imported
21655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * directly via XSI. So reset the context.
21656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->nberrors = 0;
21658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->err = 0;
21659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = bucket->doc;
2166060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2166160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket);
21662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1) {
21663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->doc = NULL;
21664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Paranoid error channelling. */
21667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (pctxt->nberrors != 0))
2166860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ret = pctxt->err;
2166960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (pctxt->nberrors == 0) {
2167060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
21671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only bother to fixup pending components, if there was
21672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* no error yet.
21673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For every XSI acquired schema (and its sub-schemata) we will
21674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* fixup the components.
21675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFixupComponents(pctxt, bucket);
21677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = pctxt->err;
21678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Not nice, but we need somehow to channel the schema parser
21680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* error to the validation context.
21681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret != 0) && (vctxt->err == 0))
21683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->err = ret;
21684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nberrors += pctxt->nberrors;
21685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2168660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* Add to validation error sum. */
21687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nberrors += pctxt->nberrors;
21688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = NULL;
21690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
21691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
21692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = NULL;
21693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
21694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttrInfoPtr
2169760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
21698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int metaType)
21699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
21701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
21702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
21703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
21704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
21705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->nbAttrInfos; i++) {
21707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[i];
21708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType == metaType)
21709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (iattr);
21710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
21714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssembleByXSI:
21718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt:  a schema validation context
21719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expands an existing schema by an additional schema using
21721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute
21722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace
21723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * must be set to 1.
21724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the new schema is correct, a positive error code
21726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
21727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
21730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur, *end;
21732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsname = NULL, *location;
21733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
21734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
21735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
21736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the value; we will assume an even number of values
21739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to be given (this is how Xerces and XSV work).
21740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
21741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: !! This needs to work for both
21742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @noNamespaceSchemaLocation AND @schemaLocation on the same
21743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * element !!
21744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
21747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
21748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
21750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
21751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
21752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = iattr->value;
21753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
21754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move the string parsing mechanism away from here.
21756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
21758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
21759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the namespace name.
21760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
21761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
21762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
21763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
21764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
21765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
21766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
21767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count++; /* TODO: Don't use the schema's dict. */
21769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
21770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
21771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the URI.
21774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*cur))
21776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
21777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end = cur;
21778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*end != 0) && (!(IS_BLANK_CH(*end))))
21779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end++;
21780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (end == cur) {
21781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType ==
21782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
21783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
21784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
21785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* If using @schemaLocation then tuples are expected.
21786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* I.e. the namespace name *and* the document's URI.
2178760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
21788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
21789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->node, NULL,
21790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The value must consist of tuples: the target namespace "
21791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "name and the document's URI", NULL, NULL, NULL);
21792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	count++; /* TODO: Don't use the schema's dict. */
21796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	location = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
21797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = end;
21798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
21799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->node, nsname, location);
21800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
21801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaAssembleByXSI",
21802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"assembling schemata");
21803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
21804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*cur != 0);
21806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
21807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
21810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
21811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *prefix)
21812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->sax != NULL) {
21814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j;
21815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr inode;
2181660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = vctxt->depth; i >= 0; i--) {
21818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->elemInfos[i]->nbNsBindings != 0) {
21819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode = vctxt->elemInfos[i];
21820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 0; j < inode->nbNsBindings * 2; j += 2) {
21821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (((prefix == NULL) &&
21822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (inode->nsBindings[j] == NULL)) ||
21823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((prefix != NULL) && xmlStrEqual(prefix,
21824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->nsBindings[j]))) {
21825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
21827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Note that the namespace bindings are already
21828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* in a string dict.
21829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
2183060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return (inode->nsBindings[j+1]);
21831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
21832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
2183660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef LIBXML_READER_ENABLED
21837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->reader != NULL) {
21838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *nsName;
2183960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix);
21841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName != NULL) {
21842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *ret;
21843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlDictLookup(vctxt->dict, nsName, -1);
21845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsName);
21846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ret);
21847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
21848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
21849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
21850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
21851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns;
21852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->inode->node == NULL) ||
21854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->node->doc == NULL)) {
21855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaLookupNamespace",
21856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"no node or node's doc avaliable");
21857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
21858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ns = xmlSearchNs(vctxt->inode->node->doc,
21860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->node, prefix);
21861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns != NULL)
21862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ns->href);
21863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
21864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
21868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* This one works on the schema of the validation context.
21869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
21870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2187160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
21872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaPtr schema,
21873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr node,
21874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  const xmlChar *value,
21875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaValPtr *val,
21876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int valNeeded)
21877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
21879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt && (vctxt->schema == NULL)) {
21881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateNotation",
21882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "a schema is needed on the validation context");
21883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
21884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
21886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
21887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
21888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
21889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *localName = NULL;
21890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *prefix = NULL;
21891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	localName = xmlSplitQName2(value, &prefix);
21893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prefix != NULL) {
21894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *nsName = NULL;
21895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2189660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (vctxt != NULL)
21897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix);
21898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (node != NULL) {
21899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix);
21900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns != NULL)
21901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nsName = ns->href;
21902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
21903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(prefix);
21904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(localName);
21905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsName == NULL) {
21908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(prefix);
21909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(localName);
21910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) {
2191360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((valNeeded) && (val != NULL)) {
2191460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName),
2191560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott						       xmlStrdup(nsName));
21916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*val == NULL)
21917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = -1;
21918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
21920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
21921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
21922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(localName);
21923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
21924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaGetNotation(schema, value, NULL) != NULL) {
21925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (valNeeded && (val != NULL)) {
21926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (*val) = xmlSchemaNewNOTATIONValue(
21927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			BAD_CAST xmlStrdup(value), NULL);
21928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*val == NULL)
21929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = -1;
21930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
21932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
21936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
21940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar* lname,
21941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar* nsname)
21942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
21944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lname = xmlDictLookup(vctxt->dict, lname, -1);
21946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lname == NULL)
21947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nsname != NULL) {
21949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsname = xmlDictLookup(vctxt->dict, nsname, -1);
21950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsname == NULL)
21951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
21952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) {
21954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->nodeQNames->items [i] == lname) &&
21955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->nodeQNames->items[i +1] == nsname))
21956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Already there */
21957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(i);
21958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Add new entry. */
21960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = vctxt->nodeQNames->nbItems;
21961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname);
21962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname);
21963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(i);
21964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2196794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
21968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  Validation of identity-constraints (IDC)                            *
2196994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
21970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAugmentIDC:
21974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idcDef: the IDC definition
21975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an augmented IDC definition item.
21977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the item, or NULL on internal errors.
21979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
21981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef,
21982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValidCtxtPtr vctxt)
21983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
21985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug));
21987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (aidc == NULL) {
21988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(vctxt,
21989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
21990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
21991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
21992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->keyrefDepth = -1;
21994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->def = idcDef;
21995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->next = NULL;
21996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs == NULL)
21997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = aidc;
21998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
21999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	aidc->next = vctxt->aidcs;
22000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = aidc;
22001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save if we have keyrefs at all.
22004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->hasKeyrefs == 0) &&
22006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
22007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->hasKeyrefs = 1;
22008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAugmentImportedIDC:
22012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @imported: the imported schema
22013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an augmented IDC definition for the imported schema.
22015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) {
22018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (imported->schema->idcDef != NULL) {
22019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlHashScan(imported->schema->idcDef ,
22020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashScanner) xmlSchemaAugmentIDC, vctxt);
22021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCNewBinding:
22026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idcDef: the IDC definition of this binding
22027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new IDC binding.
22029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new IDC binding, NULL on internal errors.
22031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPSVIIDCBindingPtr
22033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
22034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr ret;
22036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc(
22038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCBinding));
22039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
22040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(NULL,
22041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a PSVI IDC binding item", NULL);
22042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
22043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding));
22045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->definition = idcDef;
22046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
22047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCStoreNodeTableItem:
22051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the IDC node table item
22053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The validation context is used to store IDC node table items.
22055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * They are stored to avoid copying them if IDC node-tables are merged
22056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with corresponding parent IDC node-tables (bubbling).
22057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if succeeded, -1 on internal errors.
22059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
22062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaPSVIIDCNodePtr item)
22063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to gobal list.
22066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcNodes == NULL) {
22068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr));
22070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcNodes == NULL) {
22071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the IDC node table item list", NULL);
22073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes = 20;
22076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
22077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes *= 2;
22078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
22080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCNodePtr));
22081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcNodes == NULL) {
22082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the IDC node table item list", NULL);
22084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->idcNodes[vctxt->nbIdcNodes++] = item;
22088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCStoreKey:
22094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the IDC key
22096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The validation context is used to store an IDC key.
22098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if succeeded, -1 on internal errors.
22100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
22103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPSVIIDCKeyPtr key)
22104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to gobal list.
22107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcKeys == NULL) {
22109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr));
22111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcKeys == NULL) {
22112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the IDC key storage list", NULL);
22114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcKeys = 40;
22117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
22118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcKeys *= 2;
22119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
22121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCKeyPtr));
22122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcKeys == NULL) {
22123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the IDC key storage list", NULL);
22125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->idcKeys[vctxt->nbIdcKeys++] = key;
22129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAppendNodeTableItem:
22135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @bind: the IDC binding
22136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ntItem: the node-table item
22137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appends the IDC node-table item to the binding.
22139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind,
22144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPSVIIDCNodePtr ntItem)
22145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->nodeTable == NULL) {
22147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->sizeNodes = 10;
22148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
22150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable == NULL) {
22151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an array of IDC node-table items", NULL);
22153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
22154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (bind->sizeNodes <= bind->nbNodes) {
22156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->sizeNodes *= 2;
22157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(bind->nodeTable, bind->sizeNodes *
22159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sizeof(xmlSchemaPSVIIDCNodePtr));
22160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable == NULL) {
22161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating an array of IDC node-table items", NULL);
22163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
22164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    bind->nodeTable[bind->nbNodes++] = ntItem;
22167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
22168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAcquireBinding:
22172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the IDC matcher
22174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Looks up an PSVI IDC binding, for the IDC definition and
22176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the given matcher. If none found, a new one is created
22177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and added to the IDC table.
22178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an IDC binding or NULL on internal errors.
22180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPSVIIDCBindingPtr
22182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
22183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaIDCMatcherPtr matcher)
22184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
22186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem = vctxt->elemInfos[matcher->depth];
22188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcTable == NULL) {
22190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
22191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ielem->idcTable == NULL)
22192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
22193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ielem->idcTable);
22194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
22195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCBindingPtr bind = NULL;
22196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = ielem->idcTable;
22198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
22199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->definition == matcher->aidc->def)
22200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(bind);
22201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->next == NULL) {
22202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
22203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (bind->next == NULL)
22204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (NULL);
22205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(bind->next);
22206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = bind->next;
22208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (bind != NULL);
22209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
22211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaItemListPtr
22214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
22215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCMatcherPtr matcher)
22216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (matcher->targets == NULL)
22218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->targets = xmlSchemaItemListCreate();
22219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(matcher->targets);
22220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeKey:
22224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @key: the IDC key
22225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC key together with its compiled value.
22227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key)
22230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (key->val != NULL)
22232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(key->val);
22233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(key);
22234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeBinding:
22238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC binding. Note that the node table-items
22240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are not freed.
22241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind)
22244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->nodeTable != NULL)
22246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(bind->nodeTable);
22247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->dupls != NULL)
2224860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaItemListFree(bind->dupls);
22249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(bind);
22250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeIDCTable:
22254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @bind: the first IDC binding in the list
22255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC table, i.e. all the IDC bindings in the list.
22257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind)
22260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr prev;
22262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (bind != NULL) {
22264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = bind;
22265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
22266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeBinding(prev);
22267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeMatcherList:
22272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the first IDC matcher in the list
22273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees a list of IDC matchers.
22275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
22278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr next;
22280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
22282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = matcher->next;
2228360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (matcher->keySeqs != NULL) {
22284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
22285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->sizeKeySeqs; i++)
22286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs[i] != NULL)
22287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(matcher->keySeqs[i]);
2228860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlFree(matcher->keySeqs);
22289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matcher->targets != NULL) {
22291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
22293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCNodePtr idcNode;
22294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Node-table items for keyrefs are not stored globally
22296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to the validation context, since they are not bubbled.
22297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to free them here.
22298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < matcher->targets->nbItems; i++) {
22300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    idcNode =
22301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
22302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode->keys);
22303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode);
22304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(matcher->targets);
22307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(matcher);
22309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = next;
22310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCReleaseMatcherList:
22315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the first IDC matcher in the list
22317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Caches a list of IDC matchers for reuse.
22319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
22322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaIDCMatcherPtr matcher)
22323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr next;
22325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
22327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = matcher->next;
2232860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (matcher->keySeqs != NULL) {
22329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
22330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Don't free the array, but only the content.
22332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->sizeKeySeqs; i++)
22334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs[i] != NULL) {
22335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(matcher->keySeqs[i]);
22336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->keySeqs[i] = NULL;
22337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matcher->targets) {
22340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
22342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCNodePtr idcNode;
22343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Node-table items for keyrefs are not stored globally
22345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to the validation context, since they are not bubbled.
22346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to free them here.
22347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < matcher->targets->nbItems; i++) {
22349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    idcNode =
22350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
22351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode->keys);
22352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode);
22353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(matcher->targets);
22356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets = NULL;
2235760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->next = NULL;
22359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Cache the matcher.
22361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcMatcherCache != NULL)
22363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->nextCached = vctxt->idcMatcherCache;
22364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcMatcherCache = matcher;
22365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = next;
22367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAddStateObject:
22372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the IDC matcher
22374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sel: the XPath information
22375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: the parent "selector" state object if any
22376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: "selector" or "field"
22377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/reuses and activates state objects for the given
22379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath information; if the XPath expression consists of unions,
22380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * multiple state objects are created for every unioned expression.
22381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
22386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCMatcherPtr matcher,
22387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCSelectPtr sel,
22388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int type)
22389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto;
22391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reuse the state objects from the pool.
22394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStatePool != NULL) {
22396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = vctxt->xpathStatePool;
22397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xpathStatePool = sto->next;
22398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->next = NULL;
2239960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
22400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a new state object.
22402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj));
22404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto == NULL) {
22405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an IDC state object", NULL);
22407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(sto, 0, sizeof(xmlSchemaIDCStateObj));
2241060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
22411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2241260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Add to global list.
2241360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
22414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL)
22415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->next = vctxt->xpathStates;
22416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->xpathStates = sto;
22417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Free the old xpath validation context.
22420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sto->xpathCtxt != NULL)
22422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
22423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a new XPath (pattern) validation context.
22426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt(
22428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlPatternPtr) sel->xpathComp);
22429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sto->xpathCtxt == NULL) {
22430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaIDCAddStateObject",
22431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to create an XPath validation context");
22432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
2243360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
22434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->type = type;
22435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->depth = vctxt->depth;
22436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->matcher = matcher;
22437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->sel = sel;
22438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->nbHistory = 0;
2243960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "IDC:   STO push '%s'\n",
22442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->sel->xpath);
22443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathEvaluate:
22449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodeType: the nodeType of the current node
22451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates all active XPath state objects.
22453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of IC "field" state objects which resolved to
22455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this node, 0 if none resolved and -1 on internal errors.
22456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
22459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlElementType nodeType)
22460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto, head = NULL, first;
22462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, resolved = 0, depth = vctxt->depth;
2246360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
22466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodeType == XML_ATTRIBUTE_NODE)
22468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth++;
22469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
22471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2247260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
2247360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "IDC: EVAL on %s, depth %d, type %d\n",
22474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
22475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), depth, nodeType);
22476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
22477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process all active XPath state objects.
22481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    first = vctxt->xpathStates;
22483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = first;
22484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != head) {
22485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR)
2248760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] selector '%s'\n",
22488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->matcher->aidc->def->name, sto->sel->xpath);
22489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2249060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] field '%s'\n",
22491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->matcher->aidc->def->name, sto->sel->xpath);
22492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE)
22494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
22495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, vctxt->inode->nsName);
22496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
22497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
22498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, vctxt->inode->nsName);
22499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1) {
22501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaXPathEvaluate",
22502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlStreamPush()");
22503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 0)
22506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_sto;
22507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Full match.
22509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:     "
22512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "MATCH\n");
22513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Register a match in the state object history.
22516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->history == NULL) {
22518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->history = (int *) xmlMalloc(5 * sizeof(int));
22519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sto->history == NULL) {
2252060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
22521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating the state object history", NULL);
22522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
22523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sizeHistory = 5;
22525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->sizeHistory <= sto->nbHistory) {
22526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sizeHistory *= 2;
22527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->history = (int *) xmlRealloc(sto->history,
22528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->sizeHistory * sizeof(int));
22529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sto->history == NULL) {
2253060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
22531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "re-allocating the state object history", NULL);
22532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
22533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2253460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->history[sto->nbHistory++] = depth;
22536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:       push match '%d'\n",
22539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth);
22540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCSelectPtr sel;
22544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Activate state objects for the IDC fields of
22546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the IDC selector.
22547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "IDC:     "
22550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"activating field states\n");
22551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sel = sto->matcher->aidc->def->fields;
22553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (sel != NULL) {
22554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
22555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
22556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
22557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sel = sel->next;
22558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * An IDC key node was found by the IDC field.
22562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
22565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"IDC:     key found\n");
22566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Notify that the character value of this node is
22569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * needed.
22570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resolved == 0) {
22572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((vctxt->inode->flags &
22573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
22574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
22575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resolved++;
22577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sto:
22579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->next == NULL) {
22580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate field state objects created on this node as well.
22582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    head = first;
22584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = vctxt->xpathStates;
22585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
22586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
22587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (resolved);
22589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
22592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
22593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlChar **buf,
22594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaPSVIIDCKeyPtr *seq,
22595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int count)
22596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, res;
22598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
22599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrdup(BAD_CAST "[");
22601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < count; i++) {
22602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
2260360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val,
22604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type),
22605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &value);
22606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 0)
22607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST value);
22608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
22609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaFormatIDCKeySequence",
22610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to compute a canonical value");
22611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "???");
22612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (i < count -1)
22614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "', ");
22615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
22616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
22617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL) {
22618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value);
22619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = NULL;
22620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST "]");
22623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (BAD_CAST *buf);
22625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathPop:
22629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops all XPath states.
22632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
22637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto;
22639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
22640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
22643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = vctxt->xpathStates;
22644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
22645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1)
22647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = sto->next;
22649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (sto != NULL);
22650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
22651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathProcessHistory:
22655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the simple/complex type of the current node if any at all
22657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precompiled value
22658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Processes and pops the history items of the IDC state objects.
22660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * IDC key-sequences are validated/created on IDC bindings.
2266160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
22662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
22666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int depth)
22667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto, nextsto;
22669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, matchDepth;
22670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr key = NULL;
22671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL;
22672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
22675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = vctxt->xpathStates;
22676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
22679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2268060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
22681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "IDC: BACK on %s, depth %d\n",
22682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
22683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), vctxt->depth);
22684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
22685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2268660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
22687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the state objects.
22689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != NULL) {
22691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1) {
22693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaXPathProcessHistory",
22694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlStreamPop()");
22695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:   stream pop '%s'\n",
22699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sel->xpath);
22700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->nbHistory == 0)
22702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto deregister_check;
22703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matchDepth = sto->history[sto->nbHistory -1];
22705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only matches at the current depth are of interest.
22708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matchDepth != depth) {
22710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
22711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2271260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: According to
22716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198
22717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   ... the simple-content of complex types is also allowed.
22718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2271960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(type)) {
22721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_HAS_SIMPLE_CONTENT(type)) {
22722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Sanity check for complex types with simple content.
22724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    simpleType = type->contentTypeDef;
22726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (simpleType == NULL) {
22727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaXPathProcessHistory",
22728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "field resolves to a CT with simple content "
22729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "but the CT is missing the ST definition");
22730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
22733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    simpleType = NULL;
2273460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    } else
22735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		simpleType = type;
22736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (simpleType == NULL) {
22737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
2273860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Not qualified if the field resolves to a node of non
22741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* simple type.
2274260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
2274460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    XML_SCHEMAV_CVC_IDC, NULL,
22745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST sto->matcher->aidc->def,
22746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The XPath '%s' of a field of %s does evaluate to a node of "
22747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "non-simple type",
22748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sto->sel->xpath,
22749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def));
22750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
22751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->nbHistory--;
22752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto deregister_check;
22753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2275460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((key == NULL) && (vctxt->inode->val == NULL)) {
22756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Failed to provide the normalized value; maybe
22758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the value was invalid.
22759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_IDC,
22761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST sto->matcher->aidc->def,
22762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Warning: No precomputed value available, the value "
22763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "was either invalid or something strange happend");
22764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->nbHistory--;
22765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto deregister_check;
22766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
22767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaIDCMatcherPtr matcher = sto->matcher;
22768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCKeyPtr *keySeq;
22769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int pos, idx;
2277060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The key will be anchored on the matcher's list of
22773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* key-sequences. The position in this list is determined
22774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* by the target node's depth relative to the matcher's
22775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* depth of creation (i.e. the depth of the scope element).
2277660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*
22777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Element        Depth    Pos   List-entries
22778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <scope>          0              NULL
22779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   <bar>          1              NULL
22780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     <target/>    2       2      target
22781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   <bar>
22782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                * </scope>
22783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
22784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The size of the list is only dependant on the depth of
22785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the tree.
22786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* An entry will be NULLed in selector_leave, i.e. when
2278760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* we hit the target's
2278860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos = sto->depth - matcher->depth;
22790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idx = sto->sel->index;
2279160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create/grow the array of key-sequences.
22794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs == NULL) {
2279660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if (pos > 9)
22797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs = pos * 2;
22798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
22799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs = 10;
2280060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlMalloc(matcher->sizeKeySeqs *
2280260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			sizeof(xmlSchemaPSVIIDCKeyPtr *));
2280360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if (matcher->keySeqs == NULL) {
22804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating an array of key-sequences",
22806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
22807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
22808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memset(matcher->keySeqs, 0,
22810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs *
22811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKeyPtr *));
2281260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else if (pos >= matcher->sizeKeySeqs) {
22813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int i = matcher->sizeKeySeqs;
2281460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->sizeKeySeqs *= 2;
22816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlRealloc(matcher->keySeqs,
22818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs *
22819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKeyPtr *));
22820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (matcher->keySeqs == NULL) {
22821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "reallocating an array of key-sequences",
22823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
22824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * The array needs to be NULLed.
22828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Use memset?
22829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2283060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    for (; i < matcher->sizeKeySeqs; i++)
2283160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			matcher->keySeqs[i] = NULL;
22832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2283360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get/create the key-sequence.
22836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2283760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		keySeq = matcher->keySeqs[pos];
2283860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (keySeq == NULL) {
22839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto create_sequence;
22840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (keySeq[idx] != NULL) {
22841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
22842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * cvc-identity-constraint:
2284460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 3 For each node in the �target node set� all
22845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * of the {fields}, with that node as the context
22846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * node, evaluate to either an empty node-set or
22847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * a node-set with exactly one member, which must
22848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * have a simple type.
2284960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    *
22850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * The key was already set; report an error.
22851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2285260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
22853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, NULL,
22854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST matcher->aidc->def,
22855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The XPath '%s' of a field of %s evaluates to a "
22856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"node-set with more than one member",
22857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sto->sel->xpath,
22858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetIDCDesignation(&str, matcher->aidc->def));
22859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
22860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sto->nbHistory--;
22861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto deregister_check;
22862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
2286360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    goto create_key;
2286460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcreate_sequence:
22866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a key-sequence.
22868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc(
2287060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    matcher->aidc->def->nbFields *
22871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sizeof(xmlSchemaPSVIIDCKeyPtr));
22872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (keySeq == NULL) {
2287360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaVErrMemory(NULL,
22874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating an IDC key-sequence", NULL);
2287560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return(-1);
2287660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
2287760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		memset(keySeq, 0, matcher->aidc->def->nbFields *
22878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sizeof(xmlSchemaPSVIIDCKeyPtr));
22879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		matcher->keySeqs[pos] = keySeq;
22880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcreate_key:
22881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a key once per node only.
2288360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (key == NULL) {
22885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc(
22886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKey));
22887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (key == NULL) {
22888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating a IDC key", NULL);
22890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(keySeq);
22891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->keySeqs[pos] = NULL;
2289260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return(-1);
22893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Consume the compiled value.
22896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key->type = simpleType;
22898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key->val = vctxt->inode->val;
22899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->val = NULL;
22900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Store the key in a global list.
22902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIDCStoreKey(vctxt, key) == -1) {
22904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCFreeKey(key);
22905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2290860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		keySeq[idx] = key;
22909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
2291160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCKeyPtr **keySeq = NULL;
22913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* xmlSchemaPSVIIDCBindingPtr bind; */
22914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCNodePtr ntItem;
22915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCMatcherPtr matcher;
22916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCPtr idc;
22917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListPtr targets;
22918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int pos, i, j, nbKeys;
22919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Here we have the following scenario:
22921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * An IDC 'selector' state object resolved to a target node,
2292260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * during the time this target node was in the
2292360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * ancestor-or-self axis, the 'field' state object(s) looked
2292460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * out for matching nodes to create a key-sequence for this
22925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * target node. Now we are back to this target node and need
2292660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * to put the key-sequence, together with the target node
2292760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * itself, into the node-table of the corresponding IDC
22928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * binding.
22929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = sto->matcher;
22931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc = matcher->aidc->def;
22932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbKeys = idc->nbFields;
2293360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    pos = depth - matcher->depth;
22934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check if the matcher has any key-sequences at all, plus
22936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if it has a key-sequence for the current target node.
2293760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
22938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((matcher->keySeqs == NULL) ||
22939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(matcher->sizeKeySeqs <= pos)) {
22940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_key_error;
22942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
22943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2294560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2294660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    keySeq = &(matcher->keySeqs[pos]);
22947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*keySeq == NULL) {
22948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_key_error;
22950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
22951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2295360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < nbKeys; i++) {
22955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*keySeq)[i] == NULL) {
22956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Not qualified, if not all fields did resolve.
22958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
22960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
22961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* All fields of a "key" IDC must resolve.
22962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
22963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto selector_key_error;
2296460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
22965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * All fields did resolve.
22970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2297160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 4.1 If the {identity-constraint category} is unique(/key),
2297460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * then no two members of the �qualified node set� have
2297560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �key-sequences� whose members are pairwise equal, as
22976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * defined by Equal in [XML Schemas: Datatypes].
22977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
22978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the IDC binding from the matcher and check for
22979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * duplicate key-sequences.
22980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
22982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
22983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
2298560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
22986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(targets->nbItems != 0)) {
22987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
2298860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i = 0;
22990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = 0;
22991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Compare the key-sequences, key by key.
22993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
22995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bkeySeq =
22996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys;
22997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < nbKeys; j++) {
22998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ckey = (*keySeq)[j];
2299960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			bkey = bkeySeq[j];
23000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
23001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == -1) {
23002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
23003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (res == 0) {
23004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
23005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * One of the keys differs, so the key-sequence
23006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * won't be equal; get out.
23007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
23008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res == 1) {
23012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Duplicate key-sequence found.
23014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
23016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
23018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (i < targets->nbItems);
23019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (i != targets->nbItems) {
23020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL, *strB = NULL;
2302160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
23022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Try to report the key-sequence.
23023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2302460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
23025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, NULL,
23026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST idc,
23027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Duplicate key-sequence %s in %s",
23028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatIDCKeySequence(vctxt, &str,
23029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (*keySeq), nbKeys),
23030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetIDCDesignation(&strB, idc));
23031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
23032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strB);
23033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
23034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add a node-table item to the IDC binding.
23038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc(
23040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sizeof(xmlSchemaPSVIIDCNode));
23041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ntItem == NULL) {
2304260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
23043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating an IDC node-table item", NULL);
23044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(*keySeq);
23045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*keySeq = NULL;
23046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
2304760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
23048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode));
2304960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2305060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
23051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Store the node-table item in a global list.
23052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
23055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*keySeq);
23057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *keySeq = NULL;
23058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
23059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ntItem->nodeQNameID = -1;
23061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
23062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Save a cached QName for this node on the IDC node, to be
23064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* able to report it, even if the node is not saved.
23065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
23067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->localName, vctxt->inode->nsName);
23068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ntItem->nodeQNameID == -1) {
23069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*keySeq);
23071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *keySeq = NULL;
2307260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return (-1);
23073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Init the node-table item: Save the node, position and
23077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * consume the key-sequence.
23078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->node = vctxt->node;
23080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->nodeLine = vctxt->inode->nodeLine;
23081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->keys = *keySeq;
23082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *keySeq = NULL;
23083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2308460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1)
23085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
23087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
2308860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
23089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Free the item, since keyref items won't be
23090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * put on a global list.
23091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem->keys);
23093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
23096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2309760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto selector_leave;
23099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectselector_key_error:
23100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
23101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
23102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2310360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 4.2.1 (KEY) The �target node set� and the
2310460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �qualified node set� are equal, that is, every
2310560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* member of the �target node set� is also a member
2310660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* of the �qualified node set� and vice versa.
23107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2310860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaCustomErr(ACTXT_CAST vctxt,
23109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_IDC, NULL,
23110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST idc,
23111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Not all fields of %s evaluate to a node",
23112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetIDCDesignation(&str, idc), NULL);
23113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
23114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectselector_leave:
23116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Free the key-sequence if not added to the IDC table.
23118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((keySeq != NULL) && (*keySeq != NULL)) {
23120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(*keySeq);
23121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*keySeq = NULL;
23122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} /* if selector */
2312460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->nbHistory--;
23126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectderegister_check:
23128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Deregister state objects if they reach the depth of creation.
23130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((sto->nbHistory == 0) && (sto->depth == depth)) {
23132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
23133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "IDC:   STO pop '%s'\n",
23134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->sel->xpath);
23135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->xpathStates != sto) {
23137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaXPathProcessHistory",
23138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The state object to be removed is not the first "
23139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "in the list");
23140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nextsto = sto->next;
23142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Unlink from the list of active XPath state objects.
23144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->xpathStates = sto->next;
23146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->next = vctxt->xpathStatePool;
23147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Link it to the pool of reusable state objects.
23149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->xpathStatePool = sto;
23151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = nextsto;
23152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
23153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
23154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } /* while (sto != NULL) */
23155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
23159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCRegisterMatchers:
23160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
23161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDecl: the element declaration
23162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates helper objects to evaluate IDC selectors/fields
23164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * successively.
23165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if OK and -1 on internal errors.
23167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
23170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaElementPtr elemDecl)
23171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher, last = NULL;
23173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr idc, refIdc;
23174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
2317560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    idc = (xmlSchemaIDCPtr) elemDecl->idcs;
23177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc == NULL)
23178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
2317960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
23181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
23182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2318360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
23184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "IDC: REGISTER on %s, depth %d\n",
23185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName,
23186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), vctxt->depth);
23187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
23188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->idcMatchers != NULL) {
23191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaIDCRegisterMatchers",
23192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The chain of IDC matchers is expected to be empty");
23193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
23194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
23196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Since IDCs bubbles are expensive we need to know the
23199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * depth at which the bubbles should stop; this will be
23200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the depth of the top-most keyref IDC. If no keyref
23201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * references a key/unique IDC, the keyrefDepth will
23202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be -1, indicating that no bubbles are needed.
23203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    refIdc = (xmlSchemaIDCPtr) idc->ref->item;
23205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (refIdc != NULL) {
23206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remember that we have keyrefs on this node.
23208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->hasKeyrefs = 1;
23210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Lookup the referenced augmented IDC info.
23212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc = vctxt->aidcs;
23214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (aidc != NULL) {
23215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (aidc->def == refIdc)
23216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
23217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    aidc = aidc->next;
23218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (aidc == NULL) {
23220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaIDCRegisterMatchers",
23221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Could not find an augmented IDC item for an IDC "
23222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"definition");
23223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
2322460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
23225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((aidc->keyrefDepth == -1) ||
23226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->depth < aidc->keyrefDepth))
23227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    aidc->keyrefDepth = vctxt->depth;
23228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Lookup the augmented IDC item for the IDC definition.
23232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	aidc = vctxt->aidcs;
23234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (aidc != NULL) {
23235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (aidc->def == idc)
23236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
23237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = aidc->next;
23238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (aidc == NULL) {
23240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaIDCRegisterMatchers",
23241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Could not find an augmented IDC item for an IDC definition");
23242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
23243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create an IDC matcher for every IDC definition.
23246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcMatcherCache != NULL) {
23248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Reuse a cached matcher.
23250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = vctxt->idcMatcherCache;
23252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->idcMatcherCache = matcher->nextCached;
23253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->nextCached = NULL;
23254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2325560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    matcher = (xmlSchemaIDCMatcherPtr)
23256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlMalloc(sizeof(xmlSchemaIDCMatcher));
23257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher == NULL) {
2325860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(vctxt,
23259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating an IDC matcher", NULL);
23260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
23261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(matcher, 0, sizeof(xmlSchemaIDCMatcher));
23263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (last == NULL)
23265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->idcMatchers = matcher;
23266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
23267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last->next = matcher;
23268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	last = matcher;
23269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->type = IDC_MATCHER;
2327160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	matcher->depth = vctxt->depth;
23272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->aidc = aidc;
23273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->idcType = aidc->def->type;
2327460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef DEBUG_IDC
23275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:   register matcher\n");
2327660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
23277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2327860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Init the automaton state object.
23279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2328060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (xmlSchemaIDCAddStateObject(vctxt, matcher,
23281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
23282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
23283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idc = idc->next;
23285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (idc != NULL);
23286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
23291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaNodeInfoPtr ielem)
23292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind;
23294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable;
23295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys;
23296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr *targets, *dupls;
2329760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
23299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* vctxt->createIDCNodeTables */
23300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
23301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip keyref IDCs and empty IDC target-lists.
23303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
23305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ILIST_IS_EMPTY(matcher->targets))
23306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->next;
23308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
23309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If we _want_ the IDC node-table to be created in any case
23312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then do so. Otherwise create them only if keyrefs need them.
23313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! vctxt->createIDCNodeTables) &&
23315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((matcher->aidc->keyrefDepth == -1) ||
23316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (matcher->aidc->keyrefDepth > vctxt->depth)))
23317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->next;
23319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
23320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get/create the IDC binding on this element for the IDC definition.
23323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_ILIST_IS_EMPTY(bind->dupls)) {
23327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items;
23328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbDupls = bind->dupls->nbItems;
23329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dupls = NULL;
2333160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    nbDupls = 0;
23332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable != NULL) {
23334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbNodeTable = bind->nbNodes;
23335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbNodeTable = 0;
23337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nbNodeTable == 0) && (nbDupls == 0)) {
23340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Transfer all IDC target-nodes to the IDC node-table.
23342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->nodeTable =
2334460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		(xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->sizeNodes = matcher->targets->sizeItems;
23346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->nbNodes = matcher->targets->nbItems;
23347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->items = NULL;
23349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->sizeItems = 0;
2335060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    matcher->targets->nbItems = 0;
23351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Compare the key-sequences and add to the IDC node-table.
23354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbTargets = matcher->targets->nbItems;
2335660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = matcher->aidc->def->nbFields;
23358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i = 0;
23359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
23360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		keys = targets[i]->keys;
2336160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (nbDupls) {
23362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Search in already found duplicates first.
23364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j = 0;
2336660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    do {
23367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[0]->val,
23369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				dupls[j]->keys[0]->val);
23370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == -1)
23371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Equal key-sequence.
23375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_target;
23377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = 0;
23380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ntkeys = dupls[j]->keys;
23381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ntkeys[k]->val);
23384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == -1)
23385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0) {
23387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    /*
23388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    * One of the keys differs.
23389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    */
23390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Equal key-sequence found.
23396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_target;
23398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
2340160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } while (j < nbDupls);
23402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (nbNodeTable) {
23404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j = 0;
2340560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    do {
23406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[0]->val,
23408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				bind->nodeTable[j]->keys[0]->val);
23409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == -1)
23410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 0) {
23412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* The key-sequence differs.
23414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_node_table_entry;
23416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = 0;
23419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ntkeys = bind->nodeTable[j]->keys;
23420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ntkeys[k]->val);
23423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == -1)
23424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0) {
23426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    /*
23427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    * One of the keys differs.
23428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    */
23429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto next_node_table_entry;
23430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2343260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			}
23433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Add the duplicate to the list of duplicates.
23435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (bind->dupls == NULL) {
23437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    bind->dupls = xmlSchemaItemListCreate();
23438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (bind->dupls == NULL)
23439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
2344060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			}
23441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1)
23442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto internal_error;
23443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate entry from the IDC node-table.
23445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1];
23447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nbNodes--;
23448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_target;
23450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node_table_entry:
23452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (j < nbNodeTable);
23454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* If everything is fine, then add the IDC target-node to
23457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the IDC node-table.
23458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1)
23460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
23461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_target:
23463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i++;
23464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (i < nbTargets);
23465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = matcher->next;
23467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
23469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
23471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
23472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2347560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaBubbleIDCNodeTables:
23476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the current tree depth
23477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2347860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Merges IDC bindings of an element at @depth into the corresponding IDC
2347960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * bindings of its parent element. If a duplicate note-table entry is found,
2348060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * both, the parent node-table entry and child entry are discarded from the
23481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-table of the parent.
23482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if OK and -1 on internal errors.
23484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
23487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */
23489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */
23490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */
23491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
23492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k, ret = 0, nbFields, oldNum, oldDupls;
23493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2349460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    bind = vctxt->inode->idcTable;
23495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind == NULL) {
23496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Fine, no table, no bubbles. */
23497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
23498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2349960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
23501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Walk all bindings; create new or add to existing bindings.
23503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Remove duplicate key-sequences.
23504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (bind != NULL) {
2350660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls))
23508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_binding;
23509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check if the key/unique IDC table needs to be bubbled.
23511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! vctxt->createIDCNodeTables) {
23513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = vctxt->aidcs;
23514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
23515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (aidc->def == bind->definition) {
2351660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if ((aidc->keyrefDepth == -1) ||
23517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(aidc->keyrefDepth >= vctxt->depth)) {
23518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_binding;
23519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
23521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc = aidc->next;
23523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (aidc != NULL);
23524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parTable != NULL)
23527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = *parTable;
23528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Search a matching parent binding for the
23530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* IDC definition.
23531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2353260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	while (parBind != NULL) {
23533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (parBind->definition == bind->definition)
23534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
23535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = parBind->next;
23536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parBind != NULL) {
23539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2354060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Compare every node-table entry of the child node,
23541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * i.e. the key-sequence within, ...
23542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    oldNum = parBind->nbNodes; /* Skip newly added items. */
23544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
23546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		oldDupls = parBind->dupls->nbItems;
23547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
23548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
23549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dupls = NULL;
2355060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		oldDupls = 0;
23551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2355260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parNodes = parBind->nodeTable;
23554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = bind->definition->nbFields;
2355560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < bind->nbNodes; i++) {
23557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = bind->nodeTable[i];
23558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (node == NULL)
23559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
23560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ...with every key-sequence of the parent node, already
23562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* evaluated to be a duplicate key-sequence.
23563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (oldDupls) {
2356560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    j = 0;
23566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (j < oldDupls) {
23567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlSchemaAreValuesEqual(
23569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				node->keys[0]->val,
23570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				dupls[j]->keys[0]->val);
23571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == -1)
23572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == 0) {
23574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				j++;
23575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				continue;
23576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parNode = dupls[j];
23579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ret = xmlSchemaAreValuesEqual(
23581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    node->keys[k]->val,
23582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    parNode->keys[k]->val);
23583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == -1)
23584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == 0)
23586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret == 1)
23590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* Duplicate found. */
23591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (j != oldDupls) {
23595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* Duplicate found. Skip this entry. */
23596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue;
23597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2359860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
23599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ... and with every key-sequence of the parent node.
23601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (oldNum) {
2360360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    j = 0;
23604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (j < oldNum) {
23605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNode = parNodes[j];
23606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlSchemaAreValuesEqual(
23608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				node->keys[0]->val,
23609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				parNode->keys[0]->val);
23610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == -1)
23611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == 0) {
23613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				j++;
23614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				continue;
23615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2361660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			} else {
23617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ret = xmlSchemaAreValuesEqual(
23619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    node->keys[k]->val,
23620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    parNode->keys[k]->val);
23621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == -1)
23622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == 0)
23624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret == 1)
23628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* Duplicate found. */
23629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (j != oldNum) {
23633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Handle duplicates. Move the duplicate in
23635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the parent's node-table to the list of
23636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* duplicates.
2363760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			*/
23638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			oldNum--;
23639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parBind->nbNodes--;
23640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Move last old item to pos of duplicate.
23642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes[j] = parNodes[oldNum];
2364460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (parBind->nbNodes != oldNum) {
23646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2364760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * If new items exist, move last new item to
23648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * last of old items.
23649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2365060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parNodes[oldNum] =
23651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				parNodes[parBind->nbNodes];
23652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (parBind->dupls == NULL) {
23654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->dupls = xmlSchemaItemListCreate();
23655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->dupls == NULL)
23656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2365860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaItemListAdd(parBind->dupls, parNode);
23659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
23660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
2366160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* Add the node-table entry (node and key-sequence) of
23662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the child node to the node table of the parent node.
23663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
2366460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			if (parBind->nodeTable == NULL) {
2366560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
23667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->nodeTable == NULL) {
2366860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlSchemaVErrMemory(NULL,
23669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "allocating IDC list of node-table items", NULL);
23670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->sizeNodes = 1;
23673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (parBind->nbNodes >= parBind->sizeNodes) {
23674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->sizeNodes *= 2;
2367560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
2367660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
23677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				sizeof(xmlSchemaPSVIIDCNodePtr));
23678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->nodeTable == NULL) {
2367960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlSchemaVErrMemory(NULL,
23680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "re-allocating IDC list of node-table items", NULL);
23681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
2368260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    }
23683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes = parBind->nodeTable;
23685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Append the new node-table entry to the 'new node-table
23687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* entries' section.
23688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes[parBind->nbNodes++] = node;
23690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2369260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
2369360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2369460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
23695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * No binding for the IDC was found: create a new one and
23698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * copy all node-tables.
23699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = xmlSchemaIDCNewBinding(bind->definition);
23701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (parBind == NULL)
23702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
2370360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Hmm, how to optimize the initial number of
23706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * allocated entries?
23707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->nbNodes != 0) {
23709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add all IDC node-table entries.
23711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! vctxt->psviExposeIDCNodeTables) {
23713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Just move the entries.
23715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * NOTE: this is quite save here, since
23716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all the keyref lookups have already been
23717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * performed.
23718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nodeTable = bind->nodeTable;
23720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->nodeTable = NULL;
23721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->sizeNodes = bind->sizeNodes;
23722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->sizeNodes = 0;
23723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nbNodes = bind->nbNodes;
23724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->nbNodes = 0;
23725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
23726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Copy the entries.
23728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2372960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlMalloc(bind->nbNodes *
23731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCNodePtr));
23732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (parBind->nodeTable == NULL) {
2373360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaVErrMemory(NULL,
23734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating an array of IDC node-table "
23735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "items", NULL);
23736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCFreeBinding(parBind);
23737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
23738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->sizeNodes = bind->nbNodes;
23740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nbNodes = bind->nbNodes;
23741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memcpy(parBind->nodeTable, bind->nodeTable,
23742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr));
23743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->dupls) {
23746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Move the duplicates.
23748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (parBind->dupls != NULL)
23750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaItemListFree(parBind->dupls);
23751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		parBind->dupls = bind->dupls;
2375260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		bind->dupls = NULL;
23753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23754df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (parTable != NULL) {
23755df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (*parTable == NULL)
23756df143a5041f03a22808b59c76698770b74692815Selim Gurun                    *parTable = parBind;
23757df143a5041f03a22808b59c76698770b74692815Selim Gurun                else {
23758df143a5041f03a22808b59c76698770b74692815Selim Gurun                    parBind->next = *parTable;
23759df143a5041f03a22808b59c76698770b74692815Selim Gurun                    *parTable = parBind;
23760df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
23761df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
2376260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
23763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_binding:
23765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
23766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
23770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
23771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
23774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCVCIDCKeyRef:
23775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
23776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDecl: the element declaration
23777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the cvc-idc-keyref constraints.
23779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
23782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher;
23784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind;
2378560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    matcher = vctxt->inode->idcMatchers;
23787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Find a keyref.
23789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
23791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
23792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets &&
23793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->nbItems)
23794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, j, k, res, nbFields, hasDupls;
23796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCKeyPtr *refKeys, *keys;
23797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCNodePtr refNode = NULL;
23798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = matcher->aidc->def->nbFields;
23800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Find the IDC node-table for the referenced IDC key/unique.
23803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = vctxt->inode->idcTable;
23805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (bind != NULL) {
2380660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
23807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->definition)
23808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
23809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind = bind->next;
23810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0;
23812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Search for a matching key-sequences.
23814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->targets->nbItems; i++) {
23816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = 0;
23817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		refNode = matcher->targets->items[i];
23818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (bind != NULL) {
23819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    refKeys = refNode->keys;
23820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < bind->nbNodes; j++) {
23821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			keys = bind->nodeTable[j]->keys;
23822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (k = 0; k < nbFields; k++) {
23823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[k]->val,
23824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				refKeys[k]->val);
23825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 0)
23826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
23827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else if (res == -1) {
23828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				return (-1);
23829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == 1) {
23832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
23833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Match found.
23834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
23835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((res == 0) && hasDupls) {
23839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Search in duplicates
23841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (j = 0; j < bind->dupls->nbItems; j++) {
23843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    keys = ((xmlSchemaPSVIIDCNodePtr)
23844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				bind->dupls->items[j])->keys;
23845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    refKeys[k]->val);
23848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0)
23849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				else if (res == -1) {
23851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    return (-1);
23852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Match in duplicates found.
23857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlChar *str = NULL, *strB = NULL;
23859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaKeyrefErr(vctxt,
23860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XML_SCHEMAV_CVC_IDC, refNode,
23861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    (xmlSchemaTypePtr) matcher->aidc->def,
23862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "More than one match found for "
23863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "key-sequence %s of keyref '%s'",
23864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaFormatIDCKeySequence(vctxt, &str,
23865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					refNode->keys, nbFields),
23866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaGetComponentQName(&strB,
23867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					matcher->aidc->def));
23868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(str);
23869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(strB);
23870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
23871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2387560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (res == 0) {
23877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL, *strB = NULL;
23878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaKeyrefErr(vctxt,
23879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, refNode,
23880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) matcher->aidc->def,
23881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"No match found for key-sequence %s of keyref '%s'",
23882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatIDCKeySequence(vctxt, &str,
23883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    refNode->keys, nbFields),
23884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
23885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
23886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strB);
23887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = matcher->next;
23891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Return an error if any error encountered. */
23893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2389794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2389894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			XML Reader validation code                      *
2389994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
23900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
23901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttrInfoPtr
23903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
23904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
23906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Grow/create list of attribute infos.
23908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->attrInfos == NULL) {
23910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(sizeof(xmlSchemaAttrInfoPtr));
23912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeAttrInfos = 1;
23913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->attrInfos == NULL) {
23914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
23915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating attribute info list", NULL);
23916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
23919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeAttrInfos++;
23920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->attrInfos,
23922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr));
23923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->attrInfos == NULL) {
23924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
23925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating attribute info list", NULL);
23926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
23929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
23930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->localName != NULL) {
23931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaGetFreshAttrInfo",
23932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"attr info not cleared");
23933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr->nodeType = XML_ATTRIBUTE_NODE;
23936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (iattr);
23937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create an attribute info.
23940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr = (xmlSchemaAttrInfoPtr)
23942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaAttrInfo));
23943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL) {
23944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL);
23945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
23946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(iattr, 0, sizeof(xmlSchemaAttrInfo));
23948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr->nodeType = XML_ATTRIBUTE_NODE;
23949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
23950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (iattr);
23952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
23956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr attrNode,
23957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nodeLine,
23958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *localName,
2395960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			const xmlChar *nsName,
23960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ownedNames,
23961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *value,
23962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ownedValue)
23963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr attr;
23965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetFreshAttrInfo(vctxt);
23967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
23968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaPushAttribute",
23969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaGetFreshAttrInfo()");
23970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
23971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->node = attrNode;
23973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->nodeLine = nodeLine;
23974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
23975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->localName = localName;
23976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->nsName = nsName;
23977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownedNames)
23978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
23979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate if it's an XSI attribute.
23981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nsName != NULL) {
23983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(localName, BAD_CAST "nil")) {
23984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
2398560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
23986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "type")) {
23988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
23990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) {
23992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
23994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) {
23996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
23998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) {
24000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
24001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->value = value;
24004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownedValue)
24005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
24006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->metaType != 0)
24007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->state = XML_SCHEMAS_ATTR_META;
24008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
24009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
24012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaClearElemInfo:
24013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
24014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ielem: the element information item
24015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
24016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
24017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
24018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaNodeInfoPtr ielem)
24019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->hasKeyrefs = 0;
24021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->appliedXPath = 0;
24022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
24023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->localName);
24024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->nsName);
24025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
24026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->localName = NULL;
24027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nsName = NULL;
24028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
24030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->value);
24031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
24032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->value = NULL;
24033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->val != NULL) {
24035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PSVI TODO: Be careful not to free it when the value is
24037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* exposed via PSVI.
24038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(ielem->val);
24040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->val = NULL;
24041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcMatchers != NULL) {
24043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* REVISIT OPTIMIZE TODO: Use a pool of IDC matchers.
24045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   Does it work?
24046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
24048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
24049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
24050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
24051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcMatchers = NULL;
24052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcTable != NULL) {
24054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* OPTIMIZE TODO: Use a pool of IDC tables??.
24056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeIDCTable(ielem->idcTable);
24058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcTable = NULL;
24059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->regexCtxt != NULL) {
24061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeExecCtxt(ielem->regexCtxt);
24062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->regexCtxt = NULL;
24063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->nsBindings != NULL) {
24065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar **)ielem->nsBindings);
24066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nsBindings = NULL;
24067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nbNsBindings = 0;
24068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->sizeNsBindings = 0;
24069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
24073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetFreshElemInfo:
24074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the schema validation context
24075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
24076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/reuses and initializes the element info item for
24077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the currect tree depth.
24078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
24079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element info item or NULL on API or internal errors.
24080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
24081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNodeInfoPtr
24082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
24083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr info = NULL;
24085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth > vctxt->sizeElemInfos) {
24087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaGetFreshElemInfo",
24088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "inconsistent depth encountered");
24089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
24090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->elemInfos == NULL) {
24092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr));
24094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->elemInfos == NULL) {
24095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the element info array", NULL);
24097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr));
24100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeElemInfos = 10;
24101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeElemInfos <= vctxt->depth) {
24102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = vctxt->sizeElemInfos;
24103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeElemInfos *= 2;
24105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
24107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaNodeInfoPtr));
24108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->elemInfos == NULL) {
24109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the element info array", NULL);
24111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need the new memory to be NULLed.
24115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Use memset instead?
24116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; i < vctxt->sizeElemInfos; i++)
24118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->elemInfos[i] = NULL;
24119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = vctxt->elemInfos[vctxt->depth];
24121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (info == NULL) {
24123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = (xmlSchemaNodeInfoPtr)
24124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(sizeof(xmlSchemaNodeInfo));
24125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (info == NULL) {
24126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an element info", NULL);
24128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos[vctxt->depth] = info;
24131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
24132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (info->localName != NULL) {
24133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaGetFreshElemInfo",
24134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"elem info has not been cleared");
24135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(info, 0, sizeof(xmlSchemaNodeInfo));
24139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    info->nodeType = XML_ELEMENT_NODE;
24140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    info->depth = vctxt->depth;
24141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (info);
24143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
24146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
24147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
24148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
24151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node,
24152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type,
24153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValType valType,
24154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar * value,
24155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValPtr val,
24156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			unsigned long length,
24157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int fireErrors)
24158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, error = 0;
24160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr tmpType;
24162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetLinkPtr facetLink;
24163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
24164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long len = 0;
24165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWhitespaceValueType ws;
24166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * In Libxml2, derived built-in types have currently no explicit facets.
24169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC)
24171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
24172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Do not jump away, if the facetSet of the given type is
24175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * empty: until now, "pattern" and "enumeration" facets of the
24176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *base types* need to be checked as well.
24177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet == NULL)
24179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto pattern_and_enum;
24180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_ATOMIC(type)) {
24182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_LIST(type))
24183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto WXS_IS_LIST;
24184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
24185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto pattern_and_enum;
24186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Whitespace handling is only of importance for string-based
24189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * types.
24190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmpType = xmlSchemaGetPrimitiveType(type);
24192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
24193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
24194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = xmlSchemaGetWhiteSpaceFacetValue(type);
24195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
24197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If the value was not computed (for string or
24199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * anySimpleType based types), then use the provided
24200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * type.
24201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
24203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valType = valType;
24204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
24205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valType = xmlSchemaGetValType(val);
2420660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
24208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (facetLink = type->facetSet; facetLink != NULL;
24209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetLink = facetLink->next) {
24210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip the pattern "whiteSpace": it is used to
24212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* format the character content beforehand.
24213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facetLink->facet->type) {
24215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_WHITESPACE:
24216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_PATTERN:
24217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_ENUMERATION:
24218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
24219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
24220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
24221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
24222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
24223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valType, value, val, &len, ws);
24224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
24226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
24227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valType, value, val, ws);
24228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
24231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaValidateFacets",
24232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating against a atomic type facet");
24233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret > 0) {
24235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (fireErrors)
24236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, len, type, facetLink->facet, NULL, NULL, NULL);
24238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectWXS_IS_LIST:
24247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_LIST(type))
24248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto pattern_and_enum;
24249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "length", "minLength" and "maxLength" of list types.
24251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
24253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (facetLink = type->facetSet; facetLink != NULL;
24254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetLink = facetLink->next) {
2425560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facetLink->facet->type) {
24257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
24258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
2425960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_FACET_MAXLENGTH:
24260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
24261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, length, NULL);
24262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
24264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
24265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
24267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaValidateFacets",
24268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating against a list type facet");
24269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret > 0) {
2427160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (fireErrors)
24272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, length, type, facetLink->facet, NULL, NULL, NULL);
24274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectpattern_and_enum:
24283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error >= 0) {
24284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found = 0;
24285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process enumerations. Facet values are in the value space
24287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the defining type's base type. This seems to be a bug in the
24288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML Schema 1.0 spec. Use the whitespace type of the base type.
24289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only the first set of enumerations in the ancestor-or-self axis
24290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* is used for validation.
24291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmpType = type;
24294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (facet = tmpType->facets; facet != NULL; facet = facet->next) {
24296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
24297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
24298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 1;
24299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaAreValuesEqual(facet->val, val);
24300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == 1)
24301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (ret < 0) {
24303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaValidateFacets",
24304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating against an enumeration facet");
24305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
24306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
24309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Break on the first set of enumerations. Any additional
24312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  enumerations which might be existent on the ancestors
24313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  of the current type are restricted by this set; thus
24314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  *must* *not* be taken into account.
24315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found)
24317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpType = tmpType->baseType;
24319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((tmpType != NULL) &&
24320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found && (ret == 0)) {
24322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_ENUMERATION_VALID;
24323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (fireErrors) {
24324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, 0, type, NULL, NULL, NULL, NULL);
24326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
24327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error >= 0) {
24334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
24335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process patters. Pattern facets are ORed at type level
24337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and ANDed if derived. Walk the base type axis.
24338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmpType = type;
24340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = NULL;
24341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
24343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (facetLink = tmpType->facetSet; facetLink != NULL;
24344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink = facetLink->next) {
24345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
24346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
24347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 1;
2434860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		/*
24349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that for patterns, @value needs to be the
24350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* normalized vaule.
24351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
24352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlRegexpExec(facetLink->facet->regexp, value);
24353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == 1)
24354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (ret < 0) {
24356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaValidateFacets",
24357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating against a pattern facet");
24358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
24359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2436060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
24361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Save the last non-validating facet.
24362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
24363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facetLink->facet;
24364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found && (ret != 1)) {
24367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_PATTERN_VALID;
24368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (fireErrors) {
24369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFacetErr(actxt, ret, node,
24370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, 0, type, facet, NULL, NULL, NULL);
24371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
24372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (ret);
24373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (error == 0)
24374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    error = ret;
24375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpType = tmpType->baseType;
24378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (error);
24382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2438360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
24385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNormalizeValue(xmlSchemaTypePtr type,
24386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *value)
24387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2438860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    switch (xmlSchemaGetWhiteSpaceFacetValue(type)) {
24389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_WHITESPACE_COLLAPSE:
24390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaCollapseString(value));
24391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_WHITESPACE_REPLACE:
24392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaWhiteSpaceReplace(value));
24393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
24394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
24400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *value,
24401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaValPtr *val,
24402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int valNeeded)
24403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
24405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
24406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *local, *prefix = NULL;
2440760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
24409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
24410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
24411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateQName",
24412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlValidateQName()");
24413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1);
24416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: xmlSplitQName2 will always return a duplicated
24419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * strings.
24420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    local = xmlSplitQName2(value, &prefix);
24422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (local == NULL)
24423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	local = xmlStrdup(value);
24424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * OPTIMIZE TODO: Use flags for:
24426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  - is there any namespace binding?
24427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  - is there a default namespace?
24428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nsName = xmlSchemaLookupNamespace(vctxt, prefix);
2443060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix != NULL) {
24432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prefix);
24433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* A namespace must be found if the prefix is
24435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOT NULL.
24436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName == NULL) {
24438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL,
24440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The QName value '%s' has no "
24442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"corresponding namespace declaration in "
24443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"scope", value, NULL);
24444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (local != NULL)
24445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(local);
24446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ret);
24447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (valNeeded && val) {
24450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName != NULL)
24451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = xmlSchemaNewQNameValue(
24452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST xmlStrdup(nsName), BAD_CAST local);
24453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
24454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = xmlSchemaNewQNameValue(NULL,
24455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST local);
24456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(local);
24458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
24459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
24462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* cvc-simple-type
24463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
24464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
24466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
24467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
24468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value,
24469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaValPtr *retVal,
24470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int fireErrors,
24471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int normalize,
24472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isNormalized)
24473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, valNeeded = (retVal) ? 1 : 0;
24475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val = NULL;
24476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaWhitespaceValueType ws; */
24477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *normValue = NULL;
24478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NORMALIZE(atype) \
24480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! isNormalized) && \
24481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
24482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	normValue = xmlSchemaNormalizeValue(atype, value); \
24483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (normValue != NULL) \
24484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = normValue; \
24485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isNormalized = 1; \
24486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2448760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retVal != NULL) && (*retVal != NULL)) {
24489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(*retVal);
24490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*retVal = NULL;
24491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.14.4 Simple Type Definition Validation Rules
24494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validation Rule: String Valid
24495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 It is schema-valid with respect to that definition as defined
24498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * by Datatype Valid in [XML Schemas: Datatypes].
24499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.1 If The definition is ENTITY or is validly derived from ENTITY given
2450260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then
2450360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the string must be a �declared entity name�.
24504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES
2450760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6),
2450860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then every whitespace-delimited substring of the string must be a �declared
2450960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * entity name�.
24510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.3 otherwise no further condition applies.
24513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
24515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valNeeded = 1;
24516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
24517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = BAD_CAST "";
24518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) {
24519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr biType; /* The built-in type. */
24520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2452160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* SPEC (1.2.1) "if {variety} is �atomic� then the string must �match�
2452260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* a literal in the �lexical space� of {base type definition}"
24523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Whitespace-normalize.
24526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NORMALIZE(type);
24528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->type != XML_SCHEMA_TYPE_BASIC) {
24529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the built-in type.
24531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    biType = type->baseType;
24533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((biType != NULL) &&
24534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(biType->type != XML_SCHEMA_TYPE_BASIC))
24535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		biType = biType->baseType;
24536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (biType == NULL) {
24538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "could not get the built-in type");
24540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
24543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    biType = type;
24544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTATIONs need to be processed here, since they need
24546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to lookup in the hashtable of NOTATION declarations of the schema.
24547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2454860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2454960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    switch (biType->builtInType) {
2455060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		case XML_SCHEMAS_NOTATION:
24551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateNotation(
24552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaValidCtxtPtr) actxt,
24553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaValidCtxtPtr) actxt)->schema,
24554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, value, &val, valNeeded);
24555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_QNAME:
24557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
24558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, &val, valNeeded);
24559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
24561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
24562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (valNeeded)
24563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24564df143a5041f03a22808b59c76698770b74692815Selim Gurun			    value, &val, node);
24565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
24566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24567df143a5041f03a22808b59c76698770b74692815Selim Gurun			    value, NULL, node);
24568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2457060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
2457160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    switch (biType->builtInType) {
24572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_NOTATION:
24573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateNotation(NULL,
24574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParserCtxtPtr) actxt)->schema, node,
24575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, &val, valNeeded);
24576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
24578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
24579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (valNeeded)
24580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value, &val, node);
24582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
24583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value, NULL, node);
24585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2458660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
24587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
24588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validation via a public API is not implemented yet.
24590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
24592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
24593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating against a built-in type");
24598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_LIST(type))
24601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2460360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check facets.
24608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaValType) biType->builtInType, value, val,
24611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		0, fireErrors);
24612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of atomic simple type");
24616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2461860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (WXS_IS_LIST(type))
24619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
2462160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0))
24625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
24627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr itemType;
24629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *cur, *end;
24630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *tmpValue = NULL;
24631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unsigned long len = 0;
24632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValPtr prevVal = NULL, curVal = NULL;
2463360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* 1.2.2 if {variety} is �list� then the string must be a sequence
2463460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* of white space separated tokens, each of which �match�es a literal
2463560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* in the �lexical space� of {item type definition}
24636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if
24639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the list type has an enum or pattern facet.
24640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NORMALIZE(type);
24642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Optimize validation of empty values.
24644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: We do not have computed values for lists.
24645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2464660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	itemType = WXS_LIST_ITEMTYPE(type);
24647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = value;
24648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
24650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
24651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
24652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
24653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
24654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
24655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpValue = xmlStrndup(cur, end - cur);
24657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len++;
24658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (valNeeded)
24660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
24661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmpValue, &curVal, fireErrors, 0, 1);
24662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
24664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmpValue, NULL, fireErrors, 0, 1);
24665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(tmpValue);
24666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (curVal != NULL) {
24667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
24668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add to list of computed values.
24669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
24670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val == NULL)
24671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = curVal;
24672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
24673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValueAppend(prevVal, curVal);
24674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prevVal = curVal;
24675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curVal = NULL;
24676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating an item of list simple type");
24681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2468560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
24686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
24687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
24688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(tmpValue);
24689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Apply facets (pattern, enumeration).
24692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_UNKNOWN, value, val,
24695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len, fireErrors);
24696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of list simple type");
24700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0)) {
2470660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
24707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Report the normalized value.
24708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    normalize = 1;
24710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NORMALIZE(type);
24711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
24714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr memberLink;
24715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2471660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* TODO: For all datatypes �derived� by �union�  whiteSpace does
2471760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* not apply directly; however, the normalization behavior of �union�
24718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* types is controlled by the value of whiteSpace on that one of the
2471960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �memberTypes� against which the �union� is successfully validated.
24720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
24721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This means that the value is normalized by the first validating
24722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* member type, then the facets of the union type are applied. This
24723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* needs changing of the value!
24724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2472760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 1.2.3 if {variety} is �union� then the string must �match� a
2472860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* literal in the �lexical space� of at least one member of
24729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {member type definitions}
24730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type);
24732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (memberLink == NULL) {
24733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"union simple type has no member types");
24735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
2473660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
24737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Always normalize union type values, since we currently
24739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cannot store the whitespace information with the value
24740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* itself; otherwise a later value-comparison would be
24741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* not possible.
24742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (memberLink != NULL) {
2474460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (valNeeded)
24745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
24746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memberLink->type, value, &val, 0, 1, 0);
24747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
24749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memberLink->type, value, NULL, 0, 1, 0);
24750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret <= 0)
24751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memberLink = memberLink->next;
24753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating members of union simple type");
24758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
24761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply facets (pattern, enumeration).
24764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2476760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * The normalization behavior of �union� types is controlled by
2476860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the value of whiteSpace on that one of the �memberTypes�
2476960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * against which the �union� is successfully validated.
24770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NORMALIZE(memberLink->type);
24772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_UNKNOWN, value, val,
24774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		0, fireErrors);
24775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of union simple type");
24779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2478160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
24782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0))
24785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normValue != NULL)
24789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(normValue);
24790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
24791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (retVal != NULL)
24792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retVal = val;
24793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (val != NULL)
24794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(val);
24795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (val != NULL)
24796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(val);
24797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
24798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
24799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normValue != NULL)
24800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(normValue);
24801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
24802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(val);
24803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
24804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
24808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *value,
24809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **nsName,
24810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **localName)
24811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
24813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((nsName == NULL) || (localName == NULL))
24815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *nsName = NULL;
24817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *localName = NULL;
24818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
24820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1)
24821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0) {
24823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
24824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
24825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
24826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
24827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
24829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *local = NULL;
24830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *prefix;
24831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: xmlSplitQName2 will return a duplicated
24834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* string.
24835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	local = xmlSplitQName2(value, &prefix);
24837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (local == NULL)
24838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *localName = xmlDictLookup(vctxt->dict, value, -1);
24839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
24840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *localName = xmlDictLookup(vctxt->dict, local, -1);
24841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(local);
24842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*nsName = xmlSchemaLookupNamespace(vctxt, prefix);
24845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prefix != NULL) {
24847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
24848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * A namespace must be found if the prefix is NOT NULL.
24850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*nsName == NULL) {
24852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
24853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
24854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The QName value '%s' has no "
24856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "corresponding namespace declaration in scope",
24857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, NULL);
24858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (2);
24859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
24863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
24867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAttrInfoPtr iattr,
24868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr *localType,
24869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaElementPtr elemDecl)
24870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
24872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : (4)
24874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
24875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema-Validity Assessment (Element) (cvc-assess-elt)
24876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   (1.2.1.2.1) - (1.2.1.2.4)
24877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle 'xsi:type'.
24878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (localType == NULL)
24880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *localType = NULL;
24882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
24883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
24884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
24885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *nsName = NULL, *local = NULL;
24886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We should report a *warning* that the type was overriden
24888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* by the instance.
24889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
24891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-elt) (3.3.4) : (4.1)
24893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-assess-elt) (1.2.1.2.2)
24894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVExpandQName(vctxt, iattr->value,
24896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &nsName, &local);
24897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElementByDeclaration",
24900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaQNameExpand() to validate the "
24901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "attribute 'xsi:type'");
24902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
24905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-elt) (3.3.4) : (4.2)
24908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-assess-elt) (1.2.1.2.3)
24909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*localType = xmlSchemaGetType(vctxt->schema, local, nsName);
24911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*localType == NULL) {
24912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
24913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST vctxt,
24915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAV_CVC_ELT_4_2, NULL,
24916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The QName value '%s' of the xsi:type attribute does not "
24918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"resolve to a type definition",
24919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, nsName, local), NULL);
24920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
24921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = vctxt->err;
24922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
24923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl != NULL) {
24925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int set = 0;
24926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK)
2492960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "The �local type definition� must be validly
24930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the {type definition} given the union of
24931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {disallowed substitutions} and the {type definition}'s
24932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {prohibited substitutions}, as defined in
2493360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Type Derivation OK (Complex) (�3.4.6)
24934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (if it is a complex type definition),
24935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * or given {disallowed substitutions} as defined in Type
2493660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Derivation OK (Simple) (�3.14.6) (if it is a simple type
24937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition)."
24938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
24939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {disallowed substitutions}: the "block" on the element decl.
24940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {prohibited substitutions}: the "block" on the type def.
24941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: We could map types already evaluated
24944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to be validly derived from other types to avoid checking
24945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * this over and over for the same types.
24946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
24948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(elemDecl->subtypes->flags &
24949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
24950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_EXTENSION;
24951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
24953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(elemDecl->subtypes->flags &
24954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
24955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_RESTRICTION;
24956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * REMOVED and CHANGED since this produced a parser context
24959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * which adds to the string dict of the schema. So this would
24960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * change the schema and we don't want this. We don't need
24961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the parser context anymore.
24962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
24963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if ((vctxt->pctxt == NULL) &&
24964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	(xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
24965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	    return (-1);
24966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
24969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->subtypes, set) != 0) {
24970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
24971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
24973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL,
24974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition '%s', specified by xsi:type, is "
24975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "blocked or not validly derived from the type definition "
24976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "of the element declaration",
24977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str,
24978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(*localType)->targetNamespace,
24979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(*localType)->name),
24980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
24981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
24982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = vctxt->err;
24983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*localType = NULL;
24984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
24988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
24989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
24990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
24991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
24992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
24993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
24997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
24999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr actualType;
25000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : 1
25003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl == NULL) {
25005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL,
25006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No matching declaration available");
25007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (vctxt->err);
25008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    actualType = WXS_ELEM_TYPEDEF(elemDecl);
25010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : 2
25012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
25014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_2, NULL,
25015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The element declaration is abstract");
25016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (vctxt->err);
25017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actualType == NULL) {
2501994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
2502094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    "The type definition is absent");
2502194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	return (XML_SCHEMAV_CVC_TYPE_1);
25022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
25024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
25025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
25026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cvc-elt (3.3.4) : 3
25028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Handle 'xsi:nil'.
25029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
25032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr) {
25033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ATTRIBUTE(iattr);
25034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the value.
25036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckCVCSimpleType(
25038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt, NULL,
25039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
25040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->value, &(iattr->val), 1, 0, 0);
25041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM;
25042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
25043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElemDecl",
25044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType() to "
25045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validate the attribute 'xsi:nil'");
25046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0) {
25049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
25050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * cvc-elt (3.3.4) : 3.1
25052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL,
25054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The element is not 'nillable'");
25055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Does not return an error on purpose. */
25056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaValueGetAsBoolean(iattr->val)) {
25058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* cvc-elt (3.3.4) : 3.2.2
25060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
25062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (elemDecl->value != NULL)) {
25063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL,
25064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The element cannot be 'nilled' because "
25065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"there is a fixed value constraint defined "
25066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"for it");
25067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     /* Does not return an error on purpose. */
25068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else
25069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    vctxt->inode->flags |=
25070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMA_ELEM_INFO_NILLED;
25071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cvc-elt (3.3.4) : 4
25077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Handle 'xsi:type'.
25078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr) {
25082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr localType = NULL;
25083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
25085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl);
25086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
25087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
25088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidateElemDecl",
25089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaProcessXSIType() to "
25090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"process the attribute 'xsi:type'");
25091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
25092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Does not return an error on purpose. */
25094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (localType != NULL) {
25096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
25097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		actualType = localType;
25098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * IDC: Register identity-constraint XPath matchers.
25103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->idcs != NULL) &&
25105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
25106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
25107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No actual type definition.
25109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actualType == NULL) {
2511194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
2511294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    "The type definition is absent");
2511394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	return (XML_SCHEMAV_CVC_TYPE_1);
25114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Remember the actual type definition.
25117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->typeDef = actualType;
25119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
25125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
25127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i;
25128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC cvc-type (3.1.1)
25131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The attributes of must be empty, excepting those whose namespace
25132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * name is identical to http://www.w3.org/2001/XMLSchema-instance and
25133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * whose local name is one of type, nil, schemaLocation or
25134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * noNamespaceSchemaLocation."
25135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! iattr->metaType) {
25141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ATTRIBUTE(iattr)
25142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL);
25144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_TYPE_3_1_1;
25145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
25146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM
25148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
25149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Cleanup currently used attribute infos.
25153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
25155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
25156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
25158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr attr;
25159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
25162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = vctxt->attrInfos[i];
25164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
25165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->localName != NULL)
25166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->localName);
25167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->nsName != NULL)
25168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->nsName);
25169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
25171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->value != NULL)
25172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->value);
25173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->val != NULL) {
25175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(attr->val);
25176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->val = NULL;
25177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(attr, 0, sizeof(xmlSchemaAttrInfo));
25179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nbAttrInfos = 0;
25181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.4.4 Complex Type Definition Validation Rules
25185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Element Locally Valid (Complex Type) (cvc-complex-type)
25186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.2.4 Attribute Declaration Validation Rules
25187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Validation Rule: Attribute Locally Valid (cvc-attribute)
25188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Attribute Locally Valid (Use) (cvc-au)
25189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
25190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Only "assessed" attribute information items will be visible to
25191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes.
25192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
25195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2519660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypePtr type = vctxt->inode->typeDef;
25197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr attrUseList;
25198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr attrUse = NULL;
25199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr attrDecl = NULL;
2520060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttrInfoPtr iattr, tmpiattr;
25201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, found, nbAttrs, nbUses;
25202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int xpathRes = 0, res, wildIDs = 0, fixed;
25203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr defAttrOwnerElem = NULL;
25204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (cvc-attribute)
2520760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * (1) "The declaration must not be �absent� (see Missing
2520860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3) for how this can fail to be
25209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the case)."
25210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (2) "Its {type definition} must not be absent."
25211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (1) + (2): This is not handled here, since we currently do not
25213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * allow validation against schemas which have missing sub-components.
25214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (cvc-complex-type)
25216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (3) "For each attribute information item in the element information
25217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * item's [attributes] excepting those whose [namespace name] is
25218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * identical to http://www.w3.org/2001/XMLSchema-instance and whose
25219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * [local name] is one of type, nil, schemaLocation or
25220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * noNamespaceSchemaLocation, the appropriate case among the following
25221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be true:
25222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrUseList = (xmlSchemaItemListPtr) type->attrUses;
25225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @nbAttrs is the number of attributes present in the instance.
25227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nbAttrs = vctxt->nbAttrInfos;
25229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrUseList != NULL)
25230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbUses = attrUseList->nbItems;
25231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
25232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbUses = 0;
25233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbUses; i++) {
25234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        found = 0;
25235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrUse = attrUseList->items[i];
25236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrDecl = WXS_ATTRUSE_DECL(attrUse);
25237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < nbAttrs; j++) {
25238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[j];
25239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (3)
25241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip meta attributes.
25242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType)
25244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->localName[0] != attrDecl->name[0])
25246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!xmlStrEqual(iattr->localName, attrDecl->name))
25248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
25250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 1;
25252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
25254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1) "If there is among the {attribute uses} an attribute
25255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * use with an {attribute declaration} whose {name} matches
25256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the attribute information item's [local name] and whose
25257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace} is identical to the attribute information
2525860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * item's [namespace name] (where an �absent� {target namespace}
25259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * is taken to be identical to a [namespace name] with no value),
2526060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * then the attribute information must be �valid� with respect
25261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to that attribute use as per Attribute Locally Valid (Use)
2526260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (�3.5.4). In this case the {attribute declaration} of that
2526360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * attribute use is the �context-determined declaration� for the
25264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * attribute information item with respect to Schema-Validity
2526560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Assessment (Attribute) (�3.2.4) and
2526660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Assessment Outcome (Attribute) (�3.2.5).
25267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->use = attrUse;
25270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Context-determined declaration.
25272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->decl = attrDecl;
25274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->typeDef = attrDecl->subtypes;
25275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
25276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found)
25279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
25282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Handle non-existent, required attributes.
25284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
25286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4) "The {attribute declaration} of each attribute use in
25287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {attribute uses} whose {required} is true matches one
25288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the attribute information items in the element information
25289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * item's [attributes] as per clause 3.1 above."
25290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpiattr == NULL) {
25293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT(
25294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaVAttributesComplex",
25295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaGetFreshAttrInfo()");
25296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
25299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->use = attrUse;
2530060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    tmpiattr->decl = attrDecl;
25301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
25302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((attrUse->defValue != NULL) ||
25303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (attrDecl->defValue != NULL))) {
25304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Handle non-existent, optional, default/fixed attributes.
25306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpiattr == NULL) {
25309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT(
25310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaVAttributesComplex",
25311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaGetFreshAttrInfo()");
25312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
25315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->use = attrUse;
25316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->decl = attrDecl;
25317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->typeDef = attrDecl->subtypes;
25318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->localName = attrDecl->name;
25319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->nsName = attrDecl->targetNamespace;
25320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the wildcard.
25327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attributeWildcard != NULL) {
25329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-complex-type)
25331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (3.2.1) "There must be an {attribute wildcard}."
25332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < nbAttrs; i++) {
25334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[i];
25335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (3)
25337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip meta attributes.
25338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
25340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
2534360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2) "The attribute information item must be �valid� with
2534460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * respect to it as defined in Item Valid (Wildcard) (�3.10.4)."
25345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Item Valid (Wildcard) (cvc-wildcard)
2534760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "... its [namespace name] must be �valid� with respect to
25348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the wildcard constraint, as defined in Wildcard allows
2534960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Namespace Name (�3.10.4)."
25350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard,
25352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->nsName) == 0) {
25353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle processContents.
25355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
25356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-wildcard):
25357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* processContents | context-determined declaration:
25358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "strict"          "mustFind"
25359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "lax"             "none"
25360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "skip"            "skip"
25361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attributeWildcard->processContents ==
25363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ANY_SKIP) {
25364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     /*
25365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * context-determined declaration = "skip"
25366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
25367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC PSVI Assessment Outcome (Attribute)
25368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validity] = "notKnown"
25369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validation attempted] = "none"
25370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
25372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
25373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Find an attribute declaration.
25376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
25378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->localName, iattr->nsName);
25379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->decl != NULL) {
25380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC (cvc-complex-type)
25383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * (5) "Let [Definition:]  the wild IDs be the set of
25384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all attribute information item to which clause 3.2
2538560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * applied and whose �validation� resulted in a
2538660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * �context-determined declaration� of mustFind or no
2538760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * �context-determined declaration� at all, and whose
25388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [local name] and [namespace name] resolve (as
2538960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * defined by QName resolution (Instance) (�3.15.4)) to
25390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * an attribute declaration whose {type definition} is
25391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * or is derived from ID. Then all of the following
25392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * must be true:"
25393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
25395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIsDerivedFromBuiltInType(
25396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			iattr->typeDef, XML_SCHEMAS_ID)) {
25397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (5.1) "There must be no more than one
2539960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* item in �wild IDs�."
25400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (wildIDs != 0) {
25402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* VAL TODO */
25403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
25404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    TODO
25405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    continue;
25406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
25407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wildIDs++;
25408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (cvc-complex-type)
2541060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* (5.2) "If �wild IDs� is non-empty, there must not
25411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* be any attribute uses among the {attribute uses}
25412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* whose {attribute declaration}'s {type definition}
25413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* is or is derived from ID."
25414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25415df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (attrUseList != NULL) {
25416df143a5041f03a22808b59c76698770b74692815Selim Gurun                            for (j = 0; j < attrUseList->nbItems; j++) {
25417df143a5041f03a22808b59c76698770b74692815Selim Gurun                                if (xmlSchemaIsDerivedFromBuiltInType(
25418df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]),
25419df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    XML_SCHEMAS_ID)) {
25420df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    /* URGENT VAL TODO: implement */
25421df143a5041f03a22808b59c76698770b74692815Selim Gurun                            iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
25422df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    TODO
25423df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    break;
25424df143a5041f03a22808b59c76698770b74692815Selim Gurun                                }
25425df143a5041f03a22808b59c76698770b74692815Selim Gurun                            }
25426df143a5041f03a22808b59c76698770b74692815Selim Gurun                        }
25427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (type->attributeWildcard->processContents ==
25429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ANY_LAX) {
25430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
25431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC PSVI Assessment Outcome (Attribute)
25433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validity] = "notKnown"
25434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validation attempted] = "none"
25435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
25438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Get the owner element; needed for creation of default attributes.
25448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This fixes bug #341337, reported by David Grohmann.
25449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
25451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
25452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ielem && ielem->node && ielem->node->doc)
25453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    defAttrOwnerElem = ielem->node;
25454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate values, create default attributes, evaluate IDCs.
25457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Note that we won't try to resolve IDCs to
25462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "lax" and "skip" validated attributes. Check what to
25463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* do in this case.
25464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
25466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
25467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: What to do if the type definition is missing?
25470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->typeDef == NULL) {
25472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
25473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
25477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fixed = 0;
25478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpathRes = 0;
25479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->xpathStates != NULL) {
25481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate IDCs.
25483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpathRes = xmlSchemaXPathEvaluate(vctxt,
25485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ATTRIBUTE_NODE);
25486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xpathRes == -1) {
25487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaXPathEvaluate()");
25489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
25494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Default/fixed attributes.
25496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We need the value only if we need to resolve IDCs or
25497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * will create default attributes.
25498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xpathRes) || (defAttrOwnerElem)) {
25500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->use->defValue != NULL) {
25501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value = (xmlChar *) iattr->use->defValue;
25502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->val = iattr->use->defVal;
25503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value = (xmlChar *) iattr->decl->defValue;
25505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->val = iattr->decl->defVal;
25506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* IDCs will consume the precomputed default value,
25509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* so we need to clone it.
25510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->val == NULL) {
25512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVAttributesComplex",
25513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"default/fixed value on an attribute use was "
25514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"not precomputed");
25515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
25516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->val = xmlSchemaCopyValue(iattr->val);
25518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->val == NULL) {
25519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVAttributesComplex",
25520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaCopyValue()");
25521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
25522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PSVI: Add the default attribute to the current element.
25526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: Should we use the *normalized* value? This currently
25527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   uses the *initial* value.
25528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2552960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
25530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defAttrOwnerElem) {
25531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *normValue;
25532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *value;
25533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = iattr->value;
25535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Normalize the value.
25537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		normValue = xmlSchemaNormalizeValue(iattr->typeDef,
25539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value);
25540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normValue != NULL)
25541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value = BAD_CAST normValue;
25542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->nsName == NULL) {
25544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlNewProp(defAttrOwnerElem,
25545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			iattr->localName, value) == NULL) {
25546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVAttributesComplex",
25547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "callling xmlNewProp()");
25548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (normValue != NULL)
25549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(normValue);
25550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
25551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNsPtr ns;
25554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
25556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			defAttrOwnerElem, iattr->nsName);
25557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ns == NULL) {
25558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar prefix[12];
25559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int counter = 0;
25560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Create a namespace declaration on the validation
25563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* root node if no namespace declaration is in scope.
25564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			do {
25566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    snprintf((char *) prefix, 12, "p%d", counter++);
25567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ns = xmlSearchNs(defAttrOwnerElem->doc,
25568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				defAttrOwnerElem, BAD_CAST prefix);
25569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (counter > 1000) {
25570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				VERROR_INT(
25571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "xmlSchemaVAttributesComplex",
25572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "could not compute a ns prefix for a "
25573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "default/fixed attribute");
25574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (normValue != NULL)
25575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlFree(normValue);
25576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
25577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
25578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} while (ns != NULL);
25579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = xmlNewNs(vctxt->validationRoot,
25580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->nsName, BAD_CAST prefix);
25581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO:
25584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html
25585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * If we have QNames: do we need to ensure there's a
25586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * prefix defined for the QName?
25587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value);
25589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normValue != NULL)
25591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(normValue);
25592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Go directly to IDC evaluation.
25595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto eval_idcs;
25597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Validate the value.
25600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->value != NULL) {
25602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Free last computed value; just for safety reasons.
25604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(vctxt->value);
25606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->value = NULL;
25607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that the attribute *use* can be unavailable, if
25610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the attribute was a wild attribute.
25611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
25613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((iattr->use != NULL) &&
25614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
25615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = 1;
25616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
25617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = 0;
25618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-attribute)
2562060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (3) "The item's �normalized value� must be locally �valid�
2562160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* with respect to that {type definition} as per
2562260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* String Valid (�3.14.4)."
25623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Do we already have the
25625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "normalized attribute value" here?
25626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xpathRes || fixed) {
25628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
25629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Request a computed value.
25631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaVCheckCVCSimpleType(
25633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt,
25634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
25635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		1, 1, 0);
25636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
25637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaVCheckCVCSimpleType(
25638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt,
25639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->node, iattr->typeDef, iattr->value, NULL,
25640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		1, 0, 0);
25641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2564260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
25643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
25644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
25645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaStreamValidateSimpleTypeValue()");
25647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
25650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC PSVI Assessment Outcome (Attribute)
25652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [validity] = "invalid"
25653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto eval_idcs;
25655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2565760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (fixed) {
25658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Attribute Locally Valid (Use) (cvc-au)
2566060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "For an attribute information item to be�valid�
25661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * with respect to an attribute use its *normalized*
2566260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * value� must match the *canonical* lexical
25663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * representation of the attribute use's {value
25664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * constraint}value, if it is present and fixed."
25665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: The requirement for the *canonical* value
25667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * will be removed in XML Schema 1.1.
25668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Attribute Locally Valid (cvc-attribute)
2567160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (4) "The item's *actual* value� must match the *value* of
25672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {value constraint}, if it is present and fixed."
25673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->val == NULL) {
25675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* VAL TODO: A value was not precomputed. */
25676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
25677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto eval_idcs;
25678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((iattr->use != NULL) &&
25680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(iattr->use->defValue != NULL)) {
25681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->use->defVal == NULL) {
25682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* VAL TODO: A default value was not precomputed. */
25683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
25684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto eval_idcs;
25685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->vcValue = iattr->use->defValue;
25687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaCompareValuesWhtsp(attr->val,
25689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws,
25690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr->use->defVal,
25691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws) != 0) {
25692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
25694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
25696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->decl->defVal == NULL) {
25697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* VAL TODO: A default value was not precomputed. */
25698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
25699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto eval_idcs;
25700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->vcValue = iattr->decl->defValue;
25702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaCompareValuesWhtsp(attr->val,
25704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws,
25705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrDecl->defVal,
25706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws) != 0) {
25707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
25709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [validity] = "valid"
25713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_idcs:
25716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Evaluate IDCs.
25718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xpathRes) {
25720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaXPathProcessHistory(vctxt,
25721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->depth +1) == -1) {
25722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaXPathEvaluate()");
25724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (vctxt->xpathStates != NULL)
25727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaXPathPop(vctxt);
25728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Report errors.
25732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
25736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
25737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
25738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
25739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
25741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (iattr->state) {
25742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_MISSING: {
25743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
25744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ACTIVATE_ELEM;
25745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
25746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL,
25747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The attribute '%s' is required but missing",
25748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
25749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->decl->targetNamespace,
25750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->decl->name),
25751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
25752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
25753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
25754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
25756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL,
25757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition is absent");
25758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
25760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
25761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_AU, NULL, NULL,
25762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The value '%s' does not match the fixed "
2576360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    "value constraint '%s'",
2576460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    iattr->value, iattr->vcValue);
25765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
25767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL,
25768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "No matching global attribute declaration available, but "
25769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "demanded by the strict wildcard");
25770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_UNKNOWN:
25772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->metaType)
25773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
25774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* MAYBE VAL TODO: One might report different error messages
25776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for the following errors.
25777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attributeWildcard == NULL) {
25779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL);
25781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL);
25784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
25787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
25792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
25794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
25795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
25796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
25800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int *skip)
25801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
25803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The namespace of the element was already identified to be
25805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * matching the wildcard.
25806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((skip == NULL) || (wild == NULL) ||
25808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(wild->type != XML_SCHEMA_TYPE_ANY)) {
25809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElemWildcard",
25810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "bad arguments");
25811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
25812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *skip = 0;
25814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
25815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT VAL TODO: Either we need to position the stream to the
25817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* next sibling, or walk the whole subtree.
25818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*skip = 1;
25820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
25823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr decl = NULL;
25824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl = xmlSchemaGetElem(vctxt->schema,
2582660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    vctxt->inode->localName, vctxt->inode->nsName);
25827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl != NULL) {
25828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->decl = decl;
25829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
25830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
25833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* VAL TODO: Change to proper error code. */
25834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */
25835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No matching global element declaration available, but "
25836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "demanded by the strict wildcard");
25837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
25838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
25840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
25841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC Validation Rule: Schema-Validity Assessment (Element)
25843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (1.2.1.2.1) - (1.2.1.2.3 )
25844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use the xsi:type attribute for the type definition.
25846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr != NULL) {
25850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaProcessXSIType(vctxt, iattr,
25851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(vctxt->inode->typeDef), NULL) == -1) {
25852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElemWildcard",
25853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaProcessXSIType() to "
25854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "process the attribute 'xsi:nil'");
25855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Don't return an error on purpose.
25859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
25861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC Validation Rule: Schema-Validity Assessment (Element)
25865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fallback to "anyType".
25867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->typeDef =
25869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
25870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaCheckCOSValidDefault:
25875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
25876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* This will be called if: not nilled, no content and a default/fixed
25877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* value is provided.
25878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
25882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *value,
25883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaValPtr *val)
2588460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
25885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
25886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode = vctxt->inode;
25887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cos-valid-default:
25890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Element Default Valid (Immediate)
2589160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * For a string to be a valid default with respect to a type
25892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition the appropriate case among the following must be true:
2589360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
25894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if WXS_IS_COMPLEX(inode->typeDef) {
25895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Complex type.
25897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "its {content type} must be a simple type definition
25899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* or mixed."
25900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
2590160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* type}'s particle must be �emptiable� as defined by
2590260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Particle Emptiable (�3.9.6)."
25903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) &&
25905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) ||
25906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (! WXS_EMPTIABLE(inode->typeDef)))) {
25907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1;
25908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* NOTE that this covers (2.2.2) as well. */
25909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
25910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"For a string to be a valid default, the type definition "
25911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be a simple type or a complex type with simple content "
25912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"or mixed content and a particle emptiable");
25913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
25914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2591560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2591760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 1 If the type definition is a simple type definition, then the string
2591860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be �valid� with respect to that definition as defined by String
2591960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Valid (�3.14.4).
25920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
25922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
2592360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.1 If the {content type} is a simple type definition, then the
2592460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * string must be �valid� with respect to that simple type definition
2592560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * as defined by String Valid (�3.14.4).
2592660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
25927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(inode->typeDef)) {
25928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, inode->typeDef, value, val, 1, 1, 0);
25931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
25933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0);
25936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
25938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaCheckCOSValidDefault",
25939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVCheckCVCSimpleType()");
2594060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
25942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
25945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
25946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * name ATTRIBUTE_UNUSED,
25947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaElementPtr item,
25948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaNodeInfoPtr inode)
25949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inode->decl = item;
25951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT
25952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
25953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
25954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (item->type == XML_SCHEMA_TYPE_ELEMENT) {
25956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
25957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON callback for '%s' [declaration]\n",
25958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str,
25959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->localName, inode->nsName));
25960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
25961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
25962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON callback for '%s' [wildcard]\n",
25963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str,
25964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName, inode->nsName));
25965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
25968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
25970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
2597460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
25975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
25976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode == NULL) {
25977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidatorPushElem",
25978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaGetFreshElemInfo()");
25979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
2598060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nbAttrInfos = 0;
25982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
25987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaNodeInfoPtr inode,
25988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
25989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value)
25990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
25992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaVCheckCVCSimpleType(
25993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTXT_CAST vctxt, NULL,
25994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, &(inode->val), 1, 1, 0));
25995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
25996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaVCheckCVCSimpleType(
25997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTXT_CAST vctxt, NULL,
25998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, NULL, 1, 0, 0));
25999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2600360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/*
26004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process END of element.
26005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
26006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
26008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
26010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode = vctxt->inode;
26011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0)
26013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
26014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
26015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This element was not expected;
26017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we will not validate child elements of broken parents.
26018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip validation of all content of the parent.
26019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = vctxt->depth -1;
26021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
2602260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
26023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->typeDef == NULL) ||
26024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
26025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1. the type definition might be missing if the element was
26027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    error prone
26028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2. it might be abstract.
26029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check the content model.
26034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
26036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
26037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Workaround for "anyType".
26040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
2604260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    goto character_content;
2604360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
26045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *values[10];
26046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int terminal, nbval = 10, nbneg;
26047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (inode->regexCtxt == NULL) {
26049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the regex context.
26051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->regexCtxt =
26053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegNewExecCtxt(inode->typeDef->contModel,
26054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
26055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt);
26056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (inode->regexCtxt == NULL) {
26057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidatorPopElem",
26058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to create a regex context");
26059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
26060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON create on '%s'\n", inode->localName);
2606460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
26065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2606694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2606794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    /*
2606894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	     * Do not check further content if the node has been nilled
2606994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	     */
2607094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if (INODE_NILLED(inode)) {
2607194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		ret = 0;
2607294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#ifdef DEBUG_AUTOMATA
2607394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		xmlGenericError(xmlGenericErrorContext,
2607494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    "AUTOMATON succeeded on nilled '%s'\n",
2607594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    inode->localName);
2607694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif
2607794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                goto skip_nilled;
2607894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
2607994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
26080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get hold of the still expected content, since a further
26082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * call to xmlRegExecPushString() will loose this information.
2608360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegExecNextValues(inode->regexCtxt,
26085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&nbval, &nbneg, &values[0], &terminal);
26086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL);
26087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) {
26088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Still missing something.
26090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
26092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->flags |=
26093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL,
26096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Missing child element(s)",
26097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbval, nbneg, values);
26098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON missing ERROR on '%s'\n",
26101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName);
26102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Content model is satisfied.
26106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
26108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON succeeded on '%s'\n",
26111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName);
26112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2611794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2611894442ad4107000e6d49f9b85a46a591495a57632Selim Gurunskip_nilled:
2611994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
26120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
26121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcharacter_content:
26124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->value != NULL) {
26126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(vctxt->value);
26127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->value = NULL;
26128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check character content.
26131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->decl == NULL) {
26133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Speedup if no declaration exists.
26135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2613660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (WXS_IS_SIMPLE(inode->typeDef)) {
26137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef, inode->value);
26139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef,
26142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->value);
2614360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
26145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidatorPopElem",
26146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaVCheckCVCSimpleType()");
26147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2615260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * cvc-elt (3.3.4) : 5
26153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The appropriate case among the following must be true:
26154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2615660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * cvc-elt (3.3.4) : 5.1
2615760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * If the declaration has a {value constraint},
2615860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the item has neither element nor character [children] and
26159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * clause 3.2 has not applied, then all of the following must be true:
26160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->decl->value != NULL) &&
2616260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
26163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! INODE_NILLED(inode))) {
26164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2616560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* cvc-elt (3.3.4) : 5.1.1
2616660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* If the �actual type definition� is a �local type definition�
26167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then the canonical lexical representation of the {value constraint}
2616860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* value must be a valid default for the �actual type definition� as
2616960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* defined in Element Default Valid (Immediate) (�3.3.6).
26170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2617160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: 'local' above means types acquired by xsi:type.
26173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: Although the *canonical* value is stated, it is not
26174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* relevant if canonical or not. Additionally XML Schema 1.1
26175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* will removed this requirement as well.
26176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
26178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCheckCOSValidDefault(vctxt,
26180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->decl->value, &(inode->val));
26181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
26182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
26183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidatorPopElem",
26184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaCheckCOSValidDefault()");
26185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
26186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto end_elem;
26188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Stop here, to avoid redundant validation of the value
26191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (see following).
26192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto default_psvi;
2619460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
2619560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2619660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* cvc-elt (3.3.4) : 5.1.2
2619760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* The element information item with the canonical lexical
2619860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of the {value constraint} value used as its
2619960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �normalized value� must be �valid� with respect to the
2620060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �actual type definition� as defined by Element Locally Valid (Type)
2620160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (�3.3.4).
2620260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(inode->typeDef)) {
26204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef, inode->decl->value);
26206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef,
2620960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		inode->decl->value);
26210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
26215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto end_elem;
26218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdefault_psvi:
26221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PSVI: Create a text node on the instance element.
26223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
26225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (inode->node != NULL)) {
26226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr textChild;
26227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *normValue;
26228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: Normalize the value.
2623060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    normValue = xmlSchemaNormalizeValue(inode->typeDef,
26232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->decl->value);
26233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (normValue != NULL) {
26234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		textChild = xmlNewText(BAD_CAST normValue);
26235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(normValue);
26236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
26237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		textChild = xmlNewText(inode->decl->value);
26238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (textChild == NULL) {
26239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlNewText()");
26241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
2624360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlAddChild(inode->node, textChild);
26244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2624560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2624660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (! INODE_NILLED(inode)) {
26247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2624860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 5.2.1 The element information item must be �valid� with respect
2624960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to the �actual type definition� as defined by Element Locally
2625060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Valid (Type) (�3.3.4).
2625160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(inode->typeDef)) {
26253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     /*
26254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-type) (3.1)
26255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If the type definition is a simple type definition, ..."
26256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1.3) "If clause 3.2 of Element Locally Valid
2625760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (Element) (�3.3.4) did not apply, then the �normalized value�
2625860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * must be �valid� with respect to the type definition as defined
2625960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * by String Valid (�3.14.4).
2626060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode, inode->typeDef, inode->value);
26263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-type) (3.2) "If the type definition is a complex type
26266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition, then the element information item must be
2626760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �valid� with respect to the type definition as per
2626860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Element Locally Valid (Complex Type) (�3.4.4);"
26269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
26270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (2.2)
2627160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "If the {content type} is a simple type definition, ...
2627260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the �normalized value� of the element information item is
2627360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �valid� with respect to that simple type definition as
2627460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * defined by String Valid (�3.14.4)."
26275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef, inode->value);
2627860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
26283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto end_elem;
26286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2628860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 5.2.2 If there is a fixed {value constraint} and clause 3.2 has
26289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* not applied, all of the following must be true:
26290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((inode->decl->value != NULL) &&
26292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
26293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: We will need a computed value, when comparison is
26296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * done on computed values.
26297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2629960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 5.2.2.1 The element information item must have no element
26300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * information item [children].
26301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (inode->flags &
26303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
26304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_ELT_5_2_2_1;
26305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL,
26306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The content must not containt element nodes since "
26307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "there is a fixed value constraint");
26308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto end_elem;
26309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2631160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 5.2.2.2 The appropriate case among the following must
26312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* be true:
2631360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
26314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) {
26315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2631660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 5.2.2.2.1 If the {content type} of the �actual type
2631760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * definition� is mixed, then the *initial value* of the
2631860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * item must match the canonical lexical representation
26319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * of the {value constraint} value.
26320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
2632160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * ... the *initial value* of an element information
2632260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * item is the string composed of, in order, the
2632360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * [character code] of each character information item in
26324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the [children] of that element information item.
2632560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
26326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! xmlStrEqual(inode->value, inode->decl->value)){
2632760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
26328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: Report invalid & expected values as well.
26329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: Implement the canonical stuff.
26330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
26331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1;
2633260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaCustomErr(ACTXT_CAST vctxt,
26333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, NULL, NULL,
26334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The initial value '%s' does not match the fixed "
26335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "value constraint '%s'",
26336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->value, inode->decl->value);
26337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto end_elem;
26338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
26339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2634160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 5.2.2.2.2 If the {content type} of the �actual type
2634260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * definition� is a simple type definition, then the
2634360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * *actual value* of the item must match the canonical
26344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * lexical representation of the {value constraint} value.
26345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
26346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
26347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: *actual value* is the normalized value, impl.
26348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *           this.
26349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: Report invalid & expected values as well.
26350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: Implement a comparison with the computed values.
26351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
26352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! xmlStrEqual(inode->value,
26353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->decl->value)) {
26354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2;
26355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST vctxt,
26356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, NULL, NULL,
26357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The actual value '%s' does not match the fixed "
2635860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    "value constraint '%s'",
26359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->value,
26360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->decl->value);
26361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto end_elem;
2636260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
26363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2636460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
26365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2636760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectend_elem:
26369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0) {
26370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: raise error? */
26371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth == vctxt->skipDepth)
26374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = -1;
26375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the history of XPath state objects.
2637760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
26378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->appliedXPath &&
26379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
26380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
26381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * MAYBE TODO:
2638360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (6) "The element information item must be �valid� with
26384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * respect to each of the {identity-constraint definitions} as per
2638560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Identity-constraint Satisfied (�3.11.4)."
26386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * PSVI TODO: If we expose IDC node-tables via PSVI then the tables
26389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   need to be built in any case.
26390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   We will currently build IDC node-tables and bubble them only if
26391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   keyrefs do exist.
26392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2639360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add the current IDC target-nodes to the IDC node-tables.
26396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->idcMatchers != NULL) &&
26398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
26400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1)
26401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate IDC keyrefs.
26405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->hasKeyrefs)
26407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
26408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Merge/free the IDC table.
26411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->idcTable != NULL) {
26413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC_NODE_TABLE
26414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaDebugDumpIDCTable(stdout,
26415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->nsName,
26416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->localName,
26417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->idcTable);
26418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->depth > 0) &&
26420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
26422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Merge the IDC node table with the table of the parent node.
26424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
26426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
2642760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Clear the current ielem.
26431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * VAL TODO: Don't free the PSVI IDC tables if they are
26432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * requested for the PSVI.
26433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaClearElemInfo(vctxt, inode);
26435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip further processing if we are on the validation root.
26437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth == 0) {
26439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->depth--;
26440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode = NULL;
26441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the keyrefDepth if needed.
26445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs != NULL) {
26447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
26448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
26449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (aidc->keyrefDepth == vctxt->depth) {
26450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* A 'keyrefDepth' of a key/unique IDC matches the current
26452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* depth, this means that we are leaving the scope of the
26453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* top-most keyref IDC which refers to this IDC.
26454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc->keyrefDepth = -1;
26456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = aidc->next;
26458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (aidc != NULL);
26459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2646060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    vctxt->depth--;
26461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode = vctxt->elemInfos[vctxt->depth];
26462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2646360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * VAL TODO: 7 If the element information item is the �validation root�, it must be
2646460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4).
26465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
26469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
26470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
26471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
26474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.4.4 Complex Type Definition Validation Rules
26475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type)
26476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
26477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
26479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr pielem;
26481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ptype;
26482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
26483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth <= 0) {
26485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateChildElem",
26486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "not intended for the validation root");
26487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
26488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pielem = vctxt->elemInfos[vctxt->depth -1];
26490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
26491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
26492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle 'nilled' elements.
26494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (INODE_NILLED(pielem)) {
26496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-elt) (3.3.4) : (3.2.1)
26498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_PARENT_ELEM;
26500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_ELT_3_2_1;
26501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(ret, NULL,
26502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Neither character nor element content is allowed, "
26503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the element was 'nilled'");
26504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ELEM;
26505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto unexpected_elem;
26506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ptype = pielem->typeDef;
26509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
26511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Workaround for "anyType": we have currently no content model
26513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* assigned for "anyType", so handle it explicitely.
26514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "anyType" has an unbounded, lax "any" wildcard.
26515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->localName,
26518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName);
26519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl == NULL) {
26521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAttrInfoPtr iattr;
26522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process "xsi:type".
26524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3)
26525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr != NULL) {
26529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaProcessXSIType(vctxt, iattr,
26530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &(vctxt->inode->typeDef), NULL);
26531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != 0) {
26532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
26533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaValidateChildElem",
26534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaProcessXSIType() to "
26535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "process the attribute 'xsi:nil'");
26536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
26537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
26538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (ret);
26539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 /*
26542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Fallback to "anyType".
26543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 *
26544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * SPEC (cvc-assess-elt)
2654560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * "If the item cannot be �strictly assessed�, [...]
26546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * an element information item's schema validity may be laxly
2654760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * assessed if its �context-determined declaration� is not
2654860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * skip by �validating� with respect to the �ur-type
2654960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * definition� as per Element Locally Valid (Type) (�3.3.4)."
26550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->typeDef =
26552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (ptype->contentType) {
26559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_EMPTY:
26560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.1) "If the {content type} is empty, then the
26562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element information item has no character or element
26563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * information item [children]."
26564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_PARENT_ELEM
26566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1;
26567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
26568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Element content is not allowed, "
26569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"because the content type is empty");
26570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM
26571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto unexpected_elem;
26572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_MIXED:
26575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ELEMENTS: {
26576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegExecCtxtPtr regexCtxt;
26577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *values[10];
26578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int terminal, nbval = 10, nbneg;
26579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* VAL TODO: Optimized "anyType" validation.*/
26581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptype->contModel == NULL) {
26583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type has elem content but no content model");
26585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Safety belf for evaluation if the cont. model was already
26589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * examined to be invalid.
26590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
26592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating elem, but elem content is already invalid");
26594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    regexCtxt = pielem->regexCtxt;
26598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (regexCtxt == NULL) {
26599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the regex context.
26601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
26603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
26604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt);
26605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (regexCtxt == NULL) {
26606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidateChildElem",
26607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to create a regex context");
26608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
26609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pielem->regexCtxt = regexCtxt;
26611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n",
26613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pielem->localName);
26614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.4) "If the {content type} is element-only or mixed,
26619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * then the sequence of the element information item's
26620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element information item [children], if any, taken in
2662160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * order, is �valid� with respect to the {content type}'s
26622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * particle, as defined in Element Sequence Locally Valid
2662360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (Particle) (�3.9.4)."
26624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegExecPushString2(regexCtxt,
26626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName,
26627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->nsName,
26628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode);
26629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0)
26631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON push ERROR for '%s' on '%s'\n",
26633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, pielem->localName);
26634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
26635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON push OK for '%s' on '%s'\n",
26637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, pielem->localName);
26638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->err == XML_SCHEMAV_INTERNAL) {
26640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlRegExecPushString2()");
26642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg,
26646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &values[0], &terminal);
26647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL,
26649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "This element is not expected",
26650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbval, nbneg, values);
26651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = vctxt->err;
26652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto unexpected_elem;
26653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
26654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
26655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_SIMPLE:
26658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_BASIC:
26659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_PARENT_ELEM
26660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(ptype)) {
26661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-complex-type) (2.2)
26663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "If the {content type} is a simple type definition, then
26664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the element information item has no element information
26665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* item [children], ..."
26666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2;
26668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL, "Element content is not allowed, "
26669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "because the content type is a simple type definition");
26670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-type) (3.1.2) "The element information item must
26673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* have no element information item [children]."
26674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_TYPE_3_1_2;
26676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL, "Element content is not allowed, "
26677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "because the type definition is simple");
26678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM
26680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = vctxt->err;
26681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto unexpected_elem;
26682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
26685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectunexpected_elem:
26689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Pop this element and set the skipDepth to skip
26691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * all further content of the parent element.
26692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->skipDepth = vctxt->depth;
26694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
26695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
26700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_CREATED 2
26701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
26702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
26705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int nodeType, const xmlChar *value, int len,
26706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int mode, int *consumed)
26707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Unfortunately we have to duplicate the text sometimes.
26710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * OPTIMIZE: Maybe we could skip it, if:
26711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   1. content type is simple
26712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   2. whitespace is "collapse"
26713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   3. it consists of whitespace only
26714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
26715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process character content.
26716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (consumed != NULL)
26718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*consumed = 0;
26719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (INODE_NILLED(vctxt->inode)) {
2672060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC cvc-elt (3.3.4 - 3.2.1)
26722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "The element information item must have no character or
26723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* element information item [children]."
26724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL,
26726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Neither character nor element content is allowed "
26727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the element is 'nilled'");
26728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
26729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2.1) "If the {content type} is empty, then the
26732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * element information item has no character or element
26733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * information item [children]."
26734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->contentType ==
2673660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    XML_SCHEMA_CONTENT_EMPTY) {
26737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL,
26738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Character content is not allowed, "
26739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the content type is empty");
26740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
26741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->contentType ==
26744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_CONTENT_ELEMENTS) {
26745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nodeType != XML_TEXT_NODE) ||
26746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (! xmlSchemaIsBlank((xmlChar *) value, len))) {
2674760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
2674860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * SPEC cvc-complex-type (2.3)
2674960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "If the {content type} is element-only, then the
2675060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * element information item has no character information
2675160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * item [children] other than those whose [character
2675260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * code] is defined as a white space in [XML 1.0 (Second
26753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Edition)]."
26754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL,
26756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Character content other than whitespace is not allowed "
26757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"because the content type is 'element-only'");
26758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (vctxt->err);
26759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2676260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((value == NULL) || (value[0] == 0))
26764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save the value.
26767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that even if the content type is *mixed*, we need the
26768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *initial value* for default/fixed value constraints.
26769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
26771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((vctxt->inode->decl == NULL) ||
26772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->inode->decl->value == NULL)))
26773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
2677460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->value == NULL) {
26776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Set the value.
26778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (mode) {
26780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_PERSIST:
26781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working on a tree.
26783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->value = value;
26785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_CREATED:
26787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working with the reader.
26789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The value will be freed by the element info.
26790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->value = value;
26792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (consumed != NULL)
26793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *consumed = 1;
26794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |=
26795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_VOLATILE:
26798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working with SAX.
26800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The value will be freed by the element info.
26801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len != -1)
26803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->value = BAD_CAST xmlStrndup(value, len);
26804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
26805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->value = BAD_CAST xmlStrdup(value);
26806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |=
26807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
26810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
26813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len < 0)
26814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(value);
26815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Concat the value.
2681760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
26819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->value = BAD_CAST xmlStrncat(
26820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlChar *) vctxt->inode->value, value, len);
26821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
26822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->value =
26823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len);
26824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2682660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
26827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
26829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
26833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
26835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) &&
26837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->depth >= vctxt->skipDepth)) {
26838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElem",
26839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "in skip-state");
26840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
26841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xsiAssemble) {
2684360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We will stop validation if there was an error during
26845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* dynamic schema construction.
26846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we simply set @skipDepth to 0, this could
26847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* mean that a streaming document via SAX would be
26848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* still read to the end but it won't be validated any more.
26849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: If we are sure how to stop the validation at once
26850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   for all input scenarios, then this should be changed to
26851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   instantly stop the validation.
26852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaAssembleByXSI(vctxt);
26854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1)
26856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = 0;
26858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
26859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26860df143a5041f03a22808b59c76698770b74692815Selim Gurun        /*
26861df143a5041f03a22808b59c76698770b74692815Selim Gurun         * Augment the IDC definitions for the main schema and all imported ones
26862df143a5041f03a22808b59c76698770b74692815Selim Gurun         * NOTE: main schema is the first in the imported list
26863df143a5041f03a22808b59c76698770b74692815Selim Gurun         */
26864df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
26865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth > 0) {
26867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Validate this element against the content model
26869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the parent.
26870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaValidateChildElem(vctxt);
26872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElem",
26875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaStreamValidateChildElement()");
26876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->depth == vctxt->skipDepth)
26881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->inode->decl == NULL) &&
26883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->typeDef == NULL)) {
26884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the child element was valid but neither the "
26886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"declaration nor the type was set");
26887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
26890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the declaration of the validation root.
26892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->localName,
26895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName);
26896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl == NULL) {
26897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_ELT_1;
26898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
26899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"No matching global declaration available "
26900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"for the validation root");
26901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->decl == NULL)
26906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto type_validation;
26907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
26909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int skip;
26910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Wildcards.
26912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaValidateElemWildcard(vctxt, &skip);
26914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElem",
26917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidateElemWildcard()");
26918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (skip) {
26923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = vctxt->depth;
26924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The declaration might be set by the wildcard validation,
26928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* when the processContents is "lax" or "strict".
26929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
26931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Clear the "decl" field to not confuse further processing.
26933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->decl = NULL;
26935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto type_validation;
26936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the declaration.
26940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateElemDecl(vctxt);
26942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
26943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
26944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidateElemDecl()");
26946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
26949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the type definition.
26952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttype_validation:
26954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef == NULL) {
26956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_TYPE_1;
2695894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	VERROR(ret, NULL,
2695994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    "The type definition is absent");
26960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2696160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
26962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
26963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_TYPE_2;
2696594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    VERROR(ret, NULL,
2696694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    "The type definition is abstract");
26967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
26968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate IDCs. Do it here, since new IDC matchers are registered
26971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * during validation against the declaration. This must be done
26972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * _before_ attribute validation.
26973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL) {
26975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
26976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->appliedXPath = 1;
26977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
26978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaXPathEvaluate()");
26980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate attributes.
26985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
26987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->nbAttrInfos != 0) ||
26988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->typeDef->attrUses != NULL)) {
26989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVAttributesComplex(vctxt);
26991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->nbAttrInfos != 0) {
26993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVAttributesSimple(vctxt);
26995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Clear registered attributes.
26998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0)
27000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
27001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1) {
27002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElem",
27003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling attributes validation");
27004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
27005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Don't return an error if attributes are invalid on purpose.
27008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
27010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
27013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = vctxt->depth;
27014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
27017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_SCHEMA_READER_ENABLED
27020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
27021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
27022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
27024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth, nodeType, ret = 0, consumed;
27025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
27026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
27028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlTextReaderRead(vctxt->reader);
27029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Move to the document element.
27031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (ret == 1) {
27033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nodeType = xmlTextReaderNodeType(vctxt->reader);
27034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE)
27035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto root_found;
27036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlTextReaderRead(vctxt->reader);
27037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto exit;
27039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectroot_found:
27041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
27043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth = xmlTextReaderDepth(vctxt->reader);
27044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nodeType = xmlTextReaderNodeType(vctxt->reader);
27045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE) {
2704760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
27048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth++;
27049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidatorPushElem()");
27052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem = vctxt->inode;
27055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->localName = xmlTextReaderLocalName(vctxt->reader);
27056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
27057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
27058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Is the element empty?
27060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlTextReaderIsEmptyElement(vctxt->reader);
27062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlTextReaderIsEmptyElement()");
27065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret) {
27068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Register attributes.
27072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nbAttrInfos = 0;
27074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
27075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlTextReaderMoveToFirstAttribute()");
27078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1) {
27081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
27082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
27083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: How do we know that the reader works on a
27084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * node tree, to be able to pass a node here?
27085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
27086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaValidatorPushAttribute(vctxt, NULL,
27087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
27088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlTextReaderNamespaceUri(vctxt->reader), 1,
27089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlTextReaderValue(vctxt->reader), 1) == -1) {
27090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVReaderWalk",
27092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaValidatorPushAttribute()");
27093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
27096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
27097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVReaderWalk",
27098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlTextReaderMoveToFirstAttribute()");
27099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (ret == 1);
27102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Back to element position.
27104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlTextReaderMoveToElement(vctxt->reader);
27106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlTextReaderMoveToElement()");
27109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the element.
27114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret= xmlSchemaValidateElem(vctxt);
27116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidateElem()");
27120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
27123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->depth == vctxt->skipDepth) {
27125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int curDepth;
27126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Skip all content.
27128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
27130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlTextReaderRead(vctxt->reader);
27131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curDepth = xmlTextReaderDepth(vctxt->reader);
27132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while ((ret == 1) && (curDepth != depth)) {
27133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlTextReaderRead(vctxt->reader);
27134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curDepth = xmlTextReaderDepth(vctxt->reader);
27135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
27137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
27138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: A reader error occured; what to do here?
27139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
27140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
27141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit;
27142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_elem;
27145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * READER VAL TODO: Is an END_ELEM really never called
27148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if the elem is empty?
27149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_elem;
27152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (nodeType == END_ELEM) {
27153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process END of element.
27155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectleave_elem:
27157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPopElem(vctxt);
27158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
27160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidatorPopElem()");
27162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
27165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->depth >= 0)
27167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem = vctxt->inode;
27168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
27169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem = NULL;
27170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((nodeType == XML_TEXT_NODE) ||
27171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == XML_CDATA_SECTION_NODE) ||
27172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == WHTSP) ||
27173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == SIGN_WHTSP)) {
27174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process character content.
27176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *value;
27178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
27180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nodeType = XML_TEXT_NODE;
27181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = xmlTextReaderValue(vctxt->reader);
27183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value,
27184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed);
27185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! consumed)
27186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(value);
27187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVPushText()");
27190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((nodeType == XML_ENTITY_NODE) ||
27193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == XML_ENTITY_REF_NODE)) {
27194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: What to do with entities?
27196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
27198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Read next node.
27201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlTextReaderRead(vctxt->reader);
27203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (ret == 1);
27204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
27209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
27211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2721394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2721494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			SAX validation handlers				*
2721594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
27216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
27217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
27219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process text content.
27220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
27221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2722260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaSAXHandleText(void *ctx,
2722360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		       const xmlChar * ch,
27224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int len)
27225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len,
27235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
27236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleCDataSection",
27237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVPushText()");
27238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->err = -1;
27239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStopParser(vctxt->parserCtxt);
27240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
27244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process CDATA content.
27245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
27246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2724760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaSAXHandleCDataSection(void *ctx,
2724860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			     const xmlChar * ch,
27249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int len)
2725060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
27251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len,
27260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
27261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleCDataSection",
27262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVPushText()");
27263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->err = -1;
27264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStopParser(vctxt->parserCtxt);
27265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED,
27270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar * name ATTRIBUTE_UNUSED)
27271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* SAX VAL TODO: What to do here? */
27279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
27280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleStartElementNs(void *ctx,
2728460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * localname,
2728560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * prefix ATTRIBUTE_UNUSED,
2728660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * URI,
2728760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_namespaces,
2728860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar ** namespaces,
2728960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_attributes,
2729060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_defaulted ATTRIBUTE_UNUSED,
27291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar ** attributes)
2729260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
27293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
27295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
27296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
2729760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
27298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: What to do with nb_defaulted?
27300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip elements if inside a "skip" wildcard or invalid.
27303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth++;
27305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Push the element.
27309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaValidatorPushElem()");
27313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
27314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem = vctxt->inode;
27316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is this OK?
27318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt);
27320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->localName = localname;
27321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->nsName = URI;
27322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Register namespaces on the elem info.
2732560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
27326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nb_namespaces != 0) {
27327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Although the parser builds its own namespace list,
27329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we have no access to it, so we'll use an own one.
27330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2733160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
27332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Store prefix and namespace name.
2733460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ielem->nsBindings == NULL) {
27336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings =
27337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar **) xmlMalloc(10 *
27338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(const xmlChar *));
27339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ielem->nsBindings == NULL) {
27340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaVErrMemory(vctxt,
27341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating namespace bindings for SAX validation",
27342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
27343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nbNsBindings = 0;
27346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->sizeNsBindings = 5;
27347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
27348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->sizeNsBindings *= 2;
27349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings =
27350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar **) xmlRealloc(
27351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(void *) ielem->nsBindings,
27352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ielem->sizeNsBindings * 2 * sizeof(const xmlChar *));
27353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ielem->nsBindings == NULL) {
27354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaVErrMemory(vctxt,
27355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"re-allocating namespace bindings for SAX validation",
27356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
27357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j];
27362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (namespaces[j+1][0] == 0) {
27363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle xmlns="".
27365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL;
27367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
27368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
27369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[j+1];
2737060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ielem->nbNsBindings++;
27371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Register attributes.
27375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: We are not adding namespace declaration
27376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * attributes yet.
27377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nb_attributes != 0) {
27379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *value;
27380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0, i = 0; i < nb_attributes; i++, j += 5) {
27382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Duplicate the value.
2738460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = xmlStrndup(attributes[j+3],
27386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attributes[j+4] - attributes[j+3]);
27387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Set the node line.
27389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPushAttribute(vctxt,
27391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0,
27392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, 1);
27393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidatorPushAttribute()");
27396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate the element.
27402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateElem(vctxt);
27404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
27405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
27406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidateElem()");
27408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2741160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
27412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
27417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStopParser(vctxt->parserCtxt);
27418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleEndElementNs(void *ctx,
27423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * localname ATTRIBUTE_UNUSED,
27424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * prefix ATTRIBUTE_UNUSED,
27425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * URI ATTRIBUTE_UNUSED)
27426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
27429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip elements if inside a "skip" wildcard or if invalid.
27432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->skipDepth != -1) {
27434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->depth > vctxt->skipDepth) {
27435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth--;
27436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
27437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
27438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = -1;
27439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: Just a temporary check.
27442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!xmlStrEqual(vctxt->inode->localName, localname)) ||
27444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlStrEqual(vctxt->inode->nsName, URI))) {
27445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleEndElementNs",
27446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "elem pop mismatch");
27447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaValidatorPopElem(vctxt);
27449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0) {
27450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res < 0) {
27451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaSAXHandleEndElementNs",
27452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidatorPopElem()");
27453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
27456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
27461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStopParser(vctxt->parserCtxt);
27462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2746694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2746794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Validation interfaces				*
2746894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
27469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
27470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewValidCtxt:
27473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a precompiled XML Schemas
27474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas validation context based on the given schema.
27476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error
27478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidCtxtPtr
27480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewValidCtxt(xmlSchemaPtr schema)
27481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ret;
27483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt));
27485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
27486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaVErrMemory(NULL, "allocating validation context", NULL);
27487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
27488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaValidCtxt));
27490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_CTXT_VALIDATOR;
27491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
27492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodeQNames = xmlSchemaItemListCreate();
27493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schema = schema;
27494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2749894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlSchemaValidateSetFilename:
2749994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @vctxt: the schema validation context
2750094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @filename: the file name
2750194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
2750294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Workaround to provide file error reporting information when this is
2750394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * not provided by current APIs
2750494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */
2750594442ad4107000e6d49f9b85a46a591495a57632Selim Gurunvoid
2750694442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, const char *filename) {
2750794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (vctxt == NULL)
2750894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return;
2750994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (vctxt->filename != NULL)
2751094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        xmlFree(vctxt->filename);
2751194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (filename != NULL)
2751294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        vctxt->filename = (char *) xmlStrdup((const xmlChar *) filename);
2751394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    else
2751494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        vctxt->filename = NULL;
2751594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun}
2751694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2751794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun/**
27518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaClearValidCtxt:
2751994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @vctxt: the schema validation context
27520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context;
27522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * leaves some fields alive intended for reuse of the context.
27523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
27526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt == NULL)
27528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Should we clear the flags?
27532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   Might be problematic if one reuses the context
27533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   and assumes that the options remain the same.
27534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->flags = 0;
27536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->validationRoot = NULL;
27537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->doc = NULL;
27538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
27539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->reader = NULL;
27540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2754160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    vctxt->hasKeyrefs = 0;
27542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->value != NULL) {
27544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(vctxt->value);
27545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->value = NULL;
27546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Augmented IDC information.
27549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs != NULL) {
27551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr cur = vctxt->aidcs, next;
27552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
27553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = cur->next;
27554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(cur);
27555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = next;
27556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
27557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = NULL;
27558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcMatcherCache != NULL) {
27560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
27561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (matcher) {
27563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = matcher;
27564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->nextCached;
27565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCFreeMatcherList(tmp);
27566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcMatcherCache = NULL;
27568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcNodes != NULL) {
27572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCNodePtr item;
27574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->nbIdcNodes; i++) {
27576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = vctxt->idcNodes[i];
27577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item->keys);
27578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item);
27579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(vctxt->idcNodes);
27581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = NULL;
27582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nbIdcNodes = 0;
27583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes = 0;
27584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we won't delete the XPath state pool here.
27587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL) {
27589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
27590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xpathStates = NULL;
27591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute info.
27594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
27596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
27597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Element info.
27600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->elemInfos != NULL) {
27602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ei;
27604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->sizeElemInfos; i++) {
27606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ei = vctxt->elemInfos[i];
27607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ei == NULL)
27608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
27609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearElemInfo(vctxt, ei);
27610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2761160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
27612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListClear(vctxt->nodeQNames);
27613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Recreate the dict. */
27614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(vctxt->dict);
27615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is is save to recreate it? Do we have a scenario
27617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * where the user provides the dict?
27618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->dict = xmlDictCreate();
2762094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2762194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (vctxt->filename != NULL) {
2762294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        xmlFree(vctxt->filename);
2762394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	vctxt->filename = NULL;
2762494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
27625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeValidCtxt:
27629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
27630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context
27632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
27635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value != NULL)
27639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(ctxt->value);
27640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(ctxt->pctxt);
27642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idcNodes != NULL) {
27643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCNodePtr item;
27645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->nbIdcNodes; i++) {
27647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = ctxt->idcNodes[i];
27648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item->keys);
27649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item);
27650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->idcNodes);
27652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idcKeys != NULL) {
27654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->nbIdcKeys; i++)
27656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCFreeKey(ctxt->idcKeys[i]);
27657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->idcKeys);
27658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->xpathStates != NULL) {
27661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
27662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->xpathStates = NULL;
27663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->xpathStatePool != NULL) {
27665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
27666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->xpathStatePool = NULL;
27667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Augmented IDC information.
27671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->aidcs != NULL) {
27673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr cur = ctxt->aidcs, next;
27674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
27675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = cur->next;
27676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(cur);
27677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = next;
27678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
27679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->attrInfos != NULL) {
27681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr attr;
27683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Just a paranoid call to the cleanup. */
27685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->nbAttrInfos != 0)
27686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearAttrInfos(ctxt);
27687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->sizeAttrInfos; i++) {
27688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = ctxt->attrInfos[i];
27689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(attr);
27690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->attrInfos);
27692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemInfos != NULL) {
27694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ei;
27696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->sizeElemInfos; i++) {
27698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ei = ctxt->elemInfos[i];
27699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ei == NULL)
27700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
27701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearElemInfo(ctxt, ei);
27702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ei);
27703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->elemInfos);
27705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nodeQNames != NULL)
27707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(ctxt->nodeQNames);
27708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->dict != NULL)
27709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictFree(ctxt->dict);
2771094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (ctxt->filename != NULL)
2771194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlFree(ctxt->filename);
27712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
27713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsValid:
27717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
27718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if any error was detected during validation.
2772060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
27721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if valid so far, 0 if errors were detected, and -1 in case
27722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         of internal error.
27723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
27726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
27729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt->err == 0);
27730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidErrors:
27734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
27735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function
27736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function
27737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
27738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations
27740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSchemaValidityErrorFunc err,
27744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSchemaValidityWarningFunc warn, void *ctx)
27745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
27749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
27750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
27751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx);
27753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidStructuredErrors:
27757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
27758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
27759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
27760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
27762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
27765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlStructuredErrorFunc serror, void *ctx)
27766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->serror = serror;
27770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
27771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
27772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
27773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx);
27775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetValidErrors:
2777960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a XML-Schema validation context
27780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function result
27781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result
27782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result
27783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations
27785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise
27787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValidityErrorFunc * err,
27791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValidityWarningFunc * warn, void **ctx)
27792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt == NULL)
27794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
27795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err != NULL)
27796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*err = ctxt->error;
27797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (warn != NULL)
27798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*warn = ctxt->warning;
27799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctx != NULL)
27800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ctx = ctxt->errCtxt;
27801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
27802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidOptions:
27807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:	a schema validation context
27808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of xmlSchemaValidOption
27809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the options to be used during the validation.
27811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of an
27813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * API error.
27814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
27817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int options)
27818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
27821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
27824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * WARNING: Change the start value if adding to the
27826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaValidOption.
27827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is there an other, more easy to maintain,
27828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * way?
27829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < (int) sizeof(int) * 8; i++) {
27831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (options & 1<<i)
27832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
27833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->options = options;
27835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
27836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidCtxtGetOptions:
2784060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a schema validation context
27841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the validation context options.
27843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the option combination or -1 on error.
27845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
27848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
27852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
27853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->options);
27854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
27857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
27858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
27860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
27861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem = NULL;
27862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node, valRoot;
27863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
27864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* DOC VAL TODO: Move this to the start function. */
2786694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (vctxt->validationRoot != NULL)
2786794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        valRoot = vctxt->validationRoot;
2786894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    else
2786994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	valRoot = xmlDocGetRootElement(vctxt->doc);
27870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (valRoot == NULL) {
27871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* VAL TODO: Error code? */
27872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(1, NULL, "The document has no document element");
27873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
27874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
27876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->validationRoot = valRoot;
27877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = valRoot;
27878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node != NULL) {
27879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_sibling;
27881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ELEMENT_NODE) {
27882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Init the node-info.
27885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth++;
27887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaValidatorPushElem(vctxt) == -1)
27888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem = vctxt->inode;
27890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->node = node;
27891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nodeLine = node->line;
27892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->localName = node->name;
27893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->ns != NULL)
27894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsName = node->ns->href;
27895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Register attributes.
27898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: We do not register namespace declaration
27899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * attributes yet.
27900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nbAttrInfos = 0;
27902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->properties != NULL) {
27903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = node->properties;
27904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
27905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (attr->ns != NULL)
27906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = attr->ns->href;
27907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
27908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = NULL;
27909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidatorPushAttribute(vctxt,
27910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr,
2791160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
27912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Note that we give it the line number of the
27913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* parent element.
27914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
27915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ielem->nodeLine,
27916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attr->name, nsName, 0,
27917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodeListGetString(attr->doc, attr->children, 1), 1);
27918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
27919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaDocWalk",
27920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaValidatorPushAttribute()");
27921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
27924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (attr);
27925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the element.
27928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateElem(vctxt);
27930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaDocWalk",
27933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidateElem()");
27934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't stop validation; just skip the content
27938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of this element.
27939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_node;
27941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((vctxt->skipDepth != -1) &&
27943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(vctxt->depth >= vctxt->skipDepth))
27944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_node;
27945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((node->type == XML_TEXT_NODE) ||
27946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_CDATA_SECTION_NODE)) {
27947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process character content.
27949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
27951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVPushText(vctxt, node->type, node->content,
27953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL);
27954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
27955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVDocWalk",
27956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVPushText()");
27957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: Should we skip further validation of the
27961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element content here?
27962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((node->type == XML_ENTITY_NODE) ||
27964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_ENTITY_REF_NODE)) {
27965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: What to do with entities?
2796760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaVDocWalk",
27969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"there is at least one entity reference in the node-tree "
27970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"currently being validated. Processing of entities with "
27971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"this XML Schema processor is not supported (yet). Please "
27972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitute entities before validation.");
27973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
27975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto leave_node;
27976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: XInclude nodes, etc.
27978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Walk the doc.
27982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->children != NULL) {
27984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->children;
27985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
27986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectleave_node:
27988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ELEMENT_NODE) {
27989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Leaving the scope of an element.
27991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node != vctxt->inode->node) {
27993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVDocWalk",
27994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "element position mismatch");
27995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPopElem(vctxt);
27998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
28000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVDocWalk",
28001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidatorPopElem()");
28002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
28003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
28004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
28005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node == valRoot)
28006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
28007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
28008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling:
28009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->next != NULL)
28010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->next;
28011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
28012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->parent;
28013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto leave_node;
28014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
28015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
28018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
28020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
28021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
28025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Some initialization.
2802760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
28028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = 0;
28029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nberrors = 0;
28030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
28031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->skipDepth = -1;
28032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->xsiAssemble = 0;
28033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->hasKeyrefs = 0;
28034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_IDC_NODE_TABLES_TEST
28035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->createIDCNodeTables = 1;
28036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
28037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->createIDCNodeTables = 0;
28038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a schema + parser if necessary.
28041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
28042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->schema == NULL) {
28043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParserCtxtPtr pctxt;
2804460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xsiAssemble = 1;
2804660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
28047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If not schema was given then we will create a schema
28048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* dynamically using XSI schema locations.
28049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
28050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema parser context.
28051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->pctxt == NULL) &&
28053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
28054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   return (-1);
28055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt = vctxt->pctxt;
28056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->xsiAssemble = 1;
28057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema.
28059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->schema = xmlSchemaNewSchema(pctxt);
28061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->schema == NULL)
2806260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return (-1);
2806360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
28064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema construction context.
28065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
28067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->constructor == NULL)
28068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
28069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->constructor->mainSchema = vctxt->schema;
28070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Take ownership of the constructor to be able to free it.
28072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->ownsConstructor = 1;
2807460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
2807560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
2807660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Augment the IDC definitions for the main schema and all imported ones
28077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: main schema if the first in the imported list
28078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
28079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
2808060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
28086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xsiAssemble) {
28087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->schema != NULL) {
28088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(vctxt->schema);
28089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->schema = NULL;
28090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
28091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaClearValidCtxt(vctxt);
28093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
28097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
28099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPreRun(vctxt) < 0)
28101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
28102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->doc != NULL) {
28104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Tree validation.
28106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVDocWalk(vctxt);
28108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
28109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->reader != NULL) {
28110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * XML Reader validation.
28112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_SCHEMA_READER_ENABLED
28114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVReaderWalk(vctxt);
28115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) {
28118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * SAX validation.
28120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlParseDocument(vctxt->parserCtxt);
28122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaVStart",
28124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no instance to validate");
28125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = -1;
28126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPostRun(vctxt);
28129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
28130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = vctxt->err;
28131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateOneElement:
28136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element node
28138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a branch of a tree, starting with the given @elem.
28140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the element and its subtree is valid, a positive error
28142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * code number otherwise and -1 in case of an internal or API error.
28143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem)
28146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE))
28148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->schema == NULL)
28151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = elem->doc;
28154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->node = elem;
28155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->validationRoot = elem;
28156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaVStart(ctxt));
28157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateDoc:
28161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a parsed document tree
28163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory.
28165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is schemas valid, a positive error code
28167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
28168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
28171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (doc == NULL))
28173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = doc;
28176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->node = xmlDocGetRootElement(doc);
28177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->node == NULL) {
28178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaCustomErr(ACTXT_CAST ctxt,
28179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING,
28180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlNodePtr) doc, NULL,
28181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The document has no document element", NULL, NULL);
28182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ctxt->err);
28183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->validationRoot = ctxt->node;
28185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaVStart(ctxt));
28186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2819094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2819194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Function and data for SAX streaming API			*
2819294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
28193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
28194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
28195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
28196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSplitSAXData {
28198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      user_sax;
28199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                 *user_data;
28200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ctxt;
28201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      schemas_sax;
28202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
28203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SAX_PLUG_MAGIC 0xdc43ba21
28205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSAXPlug {
28207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int magic;
28208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the original callbacks informations */
28210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr     *user_sax_ptr;
28211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      user_sax;
28212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                **user_data_ptr;
28213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                 *user_data;
28214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the block plugged back and validation informations */
28216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandler         schemas_sax;
28217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ctxt;
28218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
28219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* All those functions just bounces to the user provided SAX handlers */
28221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectinternalSubsetSplit(void *ctx, const xmlChar *name,
28223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       const xmlChar *ExternalID, const xmlChar *SystemID)
28224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->internalSubset != NULL))
28228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID,
28229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               SystemID);
28230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectisStandaloneSplit(void *ctx)
28234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->isStandalone != NULL))
28238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->isStandalone(ctxt->user_data));
28239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthasInternalSubsetSplit(void *ctx)
28244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->hasInternalSubset != NULL))
28248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
28249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthasExternalSubsetSplit(void *ctx)
28254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->hasExternalSubset != NULL))
28258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
28259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectexternalSubsetSplit(void *ctx, const xmlChar *name,
28264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       const xmlChar *ExternalID, const xmlChar *SystemID)
28265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
2826860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (ctxt->user_sax->externalSubset != NULL))
2826960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID,
28270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               SystemID);
28271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlParserInputPtr
28274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectresolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
28275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->resolveEntity != NULL))
28279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
28280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                     systemId));
28281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr
28285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectgetEntitySplit(void *ctx, const xmlChar *name)
28286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->getEntity != NULL))
28290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->getEntity(ctxt->user_data, name));
28291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr
28295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectgetParameterEntitySplit(void *ctx, const xmlChar *name)
28296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->getParameterEntity != NULL))
28300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name));
28301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectentityDeclSplit(void *ctx, const xmlChar *name, int type,
28307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
28308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->entityDecl != NULL))
28312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId,
28313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                           systemId, content);
28314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectattributeDeclSplit(void *ctx, const xmlChar * elem,
28318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   const xmlChar * name, int type, int def,
28319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   const xmlChar * defaultValue, xmlEnumerationPtr tree)
28320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->attributeDecl != NULL)) {
28324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type,
28325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                              def, defaultValue, tree);
28326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeEnumeration(tree);
28328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectelementDeclSplit(void *ctx, const xmlChar *name, int type,
28333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlElementContentPtr content)
28334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->elementDecl != NULL))
28338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content);
28339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectnotationDeclSplit(void *ctx, const xmlChar *name,
28343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     const xmlChar *publicId, const xmlChar *systemId)
28344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->notationDecl != NULL))
28348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId,
28349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                             systemId);
28350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectunparsedEntityDeclSplit(void *ctx, const xmlChar *name,
28354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *publicId, const xmlChar *systemId,
28355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *notationName)
28356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
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->unparsedEntityDecl != NULL))
28360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId,
28361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                   systemId, notationName);
28362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectsetDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc)
28366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->setDocumentLocator != NULL))
28370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
28371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectstartDocumentSplit(void *ctx)
28375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->startDocument != NULL))
28379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->startDocument(ctxt->user_data);
28380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectendDocumentSplit(void *ctx)
28384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->endDocument != NULL))
28388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->endDocument(ctxt->user_data);
28389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectprocessingInstructionSplit(void *ctx, const xmlChar *target,
28393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const xmlChar *data)
28394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->processingInstruction != NULL))
28398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->processingInstruction(ctxt->user_data, target, data);
28399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcommentSplit(void *ctx, const xmlChar *value)
28403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->comment != NULL))
28407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->comment(ctxt->user_data, value);
28408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
28411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Varargs error callbacks to the user application, harder ...
28412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectwarningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->warning != NULL)) {
28419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecterrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->error != NULL)) {
28427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectfatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->fatalError != NULL)) {
28435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
28440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Those are function where both the user handler and the schemas handler
28441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to be called.
28442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcharactersSplit(void *ctx, const xmlChar *ch, int len)
28445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL))
28450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->characters(ctxt->user_data, ch, len);
28451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
28453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len)
28457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->ignorableWhitespace != NULL))
28463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len);
28464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
28466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcdataBlockSplit(void *ctx, const xmlChar *value, int len)
28470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
2847560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (ctxt->user_sax->cdataBlock != NULL))
2847660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->user_sax->cdataBlock(ctxt->user_data, value, len);
28477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len);
28479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectreferenceSplit(void *ctx, const xmlChar *name)
28483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->reference != NULL))
28489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->reference(ctxt->user_data, name);
28490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaSAXHandleReference(ctxt->user_data, name);
28492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2849560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottstartElementNsSplit(void *ctx, const xmlChar * localname,
2849660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    const xmlChar * prefix, const xmlChar * URI,
2849760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    int nb_namespaces, const xmlChar ** namespaces,
2849860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    int nb_attributes, int nb_defaulted,
28499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar ** attributes) {
28500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->startElementNs != NULL))
28505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix,
28506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               URI, nb_namespaces, namespaces,
28507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       nb_attributes, nb_defaulted,
28508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       attributes);
28509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix,
28511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                 URI, nb_namespaces, namespaces,
28512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 nb_attributes, nb_defaulted,
28513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 attributes);
28514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2851760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottendElementNsSplit(void *ctx, const xmlChar * localname,
28518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar * prefix, const xmlChar * URI) {
28519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->endElementNs != NULL))
28524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI);
28525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI);
28527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSAXPlug:
28531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax:  a pointer to the original xmlSAXHandlerPtr
28533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data:  a pointer to the original SAX user data pointer
28534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Plug a SAX based validation layer in a SAX parsing event flow.
28536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The original @saxptr and @dataptr data are replaced by new pointers
28537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but the calls to the original will be maintained.
28538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to a data structure needed to unplug the validation layer
28540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         or NULL in case of errors.
28541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXPlugPtr
28543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
28544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlSAXHandlerPtr *sax, void **user_data)
28545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ret;
28547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr old_sax;
28548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL))
28550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We only allow to plug into SAX2 event streams
28554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_sax = *sax;
28556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC))
28557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
2855860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((old_sax != NULL) &&
28559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) &&
28560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((old_sax->startElement != NULL) || (old_sax->endElement != NULL)))
28561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * everything seems right allocate the local data needed for that layer
28565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct));
28567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
28568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct));
28571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->magic = XML_SAX_PLUG_MAGIC;
28572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schemas_sax.initialized = XML_SAX2_MAGIC;
28573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->ctxt = ctxt;
28574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user_sax_ptr = sax;
28575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user_sax = old_sax;
2857660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (old_sax == NULL) {
28577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
28578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * go direct, no need for the split block and functions.
28579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
28581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
28582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Note that we use the same text-function for both, to prevent
28584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * the parser from testing for ignorable whitespace.
28585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
28587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.characters = xmlSchemaSAXHandleText;
28588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
28590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
28591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data = ctxt;
28593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = ctxt;
28594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       /*
28596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        * for each callback unused by Schemas initialize it to the Split
2859760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* routine only if non NULL in the user block, this can speed up
28598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* things at the SAX level.
28599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->internalSubset != NULL)
28601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.internalSubset = internalSubsetSplit;
28602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->isStandalone != NULL)
28603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.isStandalone = isStandaloneSplit;
28604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->hasInternalSubset != NULL)
28605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
28606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->hasExternalSubset != NULL)
28607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
28608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->resolveEntity != NULL)
28609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.resolveEntity = resolveEntitySplit;
28610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->getEntity != NULL)
28611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.getEntity = getEntitySplit;
28612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->entityDecl != NULL)
28613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.entityDecl = entityDeclSplit;
28614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->notationDecl != NULL)
28615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.notationDecl = notationDeclSplit;
28616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->attributeDecl != NULL)
28617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.attributeDecl = attributeDeclSplit;
28618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->elementDecl != NULL)
28619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.elementDecl = elementDeclSplit;
28620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->unparsedEntityDecl != NULL)
28621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
28622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->setDocumentLocator != NULL)
28623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
28624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->startDocument != NULL)
28625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.startDocument = startDocumentSplit;
28626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->endDocument != NULL)
28627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.endDocument = endDocumentSplit;
28628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->processingInstruction != NULL)
28629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.processingInstruction = processingInstructionSplit;
28630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->comment != NULL)
28631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.comment = commentSplit;
28632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->warning != NULL)
28633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.warning = warningSplit;
28634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->error != NULL)
28635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.error = errorSplit;
28636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->fatalError != NULL)
28637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.fatalError = fatalErrorSplit;
28638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->getParameterEntity != NULL)
28639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
28640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->externalSubset != NULL)
28641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.externalSubset = externalSubsetSplit;
28642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * the 6 schemas callback have to go to the splitter functions
28645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Note that we use the same text-function for ignorableWhitespace
28646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * if possible, to prevent the parser from testing for ignorable
28647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * whitespace.
28648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.characters = charactersSplit;
28650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((old_sax->ignorableWhitespace != NULL) &&
28651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (old_sax->ignorableWhitespace != old_sax->characters))
28652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
28653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
28654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->schemas_sax.ignorableWhitespace = charactersSplit;
28655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.cdataBlock = cdataBlockSplit;
28656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.reference = referenceSplit;
28657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.startElementNs = startElementNsSplit;
28658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.endElementNs = endElementNsSplit;
28659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data_ptr = user_data;
28661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data = *user_data;
28662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = ret;
28663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * plug the pointers back.
28667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *sax = &(ret->schemas_sax);
28669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = *sax;
28670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPreRun(ctxt);
28672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
28673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSAXUnplug:
28677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @plug:  a data structure returned by xmlSchemaSAXPlug
28678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unplug a SAX based validation layer in a SAX parsing event flow.
28680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The original pointers used in the call are restored.
28681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of failure.
28683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
28686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr *sax;
28688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **user_data;
28689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
28691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
28692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    plug->magic = 0;
28693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPostRun(plug->ctxt);
28695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* restore the data */
28696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sax = plug->user_sax_ptr;
28697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *sax = plug->user_sax;
28698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug->user_sax != NULL) {
28699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	user_data = plug->user_data_ptr;
28700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = plug->user_data;
28701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* free and return */
28704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(plug);
28705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2870994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlSchemaValidateSetLocator:
2871094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @vctxt: a schema validation context
2871194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @f: the locator function pointer
2871294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @ctxt: the locator context
2871394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
2871494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Allows to set a locator function to the validation context,
2871594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * which will be used to provide file and line information since
2871694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * those are not provided as part of the SAX validation flow
2871794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Setting @f to NULL disable the locator.
2871894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */
2871994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2872094442ad4107000e6d49f9b85a46a591495a57632Selim Gurunvoid
2872194442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchemaValidateSetLocator(xmlSchemaValidCtxtPtr vctxt,
2872294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                            xmlSchemaValidityLocatorFunc f,
2872394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			    void *ctxt)
2872494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun{
2872594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (vctxt == NULL) return;
2872694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    vctxt->locFunc = f;
2872794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    vctxt->locCtxt = ctxt;
2872894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun}
2872994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2873094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun/**
2873194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlSchemaValidateStreamLocator:
2873294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @ctx: the xmlTextReaderPtr used
2873394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @file: returned file information
2873494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @line: returned line information
2873594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
2873694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Internal locator function for the readers
2873794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
2873894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Returns 0 in case the Schema validation could be (des)activated and
2873994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *         -1 in case of error.
2874094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */
2874194442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic int
2874294442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchemaValidateStreamLocator(void *ctx, const char **file,
2874394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                               unsigned long *line) {
2874494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlParserCtxtPtr ctxt;
2874594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2874694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if ((ctx == NULL) || ((file == NULL) && (line == NULL)))
2874794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return(-1);
2874894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2874994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (file != NULL)
2875094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        *file = NULL;
2875194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (line != NULL)
2875294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        *line = 0;
2875394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2875494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    ctxt = (xmlParserCtxtPtr) ctx;
2875594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (ctxt->input != NULL) {
2875694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun       if (file != NULL)
2875794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun           *file = ctxt->input->filename;
2875894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun       if (line != NULL)
2875994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun           *line = ctxt->input->line;
2876094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun       return(0);
2876194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
2876294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    return(-1);
2876394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun}
2876494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
2876594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun/**
28766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateStream:
28767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input:  the input to use for reading the data
28769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  an optional encoding information
28770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax:  a SAX handler for the resulting events
28771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data:  the context to provide to the SAX handler.
28772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an input based on a flow of SAX event from the parser
28774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and forward the events to the @sax handler with the provided @user_data
28775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the user provided @sax handler must be a SAX2 one.
28776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is schemas valid, a positive error code
28778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
28779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
28782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlParserInputBufferPtr input, xmlCharEncoding enc,
28783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSAXHandlerPtr sax, void *user_data)
28784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr plug = NULL;
28786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr old_sax = NULL;
28787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserCtxtPtr pctxt = NULL;
28788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputPtr inputStream = NULL;
28789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
28790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (input == NULL))
28792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prepare the parser
28796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlNewParserCtxt();
28798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
28799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_sax = pctxt->sax;
28801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->sax = sax;
28802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->userData = user_data;
28803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
28804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (options)
28805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlCtxtUseOptions(pctxt, options);
28806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2880760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    pctxt->linenumbers = 1;
2880894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlSchemaValidateSetLocator(ctxt, xmlSchemaValidateStreamLocator, pctxt);
28809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inputStream = xmlNewIOInputStream(pctxt, input, enc);;
28811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inputStream == NULL) {
28812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
28813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto done;
28814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inputPush(pctxt, inputStream);
28816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->parserCtxt = pctxt;
28817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = input;
28818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Plug the validation and launch the parsing
28821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData));
28823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug == NULL) {
28824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
28825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto done;
28826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = input;
28828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->enc = enc;
28829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = pctxt->sax;
28830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaVStart(ctxt);
28832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
28834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ctxt->parserCtxt->errNo;
28835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0)
28836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 1;
2883760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
28838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
28840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->parserCtxt = NULL;
28841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = NULL;
28842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = NULL;
28843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug != NULL) {
28844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaSAXUnplug(plug);
28845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* cleanup */
28847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt != NULL) {
28848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->sax = old_sax;
28849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeParserCtxt(pctxt);
28850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateFile:
28856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context
28857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the URI of the instance
28858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a future set of options, currently unused
28859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do a schemas validation of the given resource, it will use the
28861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX streamable validation internally.
28862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code
28864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of an internal or API error.
28865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
28868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const char * filename,
28869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      int options ATTRIBUTE_UNUSED)
28870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
28872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr input;
28873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (filename == NULL))
28875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2887660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    input = xmlParserInputBufferCreateFilename(filename,
28878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_CHAR_ENCODING_NONE);
28879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (input == NULL)
28880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE,
2888260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	NULL, NULL);
28883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2888660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/**
2888760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaValidCtxtGetParserCtxt:
2888860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a schema validation context
2888960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2889060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * allow access to the parser context of the schema validation context
2889160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2889260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Returns the parser context of the schema validation context or NULL
2889360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *         in case of error.
2889460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
2889560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlParserCtxtPtr
2889660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
2889760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2889860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt == NULL)
2889960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(NULL);
2890060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    return (ctxt->parserCtxt);
2890160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott}
2890260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlschemas
28904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
28905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */
28906