15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * schemas.c : implementation of the XML Schema handling and
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             schema validity checking
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel Veillard <veillard@redhat.com>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - when types are redefined in includes, check that all
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     types in the redef list are equal
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -> need a type equality operation.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - if we don't intend to use the schema for schemas, we
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     need to validate all schema attributes (ref, type, name)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     against their types.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Eliminate item creation for: ??
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URGENT TODO:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - For xsi-driven schema acquisition, augment the IDCs after every
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     acquisition episode (xmlSchemaAugmentIDC).
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTES:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Elimated item creation for: <restriction>, <extension>,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     <simpleContent>, <complexContent>, <list>, <union>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROBLEMS:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     IDC XPath expression and chameleon includes: the targetNamespace is changed, so
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     XPath will have trouble to resolve to this namespace, since not known.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * CONSTRAINTS:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   All Group Limited (cos-all-limited)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Status: complete
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   (1.2)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     In xmlSchemaGroupDefReferenceTermFixup() and
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   (2)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     In xmlSchemaParseModelGroup()
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     TODO: Actually this should go to component-level checks,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     but is done here due to performance. Move it to an other layer
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     is schema construction via an API is implemented.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h>
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemas.h>
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/schemasInternals.h>
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemastypes.h>
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlautomata.h>
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlregexp.h>
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/dict.h>
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/encoding.h>
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlIO.h>
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/pattern.h>
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlreader.h>
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG 1 */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_CONTENT 1 */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_TYPE 1 */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_CONTENT_REGEXP 1 */
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_AUTOMATA 1 */
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_IDC */
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_IDC_NODE_TABLE */
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define WXS_ELEM_DECL_CONS_ENABLED */
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifndef DEBUG_IDC_NODE_TABLE
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define DEBUG_IDC_NODE_TABLE
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define ENABLE_PARTICLE_RESTRICTION 1 */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENABLE_REDEFINE
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define ENABLE_NAMED_LOCALS */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define ENABLE_IDC_NODE_TABLES_TEST */
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DUMP_CONTENT_MODEL
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define XML_SCHEMA_READER_ENABLED */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNBOUNDED (1 << 30)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TODO 								\
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,				\
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Unimplemented block at %s:%d\n",				\
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            __FILE__, __LINE__);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The XML Schemas namespaces
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *xmlSchemaNs = (const xmlChar *)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.w3.org/2001/XMLSchema";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *xmlSchemaInstanceNs = (const xmlChar *)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.w3.org/2001/XMLSchema-instance";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *xmlNamespaceNs = (const xmlChar *)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.w3.org/2000/xmlns/";
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Come casting macros.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PCTXT_CAST (xmlSchemaParserCtxtPtr)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VCTXT_CAST (xmlSchemaValidCtxtPtr)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_PTC_CAST (xmlSchemaParticlePtr)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_CAST (xmlSchemaTypePtr)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ELEM_CAST (xmlSchemaElementPtr)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_CAST (xmlSchemaAttributePtr)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IDC_CAST (xmlSchemaIDCPtr)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_LIST_CAST (xmlSchemaItemListPtr)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros to query common properties of components.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for element declarations.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ELEM_TYPEDEF(e) (e)->subtypes
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_SUBST_HEAD(item) (item)->refDecl
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for attribute declarations.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_TYPEDEF(a) (a)->subtypes
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for attribute uses.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for attribute groups.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for particles.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_PARTICLE(p) WXS_PTC_CAST (p)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for model groups definitions.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for model groups.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_MODEL_GROUP(i) \
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ((i)->type == XML_SCHEMA_TYPE_ALL))
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for schema buckets.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((t) == XML_SCHEMA_SCHEMA_IMPORT))
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for complex/simple types.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_ANYTYPE(i) \
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_COMPLEX(i) \
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_SIMPLE(item) \
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ((item->type == XML_SCHEMA_TYPE_BASIC) && \
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (item->builtInType != XML_SCHEMAS_ANYTYPE)))
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_ANY_SIMPLE_TYPE(i) \
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_RESTRICTION(t) \
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_EXTENSION(t) \
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_TYPE_NOT_FIXED(i) \
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_TYPE_NOT_FIXED_1(item) \
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for exclusively for complex types.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_HAS_COMPLEX_CONTENT(item) \
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_HAS_SIMPLE_CONTENT(item) \
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (item->contentType == XML_SCHEMA_CONTENT_BASIC))
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_HAS_MIXED_CONTENT(item) \
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (item->contentType == XML_SCHEMA_CONTENT_MIXED)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_EMPTIABLE(t) \
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Macros for exclusively for simple types.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_LIST_ITEMTYPE(t) (t)->subtypes
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Misc parser context macros.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_HAS_BUCKETS(ctx) \
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_SCHEMA(ctx) (ctx)->schema
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ADD_LOCAL(ctx, item) \
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ADD_GLOBAL(ctx, item) \
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ADD_PENDING(ctx, item) \
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSchemaItemList macros.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Misc macros.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_SCHEMA(node, type) \
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ((node != NULL) && (node->ns != NULL) && \
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (xmlStrEqual(node->name, (const xmlChar *) type)) && \
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (xmlStrEqual(node->ns->href, xmlSchemaNs)))
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Since we put the default/fixed values into the dict, we can
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* use pointer comparison for those values.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* REMOVED: (xmlStrEqual((v1), (v2)))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HFAILURE if (res == -1) goto exit_failure;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HERROR if (res != 0) goto exit_error;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HSTOP(ctx) if ((ctx)->stop) goto exit;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Some flags used for various schema constraints.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUBSET_RESTRICTION  1<<0
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUBSET_EXTENSION    1<<1
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUBSET_SUBSTITUTION 1<<2
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUBSET_LIST         1<<3
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUBSET_UNION        1<<4
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaItemList xmlSchemaItemList;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaItemList *xmlSchemaItemListPtr;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaItemList {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void **items;  /* used for dynamic addition of schemata */
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbItems; /* used for dynamic addition of schemata */
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeItems; /* used for dynamic addition of schemata */
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_CTXT_PARSER 1
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_CTXT_VALIDATOR 2
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaAbstractCtxt {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaBucket xmlSchemaBucket;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaBucket *xmlSchemaBucketPtr;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_SCHEMA_MAIN 0
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_SCHEMA_IMPORT 1
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_SCHEMA_INCLUDE 2
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_SCHEMA_REDEFINE 3
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSchemaRelation:
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to create a graph of schema relationships.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaSchemaRelation {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr next;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *importNamespace;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_BUCKET_MARKED 1<<0
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaBucket {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *schemaLocation;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *origTargetNamespace;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr relations;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int located;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parsed;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int imported;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int preserveDoc;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr globals; /* Global components. */
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr locals; /* Local components. */
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaImport:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (extends xmlSchemaBucket)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reflects a schema. Holds some information
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * about the schema and its toplevel components. Duplicate
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * toplevel components are not checked at this level.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaImport xmlSchemaImport;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaImport *xmlSchemaImportPtr;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaImport {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type; /* Main OR import OR include. */
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *schemaLocation; /* The URI of the schema document. */
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* For chameleon includes, @origTargetNamespace will be NULL */
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *origTargetNamespace;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For chameleon includes, @targetNamespace will be the
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * targetNamespace of the including schema.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc; /* The schema node-tree. */
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* @relations will hold any included/imported/redefined schemas. */
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr relations;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int located;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parsed;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int imported;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int preserveDoc;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr globals;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr locals;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The imported schema. */
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr schema;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* (extends xmlSchemaBucket)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaInclude xmlSchemaInclude;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaInclude *xmlSchemaIncludePtr;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaInclude {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *schemaLocation;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *origTargetNamespace;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr relations;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int located;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parsed;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int imported;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int preserveDoc;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr globals; /* Global components. */
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr locals; /* Local components. */
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The owning main or import schema bucket. */
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaImportPtr ownerImport;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBasicItem:
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The abstract base type for schema components.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaBasicItem {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAnnotItem:
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The abstract base type for annotated schema components.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaBasicItem)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaAnnotItem {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaTreeItem:
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The abstract base type for tree-like structured schema components.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaAnnotItem)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaTreeItem {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr next;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr children;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_USE_FIXED 1<<0
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAttributeUsePtr:
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The abstract base type for tree-like structured schema components.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaTreeItem)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaAttributeUse {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr next; /* The next attr. use. */
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The attr. decl. OR a QName-ref. to an attr. decl. OR
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a QName-ref. to an attribute group definition.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr attrDecl;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int occurs; /* required, optional */
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar * defValue;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr defVal;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAttributeUseProhibPtr:
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A helper component to reflect attribute prohibitions.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaBasicItem)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaAttributeUseProhib {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isRef;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaRedef:
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaRedef xmlSchemaRedef;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaRedef *xmlSchemaRedefPtr;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaRedef {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr next;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr item; /* The redefining component. */
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr reference; /* The referencing component. */
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *refName; /* The name of the to-be-redefined component. */
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *refTargetNs; /* The target namespace of the
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   to-be-redefined comp. */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr targetBucket; /* The redefined schema. */
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaConstructionCtxt:
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaConstructionCtxt {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr mainSchema; /* The main schema. */
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr mainBucket; /* The main schema bucket */
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr buckets; /* List of schema buckets. */
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket; /* The current schema bucket */
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr pending; /* All Components of all schemas that
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     need to be fixed. */
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashTablePtr substGroups;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr redefs;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr lastRedef;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_PARSE_ERROR		1
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaParserCtxt {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *errCtxt;             /* user specific error context */
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidityWarningFunc warning;       /* the callback in case of warning */
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nberrors;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc serror;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaConstructionCtxtPtr constructor;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ownsConstructor; /* TODO: Move this to parser *flags*. */
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlSchemaPtr topschema;	*/
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlHashTablePtr namespaces;  */
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr schema;        /* The main schema in use */
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int counter;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *URL;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int preserve;		/* Whether the doc should be freed  */
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *buffer;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Used to build complex element content models
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataPtr am;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataStatePtr start;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataStatePtr end;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataStatePtr state;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;		/* dictionnary for interned string names */
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int options;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isS4S;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isRedefine;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int xsiAssemble;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int stop; /* If the parser should stop; i.e. a critical error. */
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr redefined; /* The schema to be redefined. */
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr redef; /* Used for redefinitions. */
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int redefCounter; /* Used for redefinitions. */
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr attrProhibs;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaQNameRef:
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A component reference item (not a schema component)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaBasicItem)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaQNameRef {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr item; /* The resolved referenced item. */
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType itemType;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParticle:
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A particle component.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaTreeItem)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaParticle xmlSchemaParticle;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaParticle *xmlSchemaParticlePtr;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaParticle {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr next; /* next particle */
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference),
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        etc.) */
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int minOccurs;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int maxOccurs;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaModelGroup:
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A model group component.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaTreeItem)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaModelGroup {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr next; /* not used */
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaModelGroupDef:
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A model group definition component.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaTreeItem)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaModelGroupDef {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr next; /* not used */
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr children; /* the "model group" */
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaIDC xmlSchemaIDC;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaIDC *xmlSchemaIDCPtr;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCSelect:
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The identity-constraint "field" and "selector" item, holding the
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XPath expression.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaIDCSelect {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr next;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr idc;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index; /* an index position if significant for IDC key-sequences */
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *xpath; /* the XPath expression */
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *xpathComp; /* the compiled XPath expression */
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDC:
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The identity-constraint definition component.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Extends xmlSchemaAnnotItem)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaIDC {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType type;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr next;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr selector;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr fields;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbFields;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ref;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCAug:
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The augmented IDC information used for validation.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaIDCAug {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr next; /* next in a list */
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr def; /* the IDC definition */
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int keyrefDepth; /* the lowest tree level to which IDC
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tables need to be bubbled upwards */
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPSVIIDCKeySequence:
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The key sequence of a node table item.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaPSVIIDCKey {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr val;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPSVIIDCNode:
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The node table item of a node table.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaPSVIIDCNode {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr *keys;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeLine;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeQNameID;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPSVIIDCBinding:
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The identity-constraint binding item of the [identity-constraint table].
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaPSVIIDCBinding {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr definition; /* the IDC definition */
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbNodes; /* number of entries in the node table */
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeNodes; /* size of the node table */
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr dupls;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XPATH_STATE_OBJ_MATCHES -2
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XPATH_STATE_OBJ_BLOCKED -3
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCStateObj:
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The state object used to evaluate XPath expressions.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaIDCStateObj {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr next; /* next if in a list */
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth; /* depth of creation */
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *history; /* list of (depth, state-id) tuples */
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbHistory;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeHistory;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       matcher */
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr sel;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *xpathCtxt;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IDC_MATCHER 0
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCMatcher:
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to evaluate IDC selectors (and fields).
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaIDCMatcher {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth; /* the tree depth at creation time */
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr next; /* next in the list */
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int idcType;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         elements */
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeKeySeqs;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr targets; /* list of target-node
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     (xmlSchemaPSVIIDCNodePtr) entries */
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Element info flags.
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES  1<<0
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_NILLED	       1<<2
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE	       1<<3
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED      1<<4
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_EMPTY             1<<5
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT       1<<6
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT  1<<7
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT  1<<8
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED  1<<9
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE  1<<10
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNodeInfo:
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Holds information of an element node.
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaNodeInfo {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeType;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeLine;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *localName;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nsName;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr val; /* the pre-computed value if any */
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags; /* combination of node info flags */
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int valNeeded;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int normVal;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr decl; /* the element/attribute declaration */
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            for the scope element*/
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           element */
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegExecCtxtPtr regexCtxt;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar **nsBindings; /* Namespace bindings on this element */
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbNsBindings;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeNsBindings;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int hasKeyrefs;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int appliedXPath; /* Indicates that an XPath has been applied. */
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_UNKNOWN 1
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ASSESSED 2
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_PROHIBITED 3
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_MISSING 4
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_INVALID_VALUE 5
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_DEFAULT 8
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_WILD_SKIP 13
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMAS_ATTR_META 17
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @metaType values of xmlSchemaAttrInfo.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaAttrInfo {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeType;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeLine;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *localName;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nsName;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr val; /* the pre-computed value if any */
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags; /* combination of node info flags */
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr decl; /* the attribute declaration */
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr use;  /* the attribute use */
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int state;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int metaType;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *vcValue; /* the value constraint value */
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr parent;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidCtxt:
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A Schemas validation context
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaValidCtxt {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *errCtxt;             /* user specific data block */
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc serror;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr schema;        /* The schema in use */
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr input;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncoding enc;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr sax;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr parserCtxt;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *user_data; /* TODO: What is this for? */
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nberrors;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlSchemaTypePtr type; */
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegExecCtxtPtr regexp;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr value;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int valueWS;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int options;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr validationRoot;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr pctxt;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int xsiAssemble;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeElemInfos;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr inode; /* the current element information */
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbIdcNodes;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeIdcNodes;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbIdcKeys;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeIdcKeys;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlTextReaderPtr reader;
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr *attrInfos;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbAttrInfos;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeAttrInfos;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int skipDepth;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr nodeQNames;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int hasKeyrefs;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int createIDCNodeTables;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int psviExposeIDCNodeTables;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSubstGroup:
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaSubstGroup {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr head;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr members;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Some predeclarations				*
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 xmlSchemaPtr schema,
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 xmlNodePtr node);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 xmlSchemaPtr schema,
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 xmlNodePtr node);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeFixup(xmlSchemaTypePtr type,
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   xmlSchemaAbstractCtxtPtr ctxt);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFacetTypeToString(xmlSchemaTypeType type);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     xmlNodePtr node);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlSchemaParserCtxtPtr ctxt);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWhitespaceValueType
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type);
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTreeItemPtr
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr node, xmlSchemaTypeType type,
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int withParticle);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item);
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypeLinkPtr
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *funcName,
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *message);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr baseType,
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int subset);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaParserCtxtPtr ctxt);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaComponentListFree(xmlSchemaItemListPtr list);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaQNameRefPtr
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaPtr schema,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlNodePtr node);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Helper functions			        *
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaItemTypeToStr:
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type of the schema item
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the component name of a schema item.
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemTypeToStr(xmlSchemaTypeType type)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_BASIC:
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "simple type definition");
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "simple type definition");
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "complex type definition");
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "element declaration");
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "attribute use");
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "attribute declaration");
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "model group definition");
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "attribute group definition");
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION:
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "notation declaration");
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SEQUENCE:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "model group (sequence)");
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_CHOICE:
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "model group (choice)");
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ALL:
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "model group (all)");
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_PARTICLE:
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "particle");
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "unique identity-constraint");
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* return(BAD_CAST "IDC (unique)"); */
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "key identity-constraint");
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* return(BAD_CAST "IDC (key)"); */
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "keyref identity-constraint");
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* return(BAD_CAST "IDC (keyref)"); */
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY:
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "wildcard (any)");
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_EXTRA_QNAMEREF:
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "[helper component] QName reference");
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "[helper component] attribute use prohibition");
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(BAD_CAST "Not a schema component");
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetComponentTypeStr:
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type of the schema item
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the component name of a schema item.
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_BASIC:
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_COMPLEX(WXS_TYPE_CAST item))
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(BAD_CAST "complex type definition");
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(BAD_CAST "simple type definition");
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlSchemaItemTypeToStr(item->type));
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetComponentNode:
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: a schema component
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns node associated with the schema component.
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that such a node need not be available; plus, a component's
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * node need not to reflect the component directly, since there is no
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * one-to-one relationship between the XML Schema representation and
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the component representation.
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaElementPtr) item)->node);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributePtr) item)->node);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaTypePtr) item)->node);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY:
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaWildcardPtr) item)->node);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_PARTICLE:
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaParticlePtr) item)->node);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SEQUENCE:
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_CHOICE:
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ALL:
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaModelGroupPtr) item)->node);
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaModelGroupDefPtr) item)->node);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributeGroupPtr) item)->node);
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaIDCPtr) item)->node);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_EXTRA_QNAMEREF:
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(((xmlSchemaQNameRefPtr) item)->node);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: What to do with NOTATIONs?
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION:
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaNotationPtr) item)->node);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributeUsePtr) item)->node);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetNextComponent:
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: a schema component
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the next sibling of the schema component.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY:
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_PARTICLE:
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SEQUENCE:
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_CHOICE:
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ALL:
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFormatQName:
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: the string buffer
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespaceName:  the namespace name
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @localName: the local name
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the given QName in the format "{namespaceName}localName" or
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * just "localName" if @namespaceName is NULL.
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the localName if @namespaceName is NULL, a formatted
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string otherwise.
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar*
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatQName(xmlChar **buf,
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *namespaceName,
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *localName)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(*buf)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (namespaceName != NULL) {
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrdup(BAD_CAST "{");
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, namespaceName);
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST "}");
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (localName != NULL) {
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (namespaceName == NULL)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(localName);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, localName);
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST "(NULL)");
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ((const xmlChar *) *buf);
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar*
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns != NULL)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaFormatQName(buf, ns->href, localName));
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaFormatQName(buf, NULL, localName));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaElementPtr) item)->name);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributePtr) item)->name);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributeGroupPtr) item)->name);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_BASIC:
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaTypePtr) item)->name);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaModelGroupDefPtr) item)->name);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaIDCPtr) item)->name);
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_ATTRUSE_DECL(item) != NULL) {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(xmlSchemaGetComponentName(
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_EXTRA_QNAMEREF:
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaQNameRefPtr) item)->name);
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION:
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaNotationPtr) item)->name);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Other components cannot have names.
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetQNameRefName(void *ref)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(((xmlSchemaQNameRefPtr) ref)->name);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetQNameRefTargetNs(void *ref)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(((xmlSchemaQNameRefPtr) ref)->targetNamespace);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaElementPtr) item)->targetNamespace);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributePtr) item)->targetNamespace);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_BASIC:
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (BAD_CAST "http://www.w3.org/2001/XMLSchema");
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaTypePtr) item)->targetNamespace);
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaIDCPtr) item)->targetNamespace);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_ATTRUSE_DECL(item) != NULL) {
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(xmlSchemaGetComponentTargetNs(
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: Will returning NULL break something? */
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_EXTRA_QNAMEREF:
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaQNameRefPtr) item)->targetNamespace);
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION:
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (((xmlSchemaNotationPtr) item)->targetNamespace);
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Other components cannot have names.
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar*
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentQName(xmlChar **buf,
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   void *item)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaFormatQName(buf,
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item),
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item)));
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar*
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetComponentDesignation(xmlChar **buf, void *item)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrcat(*buf, BAD_CAST " '");
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str,
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaBasicItemPtr) item));
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrcat(*buf, BAD_CAST "'");
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str);
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*buf);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar*
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaGetComponentDesignation(buf, idc));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaWildcardPCToString:
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pc: the type of processContents
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string representation of the type of
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * processContents.
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaWildcardPCToString(int pc)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (pc) {
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_ANY_SKIP:
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (BAD_CAST "skip");
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_ANY_LAX:
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (BAD_CAST "lax");
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_ANY_STRICT:
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (BAD_CAST "strict");
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (BAD_CAST "invalid process contents");
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetCanonValueWhtspExt:
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val: the precomputed value
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @retValue: the returned value
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ws: the whitespace type of the value
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get a the cononical representation of the value.
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The caller has to free the returned retValue.
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value could be built and -1 in case of
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         API errors or if the value type is not supported yet.
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val,
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaWhitespaceValueType ws,
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlChar **retValue)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int list;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValType valType;
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value, *value2 = NULL;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((retValue == NULL) || (val == NULL))
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = xmlSchemaValueGetNext(val) ? 1 : 0;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *retValue = NULL;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	value = NULL;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	valType = xmlSchemaGetValType(val);
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (valType) {
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_STRING:
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_NORMSTRING:
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ANYSIMPLETYPE:
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value = xmlSchemaValueGetAsString(val);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (value != NULL) {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value2 = xmlSchemaCollapseString(value);
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value2 = xmlSchemaWhiteSpaceReplace(value);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (value2 != NULL)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value = value2;
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaGetCanonValue(val, &value2) == -1) {
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (value2 != NULL)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree((xmlChar *) value2);
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value = value2;
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*retValue == NULL)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (value == NULL) {
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! list)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *retValue = xmlStrdup(BAD_CAST "");
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*retValue = xmlStrdup(value);
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (value != NULL) {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* List. */
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " ");
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *retValue = xmlStrcat((xmlChar *) *retValue, value);
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(value2)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlSchemaValueGetNext(val);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (val != NULL);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*retValue != NULL)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree((xmlChar *) (*retValue));
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value2 != NULL)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree((xmlChar *) value2);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFormatItemForReport:
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: the string buffer
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemDes: the designation of the item
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemName: the name of the item
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the item as an object
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemNode: the node of the item
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @local: the local name
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parsing: if the function is used during the parse
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a representation of the given item used
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for error reports.
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The following order is used to build the resulting
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * designation if the arguments are not NULL:
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1a. If itemDes not NULL -> itemDes
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1b. If (itemDes not NULL) and (itemName not NULL)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -> itemDes + itemName
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. If the preceding was NULL and (item not NULL) -> item
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the itemNode is an attribute node, the name of the attribute
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be appended to the result.
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the formatted string and sets @buf to the resulting value.
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar*
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatItemForReport(xmlChar **buf,
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *itemDes,
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaBasicItemPtr item,
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr itemNode)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int named = 1;
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*buf != NULL) {
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(*buf);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = NULL;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itemDes != NULL) {
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrdup(itemDes);
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (item != NULL) {
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_BASIC: {
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_ATOMIC(type))
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "atomic type 'xs:");
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_LIST(type))
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "list type 'xs:");
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_UNION(type))
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "union type 'xs:");
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "simple type 'xs:");
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, type->name);
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "'");
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE: {
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST"");
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "local ");
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_ATOMIC(type))
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "atomic type");
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_LIST(type))
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "list type");
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_UNION(type))
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "union type");
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "simple type");
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, type->name);
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "'");
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX: {
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "");
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "local ");
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "complex type");
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, type->name);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "'");
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaAttributeUsePtr ause;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ause = WXS_ATTR_USE_CAST item;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "attribute use ");
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_ATTRUSE_DECL(ause) != NULL) {
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *buf = xmlStrcat(*buf, BAD_CAST "'");
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *buf = xmlStrcat(*buf,
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause)));
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*buf = xmlStrcat(*buf, BAD_CAST "'");
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *buf = xmlStrcat(*buf, BAD_CAST "(unknown)");
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE: {
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaAttributePtr attr;
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = (xmlSchemaAttributePtr) item;
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "attribute decl.");
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attr->targetNamespace, attr->name));
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *buf = xmlStrcat(*buf, BAD_CAST "'");
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetComponentDesignation(buf, item);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT: {
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaElementPtr elem;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elem = (xmlSchemaElementPtr) item;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "element decl.");
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    elem->targetNamespace, elem->name));
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "'");
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE:
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE)
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "unique '");
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (item->type == XML_SCHEMA_TYPE_IDC_KEY)
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "key '");
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "keyRef '");
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name);
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "'");
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY:
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrdup(xmlSchemaWildcardPCToString(
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((xmlSchemaWildcardPtr) item)->processContents));
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST " wildcard");
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MININCLUSIVE:
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MINEXCLUSIVE:
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXINCLUSIVE:
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_TOTALDIGITS:
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_FRACTIONDIGITS:
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_PATTERN:
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_ENUMERATION:
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_WHITESPACE:
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_LENGTH:
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXLENGTH:
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MINLENGTH:
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrdup(BAD_CAST "facet '");
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type));
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "'");
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP: {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "model group def.");
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "'");
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SEQUENCE:
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_CHOICE:
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ALL:
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_PARTICLE:
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION: {
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST " '");
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST "'");
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    named = 0;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	named = 0;
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((named == 0) && (itemNode != NULL)) {
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr elem;
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (itemNode->type == XML_ATTRIBUTE_NODE)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elem = itemNode->parent;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elem = itemNode;
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrdup(BAD_CAST "Element '");
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->ns != NULL) {
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf,
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str, elem->ns->href, elem->name));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, elem->name);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST "'");
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST ", attribute '");
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (itemNode->ns != NULL) {
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		itemNode->ns->href, itemNode->name));
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, itemNode->name);
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST "'");
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (*buf);
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFormatFacetEnumSet:
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: the string buffer
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type holding the enumeration facets
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Builds a string consisting of all enumeration elements.
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string of all enumeration elements.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlChar **buf, xmlSchemaTypePtr type)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetPtr facet;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWhitespaceValueType ws;
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *value = NULL;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, found = 0;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*buf != NULL)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(*buf);
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = NULL;
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Use the whitespace type of the base type.
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType);
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (facet = type->facets; facet != NULL; facet = facet->next) {
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 1;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaGetCanonValueWhtspExt(facet->val,
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ws, &value);
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaInternalErr(actxt,
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "xmlSchemaFormatFacetEnumSet",
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "compute the canonical lexical representation");
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*buf != NULL)
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(*buf);
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = NULL;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (NULL);
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*buf == NULL)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrdup(BAD_CAST "'");
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*buf = xmlStrcat(*buf, BAD_CAST ", '");
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST value);
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "'");
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (value != NULL) {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *)value);
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value = NULL;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The enumeration facet of a type restricts the enumeration
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* facet of the ancestor type; i.e., such restricted enumerations
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* do not belong to the set of the given type. Thus we break
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* on the first found enumeration.
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (found)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = type->baseType;
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC));
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ((const xmlChar *) *buf);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Error functions				        *
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaErrMemory(const char *msg)
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     msg);
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPSimpleErr(const char *msg)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     msg);
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPErrMemory:
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: a context node
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char *extra, xmlNodePtr node)
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->nberrors++;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL,
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     extra);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPErr:
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parsing context
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra data
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra data
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a parser error
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const char *msg, const xmlChar * str1, const xmlChar * str2)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericErrorFunc channel = NULL;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc schannel = NULL;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *data = NULL;
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->nberrors++;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->err = error;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        channel = ctxt->error;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data = ctxt->errCtxt;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schannel = ctxt->serror;
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    error, XML_ERR_ERROR, NULL, 0,
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (const char *) str1, (const char *) str2, NULL, 0, 0,
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    msg, str1, str2);
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPErr2:
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parsing context
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current child
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra data
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra data
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a parser error
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               xmlNodePtr child, int error,
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const char *msg, const xmlChar * str1, const xmlChar * str2)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL)
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr(ctxt, child, error, msg, str1, str2);
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr(ctxt, node, error, msg, str1, str2);
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPErrExt:
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parsing context
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @strData1: extra data
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @strData2: extra data
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @strData3: extra data
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the message
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1:  extra parameter for the message display
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2:  extra parameter for the message display
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str3:  extra parameter for the message display
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str4:  extra parameter for the message display
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str5:  extra parameter for the message display
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a parser error
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar * strData1, const xmlChar * strData2,
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar * strData3, const char *msg, const xmlChar * str1,
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar * str2, const xmlChar * str3, const xmlChar * str4,
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar * str5)
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericErrorFunc channel = NULL;
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc schannel = NULL;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *data = NULL;
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->nberrors++;
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->err = error;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        channel = ctxt->error;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data = ctxt->errCtxt;
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schannel = ctxt->serror;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    error, XML_ERR_ERROR, NULL, 0,
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (const char *) strData1, (const char *) strData2,
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const char *) strData3, 0, 0, msg, str1, str2,
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    str3, str4, str5);
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Allround error functions			*
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaVTypeErrMemory:
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: a context node
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char *extra, xmlNodePtr node)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->nberrors++;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->err = XML_SCHEMAV_INTERNAL;
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL,
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     extra);
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPSimpleInternalErr(xmlNodePtr node,
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const char *msg, const xmlChar *str)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node,
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 msg, (const char *) str);
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ERROR_TYPE_ERROR 1
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ERROR_TYPE_WARNING 2
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaErr3:
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra data
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra data
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str3: extra data
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a validation error
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlErrorLevel errorLevel,
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int error, xmlNodePtr node, int line, const char *msg,
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *str1, const xmlChar *str2,
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *str3, const xmlChar *str4)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc schannel = NULL;
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericErrorFunc channel = NULL;
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *data = NULL;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const char *file = NULL;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (errorLevel != XML_ERR_WARNING) {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->nberrors++;
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->err = error;
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		channel = vctxt->error;
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		channel = vctxt->warning;
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = vctxt->serror;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    data = vctxt->errCtxt;
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Error node. If we specify a line number, then
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * do not channel any node to the error function.
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (line == 0) {
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((node == NULL) &&
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->depth >= 0) &&
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->inode != NULL)) {
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = vctxt->inode->node;
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Get filename and line if no node-tree.
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((node == NULL) &&
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->parserCtxt != NULL) &&
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->parserCtxt->input != NULL)) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    file = vctxt->parserCtxt->input->filename;
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    line = vctxt->parserCtxt->input->line;
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Override the given node's (if any) position
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* and channel only the given line number.
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = NULL;
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Get filename.
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (vctxt->doc != NULL)
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    file = (const char *) vctxt->doc->URL;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if ((vctxt->parserCtxt != NULL) &&
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->parserCtxt->input != NULL))
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    file = vctxt->parserCtxt->input->filename;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    __xmlRaiseError(schannel, channel, data, ctxt,
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, XML_FROM_SCHEMASV,
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		error, errorLevel, file, line,
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(const char *) str1, (const char *) str2,
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (errorLevel != XML_ERR_WARNING) {
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pctxt->nberrors++;
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pctxt->err = error;
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		channel = pctxt->error;
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		channel = pctxt->warning;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = pctxt->serror;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    data = pctxt->errCtxt;
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    __xmlRaiseError(schannel, channel, data, ctxt,
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, XML_FROM_SCHEMASP, error,
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		errorLevel, NULL, 0,
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(const char *) str1, (const char *) str2,
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TODO
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaErr3:
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the validation context
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra data
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra data
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str3: extra data
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a validation error
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      int error, xmlNodePtr node, const char *msg,
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      const xmlChar *str1, const xmlChar *str2, const xmlChar *str3)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg, str1, str2, str3, NULL);
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      int error, xmlNodePtr node, const char *msg,
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      const xmlChar *str1, const xmlChar *str2,
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      const xmlChar *str3, const xmlChar *str4)
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg, str1, str2, str3, str4);
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     int error, xmlNodePtr node, const char *msg,
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     const xmlChar *str1, const xmlChar *str2)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL);
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatNodeForError(xmlChar ** msg,
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaAbstractCtxtPtr actxt,
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodePtr node)
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *msg = NULL;
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node != NULL) &&
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ELEMENT_NODE) &&
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ATTRIBUTE_NODE))
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Don't try to format other nodes than element and
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* attribute nodes.
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Play save and return an empty string.
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrdup(BAD_CAST "");
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(*msg);
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Work on tree nodes.
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ATTRIBUTE_NODE) {
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr elem = node->parent;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrdup(BAD_CAST "Element '");
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (elem->ns != NULL)
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    elem->ns->href, elem->name));
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, elem->name));
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrdup(BAD_CAST "Element '");
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->ns != NULL)
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node->ns->href, node->name));
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node->name));
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str);
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, BAD_CAST "': ");
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Work on node infos.
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaNodeInfoPtr ielem =
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->elemInfos[vctxt->depth];
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrdup(BAD_CAST "Element '");
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsName, ielem->localName));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *msg = xmlStrdup(BAD_CAST "Element '");
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->nsName, vctxt->inode->localName));
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str);
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, BAD_CAST "': ");
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Hmm, no node while parsing?
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Return an empty string, in case NULL will break something.
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrdup(BAD_CAST "");
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	TODO
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * VAL TODO: The output of the given schema component is currently
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * disabled.
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) {
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, BAD_CAST " [");
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str,
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, type, NULL, 0));
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*msg = xmlStrcat(*msg, BAD_CAST "]");
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (*msg);
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *funcName,
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *message,
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *str1,
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *str2)
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actxt == NULL)
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrdup(BAD_CAST "Internal error: ");
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST funcName);
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ", ");
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST message);
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL,
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (const char *) msg, str1, str2);
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL,
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (const char *) msg, str1, str2);
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *funcName,
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *message)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL);
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *funcName,
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *message,
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *str1,
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *str2)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message,
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str1, str2);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlParserErrors error,
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlNodePtr node,
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlSchemaBasicItemPtr item,
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const char *message,
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str1, const xmlChar *str2,
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str3, const xmlChar *str4)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) && (item != NULL) &&
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(actxt->type == XML_SCHEMA_CTXT_PARSER)) {
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = WXS_ITEM_NODE(item);
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatItemForReport(&msg, NULL, item, NULL);
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST ": ");
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatNodeForError(&msg, actxt, node);
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4(actxt, error, node,
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) msg, str1, str2, str3, str4);
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlParserErrors error,
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlNodePtr node,
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlSchemaBasicItemPtr item,
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const char *message,
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str1,
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str2)
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaCustomErr4(actxt, error, node, item,
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	message, str1, str2, NULL, NULL);
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlParserErrors error,
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlNodePtr node,
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const char *message,
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str1,
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str2,
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str3)
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, actxt, node);
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* URGENT TODO: Set the error code to something sane. */
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0,
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) msg, str1, str2, str3, NULL);
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlParserErrors error,
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlSchemaPSVIIDCNodePtr idcNode,
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const char *message,
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str1,
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *str2)
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL, *qname = NULL;
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrdup(BAD_CAST "Element '%s': ");
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR,
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	error, NULL, idcNode->nodeLine, (const char *) msg,
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatQName(&qname,
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->nodeQNames->items[idcNode->nodeQNameID]),
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str1, str2, NULL);
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(qname);
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg);
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlNodePtr node)
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL)
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (node->type);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(((xmlSchemaValidCtxtPtr) actxt)->inode != NULL))
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsGlobalItem(xmlSchemaTypePtr item)
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (item->type) {
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX:
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (item->flags & XML_SCHEMAS_TYPE_GLOBAL)
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(1);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( ((xmlSchemaElementPtr) item)->flags &
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_ELEM_GLOBAL)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(1);
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE:
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( ((xmlSchemaAttributePtr) item)->flags &
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_ATTR_GLOBAL)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(1);
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Note that attribute groups are always global. */
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlParserErrors error,
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlNodePtr node,
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar *value,
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaTypePtr type,
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       int displayValue)
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, actxt, node);
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_ATTRIBUTE_NODE))
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid "
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "value of ");
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! xmlSchemaIsGlobalItem(type))
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "the local ");
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "the ");
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_ATOMIC(type))
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "atomic type");
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (WXS_IS_LIST(type))
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "list type");
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (WXS_IS_UNION(type))
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "union type");
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaIsGlobalItem(type)) {
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *str = NULL;
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST " '");
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->builtInType != 0) {
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "xs:");
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, type->name);
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg,
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str,
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->targetNamespace, type->name));
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "'");
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str);
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_ATTRIBUTE_NODE))
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatErrorNodeQName(xmlChar ** str,
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaNodeInfoPtr ni,
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlNodePtr node)
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL) {
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->ns != NULL)
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlSchemaFormatQName(str, node->ns->href, node->name));
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlSchemaFormatQName(str, NULL, node->name));
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ni != NULL)
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaFormatQName(str, ni->nsName, ni->localName));
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlParserErrors error,
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaAttrInfoPtr ni,
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNodePtr node)
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL, *str = NULL;
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, actxt, node);
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n");
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr(actxt, error, node, (const char *) msg,
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node),
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL);
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str)
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlParserErrors error,
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlNodePtr node,
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const char *message,
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int nbval,
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int nbneg,
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar **values)
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL, *msg = NULL;
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *localName, *nsName;
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur, *end;
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, actxt, node);
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".");
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that is does not make sense to report that we have a
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * wildcard here, since the wildcard might be unfolded into
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * multiple transitions.
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nbval + nbneg > 0) {
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nbval + nbneg > 1) {
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str = xmlStrdup(BAD_CAST " Expected is one of ( ");
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str = xmlStrdup(BAD_CAST " Expected is ( ");
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsName = NULL;
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < nbval + nbneg; i++) {
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = values[i];
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == NULL)
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        continue;
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') &&
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (cur[3] == ' ')) {
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur += 4;
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		str = xmlStrcat(str, BAD_CAST "##other");
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Get the local name.
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    localName = NULL;
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*end == '*') {
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		localName = xmlStrdup(BAD_CAST "*");
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((*end != 0) && (*end != '|'))
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    end++;
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		localName = xmlStrncat(localName, BAD_CAST cur, end - cur);
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*end != 0) {
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Skip "*|*" if they come with negated expressions, since
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* they represent the same negated wildcard.
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((nbneg == 0) || (*end != '*') || (*localName != '*')) {
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Get the namespace name.
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = end;
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (*end == '*') {
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName = xmlStrdup(BAD_CAST "{*}");
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			while (*end != 0)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    end++;
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (i >= nbval)
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    nsName = xmlStrdup(BAD_CAST "{##other:");
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    nsName = xmlStrdup(BAD_CAST "{");
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur);
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName = xmlStrcat(nsName, BAD_CAST "}");
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    str = xmlStrcat(str, BAD_CAST nsName);
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(nsName)
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(localName);
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str = xmlStrcat(str, BAD_CAST localName);
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(localName);
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (i < nbval + nbneg -1)
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		str = xmlStrcat(str, BAD_CAST ", ");
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str = xmlStrcat(str, BAD_CAST " ).\n");
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST str);
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      msg = xmlStrcat(msg, BAD_CAST "\n");
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(msg);
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlParserErrors error,
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlNodePtr node,
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *value,
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  unsigned long length,
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaTypePtr type,
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaFacetPtr facet,
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const char *message,
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *str1,
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *str2)
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL, *msg = NULL;
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeType facetType;
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodeType = xmlSchemaEvalErrorNodeType(actxt, node);
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, actxt, node);
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) {
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facetType = XML_SCHEMA_FACET_ENUMERATION;
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If enumerations are validated, one must not expect the
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* facet to be given.
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facetType = facet->type;
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST "[");
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST "facet '");
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType));
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST "'] ");
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (message == NULL) {
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Use a default message.
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char len[25], actLen[25];
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* FIXME, TODO: What is the max expected string length of the
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * this value?
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nodeType == XML_ATTRIBUTE_NODE)
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; ");
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; ");
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet));
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(actLen, 24, "%lu", length);
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (facetType == XML_SCHEMA_FACET_LENGTH)
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg,
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "this differs from the allowed length of '%s'.\n");
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg,
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg,
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nodeType == XML_ATTRIBUTE_NODE)
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaErr3(actxt, error, node, (const char *) msg,
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    value, (const xmlChar *) actLen, (const xmlChar *) len);
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaErr(actxt, error, node, (const char *) msg,
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar *) actLen, (const xmlChar *) len);
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element "
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"of the set {%s}.\n");
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatFacetEnumSet(actxt, &str, type));
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_PATTERN) {
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted "
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"by the pattern '%s'.\n");
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the "
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"minimum value allowed ('%s').\n");
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the "
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"maximum value allowed ('%s').\n");
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than "
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"'%s'.\n");
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than "
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"'%s'.\n");
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more "
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"digits than are allowed ('%s').\n");
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional "
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"digits than are allowed ('%s').\n");
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->value);
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (nodeType == XML_ATTRIBUTE_NODE) {
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n");
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n");
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, (const xmlChar *) message);
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST ".\n");
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2);
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str)
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(msg);
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VERROR(err, type, msg) \
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPMissingAttrErr:
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of  the owner
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerName: the name of the owner
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem: the owner as an element node
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the parent element node of the missing attribute node
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the corresponding type of the attribute node
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal attribute.
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlParserErrors error,
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaBasicItemPtr ownerItem,
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr ownerElem,
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *name,
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *message)
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (message != NULL)
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message);
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(ctxt, ownerElem, error,
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s: The attribute '%s' is required but missing.\n",
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    BAD_CAST des, BAD_CAST name);
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPResCompAttrErr:
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of  the owner
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem: the owner as an element node
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name of the attribute holding the QName
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @refName: the referenced local name
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @refURI: the referenced namespace URI
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @message: optional message
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to report QName attribute values that failed to resolve
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to schema components.
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlParserErrors error,
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaBasicItemPtr ownerItem,
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr ownerElem,
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *name,
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const xmlChar *refName,
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const xmlChar *refURI,
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaTypeType refType,
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *refTypeStr)
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL, *strA = NULL;
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (refTypeStr == NULL)
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType);
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrExt(ctxt, ownerElem, error,
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL, NULL,
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s.\n", BAD_CAST des, BAD_CAST name,
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFormatQName(&strA, refURI, refName),
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    BAD_CAST refTypeStr, NULL);
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des)
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(strA)
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPCustomAttrErr:
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the owner
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the illegal attribute node
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal attribute during the parse.
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlParserErrors error,
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar **ownerDes,
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaBasicItemPtr ownerItem,
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAttrPtr attr,
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const char *msg)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ownerDes == NULL)
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (*ownerDes == NULL) {
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent);
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	des = *ownerDes;
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	des = *ownerDes;
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL,
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s, attribute '%s': %s.\n",
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    BAD_CAST des, (const xmlChar *) "Unknown",
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (const xmlChar *) msg, NULL, NULL);
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s, attribute '%s': %s.\n",
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL);
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ownerDes == NULL)
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(des);
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPIllegalAttrErr:
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the attribute's owner
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the attribute's owner item
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the illegal attribute node
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal attribute during the parse.
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlParserErrors error,
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED,
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlAttrPtr attr)
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *strA = NULL, *strB = NULL;
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent);
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr,
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"%sThe attribute '%s' is not allowed.\n", BAD_CAST strA,
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name),
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, NULL);
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(strA);
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(strB);
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPCustomErr:
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemDes: the designation of the schema item
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the schema item
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemElem: the node of the schema item
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @message: the error message
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: an optional param for the error message
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: an optional param for the error message
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str3: an optional param for the error message
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an error during parsing.
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlParserErrors error,
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaBasicItemPtr item,
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr itemElem,
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const char *message,
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str1,
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str2,
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str3)
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL, *msg = NULL;
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, item, itemElem);
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrdup(BAD_CAST "%s: ");
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((itemElem == NULL) && (item != NULL))
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	itemElem = WXS_ITEM_NODE(item);
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL,
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) msg, BAD_CAST des, str1, str2, str3, NULL);
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg);
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPCustomErr:
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemDes: the designation of the schema item
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the schema item
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemElem: the node of the schema item
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @message: the error message
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: the optional param for the error message
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an error during parsing.
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlParserErrors error,
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaBasicItemPtr item,
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr itemElem,
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const char *message,
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str1)
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message,
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str1, NULL, NULL);
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPAttrUseErr:
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemDes: the designation of the schema type
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the schema type
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemElem: the node of the schema type
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the invalid schema attribute
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @message: the error message
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: the optional param for the error message
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an attribute use error during parsing.
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlParserErrors error,
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr node,
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaBasicItemPtr ownerItem,
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlSchemaAttributeUsePtr attruse,
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const char *message,
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str1, const xmlChar *str2,
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *str3,const xmlChar *str4)
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL, *msg = NULL;
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL);
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ", ");
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg,
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST xmlSchemaFormatItemForReport(&str, NULL,
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST attruse, NULL));
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str);
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ": ");
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, (const xmlChar *) message);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST ".\n");
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaErr4(ACTXT_CAST ctxt, error, node,
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) msg, str1, str2, str3, str4);
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(msg);
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPIllegalFacetAtomicErr:
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the schema type
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @baseType: the base type of type
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet: the illegal facet
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal facet for atomic simple types.
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlParserErrors error,
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr type,
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr baseType,
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaFacetPtr facet)
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL, *strT = NULL;
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node);
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL,
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"%s: The facet '%s' is not allowed on types derived from the "
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"type %s.\n",
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL),
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, NULL);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(strT);
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPIllegalFacetListUnionErr:
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @itemDes: the designation of the schema item involved
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the schema item involved
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet: the illegal facet
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal facet for <list> and <union>.
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlParserErrors error,
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr type,
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaFacetPtr facet)
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type,
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->node);
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPErr(ctxt, type->node, error,
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"%s: The facet '%s' is not allowed.\n",
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPMutualExclAttrErr:
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elemDes: the designation of the parent element node
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the bad attribute node
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the corresponding type of the attribute node
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an illegal attribute.
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlParserErrors error,
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaBasicItemPtr ownerItem,
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlAttrPtr attr,
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *name1,
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const char *name2)
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent);
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"%s: The attributes '%s' and '%s' are mutually exclusive.\n",
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL);
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPSimpleTypeErr:
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema validation context
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the type specifier
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the owner
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the schema object if existent
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the validated node
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the validated value
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports a simple type validation error.
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Should this report the value of an element as well?
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlParserErrors error,
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED,
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNodePtr node,
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaTypePtr type,
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const char *expected,
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *value,
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const char *message,
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *str1,
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *str2)
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node);
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (message == NULL) {
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Use default messages.
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type != NULL) {
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->type == XML_ATTRIBUTE_NODE)
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "The character content is not a "
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"valid value of ");
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! xmlSchemaIsGlobalItem(type))
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "the local ");
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "the ");
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_ATOMIC(type))
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "atomic type");
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_LIST(type))
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "list type");
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (WXS_IS_UNION(type))
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "union type");
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaIsGlobalItem(type)) {
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST " '");
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->builtInType != 0) {
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg = xmlStrcat(msg, BAD_CAST "xs:");
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg = xmlStrcat(msg, type->name);
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg = xmlStrcat(msg,
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatQName(&str,
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    type->targetNamespace, type->name));
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "'.");
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->type == XML_ATTRIBUTE_NODE)
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid.");
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = xmlStrcat(msg, BAD_CAST "The character content is not "
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"valid.");
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (expected) {
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST " Expected is '");
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST expected);
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "'.\n");
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = xmlStrcat(msg, BAD_CAST "\n");
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ATTRIBUTE_NODE)
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL);
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL);
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST message);
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST ".\n");
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL,
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (const char*) msg, str1, str2, NULL, NULL, NULL);
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Cleanup. */
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(msg)
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPContentErr:
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema parser context
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error: the error code
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @onwerDes: the designation of the holder of the content
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner item of the holder of the content
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem: the node of the holder of the content
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @child: the invalid child node
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @message: the optional error message
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the optional string describing the correct content
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reports an error concerning the content of a schema element.
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlParserErrors error,
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaBasicItemPtr ownerItem,
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr ownerElem,
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr child,
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *message,
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const char *content)
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (message != NULL)
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr2(ctxt, ownerElem, child, error,
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%s: %s.\n",
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    BAD_CAST des, BAD_CAST message);
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (content != NULL) {
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s: The content is not valid. Expected is %s.\n",
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST des, BAD_CAST content);
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s: The content is not valid.\n",
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST des, NULL);
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des)
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Streamable error functions                      *
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Validation helper functions			*
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Allocation functions				*
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewSchemaForParserCtxt:
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new Schema structure.
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaPtr
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr ret;
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema));
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating schema", NULL);
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchema));
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = ctxt->dict;
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictReference(ret->dict);
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewFacet:
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new Facet structure.
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFacetPtr
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewFacet(void)
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetPtr ret;
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet));
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaFacet));
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewAnnot:
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new annotation structure.
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAnnotPtr
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr ret;
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot));
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating annotation", node);
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaAnnot));
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->content = node;
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaItemListPtr
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListCreate(void)
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr ret;
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlMalloc(sizeof(xmlSchemaItemList));
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL,
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating an item list structure", NULL);
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaItemList));
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListClear(xmlSchemaItemListPtr list)
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items != NULL) {
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(list->items);
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = NULL;
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->nbItems = 0;
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->sizeItems = 0;
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item)
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items == NULL) {
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlMalloc(
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    20 * sizeof(void *));
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems = 20;
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (list->sizeItems <= list->nbItems) {
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems *= 2;
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlRealloc(list->items,
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems * sizeof(void *));
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems = 0;
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->items[list->nbItems++] = item;
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListAddSize(xmlSchemaItemListPtr list,
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int initialSize,
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 void *item)
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items == NULL) {
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (initialSize <= 0)
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    initialSize = 1;
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlMalloc(
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    initialSize * sizeof(void *));
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems = initialSize;
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (list->sizeItems <= list->nbItems) {
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems *= 2;
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlRealloc(list->items,
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems * sizeof(void *));
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems = 0;
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->items[list->nbItems++] = item;
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx)
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items == NULL) {
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlMalloc(
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    20 * sizeof(void *));
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems = 20;
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (list->sizeItems <= list->nbItems) {
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems *= 2;
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlRealloc(list->items,
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems * sizeof(void *));
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems = 0;
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Just append if the index is greater/equal than the item count.
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idx >= list->nbItems) {
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items[list->nbItems++] = item;
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = list->nbItems; i > idx; i--)
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->items[i] = list->items[i-1];
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items[idx] = item;
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems++;
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* enable if ever needed */
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListInsertSize(xmlSchemaItemListPtr list,
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int initialSize,
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    void *item,
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int idx)
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items == NULL) {
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (initialSize <= 0)
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    initialSize = 1;
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlMalloc(
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    initialSize * sizeof(void *));
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems = initialSize;
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (list->sizeItems <= list->nbItems) {
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems *= 2;
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = (void **) xmlRealloc(list->items,
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems * sizeof(void *));
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (list->items == NULL) {
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->sizeItems = 0;
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Just append if the index is greater/equal than the item count.
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idx >= list->nbItems) {
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items[list->nbItems++] = item;
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = list->nbItems; i > idx; i--)
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->items[i] = list->items[i-1];
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items[idx] = item;
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems++;
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx)
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((list->items == NULL) || (idx >= list->nbItems)) {
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, "
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "index error.\n");
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->nbItems == 1) {
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Really free the list? */
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(list->items);
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->items = NULL;
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems = 0;
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->sizeItems = 0;
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (list->nbItems -1 == idx) {
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems--;
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = idx; i < list->nbItems -1; i++)
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->items[i] = list->items[i+1];
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems--;
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaItemListFree:
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @annot:  a schema type structure
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a annotation structure
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaItemListFree(xmlSchemaItemListPtr list)
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list == NULL)
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->items != NULL)
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(list->items);
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(list);
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket == NULL)
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->globals != NULL) {
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaComponentListFree(bucket->globals);
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(bucket->globals);
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->locals != NULL) {
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaComponentListFree(bucket->locals);
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(bucket->locals);
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->relations != NULL) {
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSchemaRelationPtr prev, cur = bucket->relations;
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = cur;
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prev);
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (cur != NULL);
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! bucket->preserveDoc) && (bucket->doc != NULL)) {
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(bucket->doc);
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IMPBUCKET(bucket)->schema != NULL)
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema);
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(bucket);
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBucketPtr
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int type, const xmlChar *targetNamespace)
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr ret;
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr mainSchema;
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) {
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaBucketCreate",
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no main schema on constructor");
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create the schema bucket. */
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_BUCKET_INCREDEF(type))
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	size = sizeof(xmlSchemaInclude);
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	size = sizeof(xmlSchemaImport);
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaBucketPtr) xmlMalloc(size);
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL);
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, size);
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = targetNamespace;
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->globals = xmlSchemaItemListCreate();
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->globals == NULL) {
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret);
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->locals = xmlSchemaItemListCreate();
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->locals == NULL) {
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret);
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The following will assure that only the first bucket is marked as
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema.
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For each following import buckets an xmlSchema will be created.
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * An xmlSchema will be created for every distinct targetNamespace.
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We assign the targetNamespace to the schemata here.
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_HAS_BUCKETS(pctxt)) {
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_BUCKET_INCREDEF(type)) {
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaBucketCreate",
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"first bucket but it's an include or redefine");
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaBucketFree(ret);
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->type = XML_SCHEMA_SCHEMA_MAIN;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Point to the *main* schema. */
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_CONSTRUCTOR(pctxt)->mainBucket = ret;
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_IMPBUCKET(ret)->schema = mainSchema;
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Ensure that the main schema gets a targetNamespace.
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	mainSchema->targetNamespace = targetNamespace;
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_SCHEMA_SCHEMA_MAIN) {
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaBucketCreate",
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"main bucket but it's not the first one");
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaBucketFree(ret);
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (type == XML_SCHEMA_SCHEMA_IMPORT) {
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Create a schema for imports and assign the
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * targetNamespace.
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt);
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IMPBUCKET(ret)->schema == NULL) {
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBucketFree(ret);
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace;
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_BUCKET_IMPMAIN(type)) {
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int res;
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Imports go into the "schemasImports" slot of the main *schema*.
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we create an import entry for the main schema as well; i.e.,
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* even if there's only one schema, we'll get an import.
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (mainSchema->schemasImports == NULL) {
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    mainSchema->schemasImports = xmlHashCreateDict(5,
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_CONSTRUCTOR(pctxt)->dict);
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (mainSchema->schemasImports == NULL) {
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBucketFree(ret);
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (targetNamespace == NULL)
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlHashAddEntry(mainSchema->schemasImports,
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_NO_NAMESPACE, ret);
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlHashAddEntry(mainSchema->schemasImports,
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		targetNamespace, ret);
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaBucketCreate",
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to add the schema bucket to the hash");
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaBucketFree(ret);
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Set the @ownerImport of an include bucket. */
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_INCBUCKET(ret)->ownerImport =
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_INCBUCKET(ret)->ownerImport =
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Includes got into the "includes" slot of the *main* schema. */
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (mainSchema->includes == NULL) {
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    mainSchema->includes = xmlSchemaItemListCreate();
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (mainSchema->includes == NULL) {
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBucketFree(ret);
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListAdd(mainSchema->includes, ret);
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add to list of all buckets; this is used for lookup
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * during schema construction time only.
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1)
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item)
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*list == NULL) {
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*list = xmlSchemaItemListCreate();
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*list == NULL)
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListAddSize(*list, initialSize, item);
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeAnnot:
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @annot:  a schema type structure
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a annotation structure
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (annot == NULL)
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (annot->next == NULL) {
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(annot);
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAnnotPtr prev;
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = annot;
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    annot = annot->next;
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prev);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (annot != NULL);
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeNotation:
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a schema notation structure
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema Notation structure.
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nota == NULL)
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(nota);
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeAttribute:
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  an attribute declaration
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates an attribute declaration structure.
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeAttribute(xmlSchemaAttributePtr attr)
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->annot != NULL)
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeAnnot(attr->annot);
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->defVal != NULL)
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(attr->defVal);
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(attr);
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeAttributeUse:
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @use:  an attribute use
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates an attribute use structure.
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (use == NULL)
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (use->annot != NULL)
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeAnnot(use->annot);
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (use->defVal != NULL)
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(use->defVal);
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(use);
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeAttributeUseProhib:
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prohib:  an attribute use prohibition
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates an attribute use structure.
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prohib == NULL)
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(prohib);
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeWildcardNsSet:
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set:  a schema wildcard namespace
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates a list of wildcard constraint structures.
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set)
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr next;
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (set != NULL) {
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = set->next;
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(set);
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	set = next;
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeWildcard:
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @wildcard:  a wildcard structure
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates a wildcard structure.
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wildcard == NULL)
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wildcard->annot != NULL)
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(wildcard->annot);
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wildcard->nsSet != NULL)
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wildcard->negNsSet != NULL)
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(wildcard->negNsSet);
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(wildcard);
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeAttributeGroup:
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a schema attribute group structure
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema Attribute Group structure.
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrGr == NULL)
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrGr->annot != NULL)
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(attrGr->annot);
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrGr->attrUses != NULL)
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(attrGr);
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeQNameRef:
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: a QName reference structure
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocatea a QName reference structure.
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item)
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(item);
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeTypeLinkList:
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @alink: a type link
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a list of types.
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link)
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeLinkPtr next;
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (link != NULL) {
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = link->next;
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(link);
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link = next;
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr next;
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (sto != NULL) {
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = sto->next;
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->history != NULL)
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(sto->history);
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->xpathCtxt != NULL)
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(sto);
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto = next;
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeIDC:
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @idc: a identity-constraint definition
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates an identity-constraint definition.
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr cur, prev;
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idcDef == NULL)
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idcDef->annot != NULL)
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(idcDef->annot);
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Selector */
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idcDef->selector != NULL) {
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (idcDef->selector->xpathComp != NULL)
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(idcDef->selector);
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Fields */
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idcDef->fields != NULL) {
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = idcDef->fields;
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = cur;
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (prev->xpathComp != NULL)
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreePattern((xmlPatternPtr) prev->xpathComp);
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prev);
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (cur != NULL);
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(idcDef);
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeElement:
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a schema element structure
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema Element structure.
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeElement(xmlSchemaElementPtr elem)
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL)
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->annot != NULL)
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(elem->annot);
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->contModel != NULL)
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRegFreeRegexp(elem->contModel);
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->defVal != NULL)
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(elem->defVal);
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(elem);
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeFacet:
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet:  a schema facet structure
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema Facet structure.
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (facet == NULL)
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (facet->val != NULL)
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeValue(facet->val);
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (facet->regexp != NULL)
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRegFreeRegexp(facet->regexp);
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (facet->annot != NULL)
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(facet->annot);
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(facet);
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeType:
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  a schema type structure
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema Type structure.
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeType(xmlSchemaTypePtr type)
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->annot != NULL)
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(type->annot);
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->facets != NULL) {
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFacetPtr facet, next;
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet = type->facets;
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (facet != NULL) {
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = facet->next;
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSchemaFreeFacet(facet);
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            facet = next;
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->attrUses != NULL)
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses);
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->memberTypes != NULL)
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeTypeLinkList(type->memberTypes);
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->facetSet != NULL) {
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFacetLinkPtr next, link;
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link = type->facetSet;
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    next = link->next;
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(link);
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link = next;
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (link != NULL);
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->contModel != NULL)
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRegFreeRegexp(type->contModel);
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(type);
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeModelGroupDef:
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  a schema model group definition
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates a schema model group definition.
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item)
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->annot != NULL)
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeAnnot(item->annot);
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(item);
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeModelGroup:
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  a schema model group
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocates a schema model group structure.
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item)
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->annot != NULL)
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeAnnot(item->annot);
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(item);
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaComponentListFree(xmlSchemaItemListPtr list)
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((list == NULL) || (list->nbItems == 0))
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTreeItemPtr item;
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items;
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < list->nbItems; i++) {
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item = items[i];
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (item == NULL)
40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (item->type) {
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_SIMPLE:
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_COMPLEX:
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeType((xmlSchemaTypePtr) item);
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ATTRIBUTE:
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item);
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item);
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeAttributeUseProhib(
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaAttributeUseProhibPtr) item);
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ELEMENT:
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeElement((xmlSchemaElementPtr) item);
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_PARTICLE:
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (item->annot != NULL)
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFreeAnnot(item->annot);
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(item);
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_SEQUENCE:
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_CHOICE:
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ALL:
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item);
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeAttributeGroup(
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaAttributeGroupPtr) item);
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_GROUP:
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeModelGroupDef(
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaModelGroupDefPtr) item);
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ANY:
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item);
40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_IDC_KEY:
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_IDC_UNIQUE:
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_IDC_KEYREF:
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeIDC((xmlSchemaIDCPtr) item);
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_NOTATION:
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeNotation((xmlSchemaNotationPtr) item);
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_EXTRA_QNAMEREF:
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item);
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default: {
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* TODO: This should never be hit. */
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPSimpleInternalErr(NULL,
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Internal error: xmlSchemaComponentListFree, "
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"unexpected component type '%s'\n",
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(const xmlChar *) WXS_ITEM_TYPE_NAME(item));
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 }
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	list->nbItems = 0;
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFree:
40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a schema structure
40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate a Schema structure.
40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFree(xmlSchemaPtr schema)
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema == NULL)
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* @volatiles is not used anymore :-/ */
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->volatiles != NULL)
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	TODO
40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that those slots are not responsible for freeing
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * schema components anymore; this will now be done by
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the schema buckets.
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->notaDecl != NULL)
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->notaDecl, NULL);
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->attrDecl != NULL)
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->attrDecl, NULL);
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->attrgrpDecl != NULL)
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->attrgrpDecl, NULL);
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->elemDecl != NULL)
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->elemDecl, NULL);
41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->typeDecl != NULL)
41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->typeDecl, NULL);
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->groupDecl != NULL)
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->groupDecl, NULL);
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->idcDef != NULL)
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashFree(schema->idcDef, NULL);
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->schemasImports != NULL)
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashFree(schema->schemasImports,
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlHashDeallocator) xmlSchemaBucketFree);
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->includes != NULL) {
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes;
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < list->nbItems; i++) {
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]);
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(list);
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->annot != NULL)
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeAnnot(schema->annot);
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Never free the doc here, since this will be done by the buckets. */
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictFree(schema->dict);
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(schema);
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Debug functions					*
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaElementDump:
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  an element
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the file output
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump the element
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output,
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const xmlChar * name ATTRIBUTE_UNUSED,
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar * namespace ATTRIBUTE_UNUSED,
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const xmlChar * context ATTRIBUTE_UNUSED)
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL)
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "Element");
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, " (global)");
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, ": '%s' ", elem->name);
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (namespace != NULL)
41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "ns '%s'", namespace);
41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "\n");
41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) {
41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "  min %d ", elem->minOccurs);
41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (elem->maxOccurs >= UNBOUNDED)
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "max: unbounded\n");
41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (elem->maxOccurs != 1)
41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "max: %d\n", elem->maxOccurs);
41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "\n");
41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Misc other properties.
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "  props: ");
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->flags & XML_SCHEMAS_ELEM_FIXED)
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "[fixed] ");
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "[default] ");
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "[abstract] ");
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "[nillable] ");
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "\n");
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Default/fixed value.
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->value != NULL)
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "  value: '%s'\n", elem->value);
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Type.
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->namedType != NULL) {
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "  type: '%s' ", elem->namedType);
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->namedTypeNs != NULL)
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "ns '%s'\n", elem->namedTypeNs);
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "\n");
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (elem->subtypes != NULL) {
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Dump local types.
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeDump(elem->subtypes, output);
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Substitution group.
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->substGroup != NULL) {
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "  substitutionGroup: '%s' ", elem->substGroup);
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->substGroupNs != NULL)
42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "ns '%s'\n", elem->substGroupNs);
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "\n");
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAnnotDump:
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the file output
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @annot:  a annotation
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump the annotation
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot)
42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *content;
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (annot == NULL)
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content = xmlNodeGetContent(annot->content);
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "  Annot: %s\n", content);
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(content);
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "  Annot: empty\n");
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaContentModelDump:
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle: the schema particle
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the file output
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth: the depth used for intentation
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a SchemaType structure
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth)
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr term;
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char shift[100];
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle == NULL)
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;((i < depth) && (i < 25));i++)
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        shift[2 * i] = shift[2 * i + 1] = ' ';
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shift[2 * i] = shift[2 * i + 1] = 0;
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "%s", shift);
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->children == NULL) {
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "MISSING particle term\n");
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    term = particle->children;
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (term == NULL) {
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "(NULL)");
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (term->type) {
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ELEMENT:
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str,
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((xmlSchemaElementPtr)term)->targetNamespace,
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((xmlSchemaElementPtr)term)->name));
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SEQUENCE:
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "SEQUENCE");
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_CHOICE:
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "CHOICE");
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ALL:
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "ALL");
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ANY:
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "ANY");
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "UNKNOWN\n");
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->minOccurs != 1)
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, " min: %d", particle->minOccurs);
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->maxOccurs >= UNBOUNDED)
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, " max: unbounded");
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (particle->maxOccurs != 1)
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, " max: %d", particle->maxOccurs);
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "\n");
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (term &&
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (term->type == XML_SCHEMA_TYPE_ALL)) &&
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (term->children != NULL)) {
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    output, depth +1);
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->next != NULL)
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		output, depth);
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAttrUsesDump:
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uses:  attribute uses list
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the file output
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps a list of attribute use components.
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output)
43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr use;
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUseProhibPtr prohib;
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ref;
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name, *tns;
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((uses == NULL) || (uses->nbItems == 0))
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "  attributes:\n");
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < uses->nbItems; i++) {
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = uses->items[i];
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "  [prohibition] ");
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prohib = (xmlSchemaAttributeUseProhibPtr) use;
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = prohib->name;
43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tns = prohib->targetNamespace;
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "  [reference] ");
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ref = (xmlSchemaQNameRefPtr) use;
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = ref->name;
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tns = ref->targetNamespace;
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "  [use] ");
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = WXS_ATTRUSE_DECL_NAME(use);
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tns = WXS_ATTRUSE_DECL_TNS(use);
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "'%s'\n",
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (const char *) xmlSchemaFormatQName(&str, tns, name));
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str);
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaTypeDump:
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the file output
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  a type structure
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a SchemaType structure
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output)
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL) {
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "Type: NULL\n");
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "Type: ");
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->name != NULL)
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "'%s' ", type->name);
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "(no name) ");
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->targetNamespace != NULL)
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "ns '%s' ", type->targetNamespace);
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type->type) {
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_BASIC:
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[basic] ");
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_SIMPLE:
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[simple] ");
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_COMPLEX:
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[complex] ");
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_SEQUENCE:
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[sequence] ");
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_CHOICE:
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[choice] ");
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_ALL:
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[all] ");
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_UR:
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[ur] ");
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_RESTRICTION:
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[restriction] ");
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_EXTENSION:
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[extension] ");
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[unknown type %d] ", type->type);
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "content: ");
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type->contentType) {
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_UNKNOWN:
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[unknown] ");
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_EMPTY:
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[empty] ");
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_ELEMENTS:
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[element] ");
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_MIXED:
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[mixed] ");
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* not used. */
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_BASIC:
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[basic] ");
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_SIMPLE:
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[simple] ");
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_ANY:
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "[any] ");
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "\n");
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->base != NULL) {
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "  base type: '%s'", type->base);
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->baseNs != NULL)
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, " ns '%s'\n", type->baseNs);
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "\n");
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->attrUses != NULL)
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttrUsesDump(type->attrUses, output);
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->annot != NULL)
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaAnnotDump(output, type->annot);
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DUMP_CONTENT_MODEL
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->type == XML_SCHEMA_TYPE_COMPLEX) &&
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->subtypes != NULL)) {
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes,
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    output, 1);
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaDump:
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the file output
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a schema structure
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump a Schema structure.
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaDump(FILE * output, xmlSchemaPtr schema)
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema == NULL) {
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "Schemas: NULL\n");
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "Schemas: ");
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->name != NULL)
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "%s, ", schema->name);
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "no name, ");
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->targetNamespace != NULL)
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "%s", (const char *) schema->targetNamespace);
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "no target namespace");
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "\n");
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->annot != NULL)
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaAnnotDump(output, schema->annot);
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump,
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                output);
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashScanFull(schema->elemDecl,
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (xmlHashScannerFull) xmlSchemaElementDump, output);
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC_NODE_TABLE
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaDebugDumpIDCTable:
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays the current IDC table for debug purposes.
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaDebugDumpIDCTable(FILE * output,
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *namespaceName,
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *localName,
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaPSVIIDCBindingPtr bind)
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCNodePtr tab;
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr key;
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j, res;
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "IDC: TABLES on '%s'\n",
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFormatQName(&str, namespaceName, localName));
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(str)
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bind == NULL)
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "IDC:   BINDING '%s' (%d)\n",
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetComponentQName(&str,
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bind->definition), bind->nbNodes);
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < bind->nbNodes; i++) {
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tab = bind->nodeTable[i];
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "         ( ");
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (j = 0; j < bind->definition->nbFields; j++) {
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		key = tab->keys[j];
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((key != NULL) && (key->val != NULL)) {
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    res = xmlSchemaGetCanonValue(key->val, &value);
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (res >= 0)
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(output, "'%s' ", value);
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(output, "CANON-VALUE-FAILED ");
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (res == 0)
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(value)
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (key != NULL)
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(output, "(no val), ");
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(output, "(key missing), ");
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, ")\n");
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bind->dupls && bind->dupls->nbItems) {
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "IDC:     dupls (%d):\n", bind->dupls->nbItems);
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < bind->dupls->nbItems; i++) {
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tab = bind->dupls->items[i];
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "         ( ");
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (j = 0; j < bind->definition->nbFields; j++) {
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    key = tab->keys[j];
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((key != NULL) && (key->val != NULL)) {
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			res = xmlSchemaGetCanonValue(key->val, &value);
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (res >= 0)
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fprintf(output, "'%s' ", value);
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fprintf(output, "CANON-VALUE-FAILED ");
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (res == 0)
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(value)
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else if (key != NULL)
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(output, "(no val), ");
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fprintf(output, "(key missing), ");
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, ")\n");
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind = bind->next;
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (bind != NULL);
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* DEBUG_IDC */
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Utilities					*
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetPropNode:
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name of the attribute
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Seeks an attribute with a name of @name in
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * no namespace.
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute or NULL if not present.
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetPropNode(xmlNodePtr node, const char *name)
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (name == NULL))
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = node->properties;
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (prop != NULL) {
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name))
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(prop);
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = prop->next;
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetPropNodeNs:
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uri: the uri
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name of the attribute
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Seeks an attribute with a local name of @name and
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a namespace URI of @uri.
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute or NULL if not present.
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name)
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (name == NULL))
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = node->properties;
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (prop != NULL) {
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((prop->ns != NULL) &&
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlStrEqual(prop->name, BAD_CAST name) &&
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlStrEqual(prop->ns->href, BAD_CAST uri))
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(prop);
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = prop->next;
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *val;
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *ret;
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlNodeGetContent(node);
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val == NULL)
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlStrdup((xmlChar *)"");
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlDictLookup(ctxt->dict, val, -1);
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(val);
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetNodeContentNoDict(xmlNodePtr node)
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((const xmlChar*) xmlNodeGetContent(node));
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetProp:
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the property name
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read a attribute value and internalize the string
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the string or NULL if not present.
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const char *name)
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *val;
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *ret;
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlGetNoNsProp(node, BAD_CAST name);
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val == NULL)
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlDictLookup(ctxt->dict, val, -1);
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(val);
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Parsing functions				*
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_FIND_GLOBAL_ITEM(slot)			\
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(nsName, schema->targetNamespace)) { \
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlHashLookup(schema->slot, name); \
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != NULL) goto exit; \
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } \
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHashSize(schema->schemasImports) > 1) { \
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaImportPtr import; \
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName == NULL) \
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    import = xmlHashLookup(schema->schemasImports, \
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_NO_NAMESPACE); \
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else \
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    import = xmlHashLookup(schema->schemasImports, nsName); \
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (import == NULL) \
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit; \
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlHashLookup(import->schema->slot, name); \
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetElem:
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema context
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the element name
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the element namespace
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a global element declaration in the schema.
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the element declaration or NULL if not found.
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaElementPtr
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name,
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * nsName)
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr ret = NULL;
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(elemDecl)
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (nsName == NULL)
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup element decl. %s", name);
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup element decl. %s:%s", name,
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    nsName);
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetType:
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the main schema
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the type's name
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nsName:  the type's namespace
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a type in the schemas or the predefined types
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the group definition or NULL if not found.
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name,
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * nsName)
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr ret = NULL;
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL)
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* First try the built-in types. */
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) {
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaGetPredefinedType(name, nsName);
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != NULL)
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we try the parsed schemas as well here
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* since one might have parsed the S4S, which contain more
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* than the built-in types.
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Can we optimize this?
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(typeDecl)
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (nsName == NULL)
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup type %s", name);
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup type %s:%s", name,
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    nsName);
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetAttributeDecl:
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the context of the schema
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the target namespace of the attribute
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a an attribute in the schema or imported schemas
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute declaration or NULL if not found.
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributePtr
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name,
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * nsName)
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr ret = NULL;
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(attrDecl)
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (nsName == NULL)
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup attribute %s", name);
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup attribute %s:%s", name,
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    nsName);
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetAttributeGroup:
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the context of the schema
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute group
48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the target namespace of the attribute group
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a an attribute group in the schema or imported schemas
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute group definition or NULL if not found.
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributeGroupPtr
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name,
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * nsName)
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr ret = NULL;
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO:
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret != NULL) && (ret->redef != NULL)) {
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Return the last redefinition. *
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = ret->redef;
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (nsName == NULL)
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup attribute group %s", name);
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup attribute group %s:%s", name,
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    nsName);
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetGroup:
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the context of the schema
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the group
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the target namespace of the group
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a group in the schema or imported schemas
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the group definition or NULL if not found.
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaModelGroupDefPtr
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name,
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * nsName)
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupDefPtr ret = NULL;
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(groupDecl)
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (nsName == NULL)
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup group %s", name);
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Unable to lookup group %s:%s", name,
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    nsName);
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaNotationPtr
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetNotation(xmlSchemaPtr schema,
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *name,
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *nsName)
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNotationPtr ret = NULL;
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(notaDecl)
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaIDCPtr
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetIDC(xmlSchemaPtr schema,
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *name,
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *nsName)
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr ret = NULL;
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (schema == NULL))
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema != NULL) {
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_FIND_GLOBAL_ITEM(idcDef)
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetNamedComponent:
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the group
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the target namespace of the group
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup a group in the schema or imported schemas
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the group definition or NULL if not found.
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetNamedComponent(xmlSchemaPtr schema,
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypeType itemType,
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *name,
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *targetNs)
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (itemType) {
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema,
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name, targetNs));
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT:
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema,
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name, targetNs));
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TODO
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Parsing functions				*
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_BLANK_NODE(n)						\
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsBlank:
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a string
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the length of the string or -1
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if a string is ignorable
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsBlank(xmlChar * str, int len)
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL)
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (1);
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) {
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (*str != 0) {
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!(IS_BLANK_CH(*str)))
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str++;
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else while ((*str != 0) && (len != 0)) {
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!(IS_BLANK_CH(*str)))
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str++;
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len--;
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (1);
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_COMP_NAME(c, t) ((t) (c))->name
50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSchemaFindRedefCompInGraph:
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* ATTENTION TODO: This uses pointer comp. for strings.
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaTypeType type,
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      const xmlChar *name,
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      const xmlChar *nsName)
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr ret;
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket == NULL) || (name == NULL))
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket->globals == NULL) ||
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(bucket->globals->nbItems == 0))
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto subschemas;
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Search in global components.
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < bucket->globals->nbItems; i++) {
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = bucket->globals->items[i];
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->type == type) {
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (type) {
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_COMPLEX:
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_SIMPLE:
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) &&
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_COMP_TNS(ret, xmlSchemaTypePtr) ==
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName))
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_GROUP:
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_COMP_NAME(ret,
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaModelGroupDefPtr) == name) &&
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_COMP_TNS(ret,
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaModelGroupDefPtr) == nsName))
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_COMP_NAME(ret,
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaAttributeGroupPtr) == name) &&
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_COMP_TNS(ret,
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaAttributeGroupPtr) == nsName))
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Should not be hit. */
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(NULL);
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)subschemas:
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Process imported/included schemas.
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->relations != NULL) {
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSchemaRelationPtr rel = bucket->relations;
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Marking the bucket will not avoid multiple searches
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* in the same schema, but avoids at least circularity.
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((rel->bucket != NULL) &&
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type, name, nsName);
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL)
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(ret);
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rel = rel->next;
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (rel != NULL);
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddNotation:
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the item name
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema annotation declaration
51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaNotationPtr
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const xmlChar *name, const xmlChar *nsName,
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr node ATTRIBUTE_UNUSED)
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNotationPtr ret = NULL;
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation));
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "add annotation", NULL);
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaNotation));
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_NOTATION;
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: do we need the node to be set?
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * ret->node = node;*/
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_GLOBAL(ctxt, ret);
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddAttribute:
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the item name
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace:  the namespace
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema Attrribute declaration
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributePtr
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const xmlChar * name, const xmlChar * nsName,
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr node, int topLevel)
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr ret = NULL;
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL))
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute));
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL);
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaAttribute));
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel)
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_GLOBAL(ctxt, ret);
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_LOCAL(ctxt, ret);
51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_PENDING(ctxt, ret);
51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddAttributeUse:
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the item name
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace:  the namespace
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema Attrribute declaration
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributeUsePtr
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr node)
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr ret = NULL;
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt == NULL)
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse));
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL);
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaAttributeUse));
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(pctxt, ret);
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSchemaAddRedef:
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Adds a redefinition information. This is used at a later stage to:
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* resolve references to the redefined components and to check constraints.
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaRedefPtr
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaBucketPtr targetBucket,
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  void *item,
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *refName,
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *refTargetNs)
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr ret;
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaRedefPtr)
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaRedef));
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(pctxt,
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating redefinition info", NULL);
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaRedef));
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->item = item;
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetBucket = targetBucket;
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->refName = refName;
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->refTargetNs = refTargetNs;
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL)
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_CONSTRUCTOR(pctxt)->redefs = ret;
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret;
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_CONSTRUCTOR(pctxt)->lastRedef = ret;
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddAttributeGroupDefinition:
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the item name
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nsName:  the target namespace
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the corresponding node
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema Attrribute Group definition.
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributeGroupPtr
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           xmlSchemaPtr schema ATTRIBUTE_UNUSED,
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *name,
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *nsName,
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlNodePtr node)
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr ret = NULL;
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (name == NULL))
52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaAttributeGroupPtr)
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlMalloc(sizeof(xmlSchemaAttributeGroup));
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL);
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaAttributeGroup));
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Remove the flag. */
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->isRedefine) {
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret, name, nsName);
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (pctxt->redef == NULL) {
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ret);
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redefCounter = 0;
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_GLOBAL(pctxt, ret);
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_PENDING(pctxt, ret);
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddElement:
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the type name
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace:  the type namespace
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema Element declaration
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaElementPtr
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const xmlChar * name, const xmlChar * nsName,
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr node, int topLevel)
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr ret = NULL;
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (name == NULL))
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement));
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating element", NULL);
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaElement));
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_ELEMENT;
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel)
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_GLOBAL(ctxt, ret);
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_LOCAL(ctxt, ret);
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_PENDING(ctxt, ret);
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddType:
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the item name
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespace:  the namespace
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema item
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 xmlSchemaTypeType type,
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar * name, const xmlChar * nsName,
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 xmlNodePtr node, int topLevel)
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr ret = NULL;
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL))
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating type", NULL);
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaType));
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel) {
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->isRedefine) {
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret, name, nsName);
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ctxt->redef == NULL) {
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(ret);
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->redefCounter = 0;
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_GLOBAL(ctxt, ret);
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_LOCAL(ctxt, ret);
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_PENDING(ctxt, ret);
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaQNameRefPtr
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaTypeType refType,
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *refName,
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     const xmlChar *refNs)
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ret;
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaQNameRefPtr)
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaQNameRef));
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(pctxt,
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating QName reference item", NULL);
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = NULL;
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = refName;
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = refNs;
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->item = NULL;
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->itemType = refType;
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Store the reference item in the schema.
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(pctxt, ret);
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributeUseProhibPtr
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUseProhibPtr ret;
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaAttributeUseProhibPtr)
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaAttributeUseProhib));
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(pctxt,
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating attribute use prohibition", NULL);
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib));
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(pctxt, ret);
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddModelGroup:
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the "compositor" type of the model group
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the schema doc
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds a schema model group
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaModelGroupPtr
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaPtr schema,
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaTypeType type,
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlNodePtr node)
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupPtr ret = NULL;
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL))
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaModelGroupPtr)
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaModelGroup));
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(ctxt, "allocating model group component",
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL);
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaModelGroup));
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(ctxt, ret);
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type == XML_SCHEMA_TYPE_SEQUENCE) ||
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type == XML_SCHEMA_TYPE_CHOICE))
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(ctxt, ret);
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddParticle:
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the corresponding node in the schema doc
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @min: the minOccurs
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @max: the maxOccurs
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds an XML schema particle component.
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaParticlePtr
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr node, int min, int max)
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr ret = NULL;
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "Adding particle component\n");
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaParticlePtr)
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaParticle));
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(ctxt, "allocating particle component",
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL);
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_PARTICLE;
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->annot = NULL;
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->minOccurs = min;
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->maxOccurs = max;
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->next = NULL;
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->children = NULL;
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(ctxt, ret);
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that addition to pending components will be done locally
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to the specific parsing function, since the most particles
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * need not to be fixed up (i.e. the reference to be resolved).
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * REMOVED: WXS_ADD_PENDING(ctxt, ret);
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddModelGroupDefinition:
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the group name
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an XML schema Group definition
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaModelGroupDefPtr
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaPtr schema,
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar *name,
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar *nsName,
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlNodePtr node)
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupDefPtr ret = NULL;
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaModelGroupDefPtr)
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaModelGroupDef));
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "adding group", NULL);
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaModelGroupDef));
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_TYPE_GROUP;
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->isRedefine) {
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret, name, nsName);
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->redef == NULL) {
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ret);
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->redefCounter = 0;
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_GLOBAL(ctxt, ret);
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_PENDING(ctxt, ret);
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewWildcardNs:
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new wildcard namespace constraint.
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWildcardNsPtr
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr ret;
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaWildcardNsPtr)
55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaWildcardNs));
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL);
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->value = NULL;
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->next = NULL;
55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaIDCPtr
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const xmlChar *name, const xmlChar *nsName,
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int category, xmlNodePtr node)
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr ret = NULL;
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC));
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt,
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating an identity-constraint definition", NULL);
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaIDC));
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The target namespace of the parent element declaration. */
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->targetNamespace = nsName;
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->name = name;
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = category;
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_GLOBAL(ctxt, ret);
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Only keyrefs need to be fixup up.
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (category == XML_SCHEMA_TYPE_IDC_KEYREF)
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(ctxt, ret);
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddWildcard:
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a schema
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds a wildcard.
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It corresponds to a xsd:anyAttribute and xsd:any.
56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new struture or NULL in case of error
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWildcardPtr
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaTypeType type, xmlNodePtr node)
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardPtr ret = NULL;
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL))
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL);
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaWildcard));
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->node = node;
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_ADD_LOCAL(ctxt, ret);
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group)
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group == NULL)
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group->members != NULL)
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(group->members);
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(group);
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaSubstGroupPtr
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaElementPtr head)
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSubstGroupPtr ret;
56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Init subst group hash. */
56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_GROUPS(pctxt) == NULL) {
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict);
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_SUBST_GROUPS(pctxt) == NULL)
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create a new substitution group. */
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup));
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL,
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating a substitution group container", NULL);
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaSubstGroup));
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->head = head;
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create list of members. */
56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->members = xmlSchemaItemListCreate();
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->members == NULL) {
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSubstGroupFree(ret);
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Add subst group to hash. */
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt),
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	head->name, head->targetNamespace, ret) != 0) {
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaSubstGroupAdd",
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "failed to add a new substitution container");
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSubstGroupFree(ret);
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaSubstGroupPtr
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaElementPtr head)
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_GROUPS(pctxt) == NULL)
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt),
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	head->name, head->targetNamespace));
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddElementSubstitutionMember:
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  a schema parser context
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @head:  the head of the substitution group
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @member: the new member of the substitution group
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new annotation structure.
57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated structure or NULL in case or error
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      xmlSchemaElementPtr head,
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      xmlSchemaElementPtr member)
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSubstGroupPtr substGroup = NULL;
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (head == NULL) || (member == NULL))
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    substGroup = xmlSchemaSubstGroupGet(pctxt, head);
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (substGroup == NULL)
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	substGroup = xmlSchemaSubstGroupAdd(pctxt, head);
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (substGroup == NULL)
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaItemListAdd(substGroup->members, member) == -1)
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Utilities for parsing					*
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrNodeQNameValue:
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the schema context
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the parent as a schema object
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the QName value
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @local: the resulting local part if found, the attribute value otherwise
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uri:  the resulting namespace URI if found
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts the local name and the URI of a QName value and validates it.
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used on attribute values that
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should resolve to schema components.
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0, in case the QName is valid, a positive error code
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not valid and -1 if an internal error occurs.
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaPtr schema,
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaBasicItemPtr ownerItem,
57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlAttrPtr attr,
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       const xmlChar *value,
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       const xmlChar **uri,
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       const xmlChar **local)
57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *pref;
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len, ret;
57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *uri = NULL;
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *local = NULL;
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlValidateQName(value, 1);
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret > 0) {
57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(ctxt,
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ownerItem, (xmlNodePtr) attr,
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, value, NULL, NULL, NULL);
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*local = value;
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->err);
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ret < 0)
57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strchr((char *) value, ':')) {
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = xmlSearchNs(attr->doc, attr->parent, NULL);
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns)
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * parser context. */
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This one takes care of included schemas with no
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * target namespace.
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *uri = ctxt->targetNamespace;
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*local = xmlDictLookup(ctxt->dict, value, -1);
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * At this point xmlSplitQName3 has to return a local name.
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *local = xmlSplitQName3(value, &len);
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *local = xmlDictLookup(ctxt->dict, *local, -1);
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref = xmlDictLookup(ctxt->dict, value, len);
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlSearchNs(attr->doc, attr->parent, pref);
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL) {
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(ctxt,
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ownerItem, (xmlNodePtr) attr,
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value,
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The value '%s' of simple type 'xs:QName' has no "
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "corresponding namespace declaration in scope", value, NULL);
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->err);
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrNodeQName:
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the schema context
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the owner element
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the attribute node
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @local: the resulting local part if found, the attribute value otherwise
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uri:  the resulting namespace URI if found
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts and validates the QName of an attribute value.
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used on attribute values that
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should resolve to schema components.
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0, in case the QName is valid, a positive error code
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not valid and -1 if an internal error occurs.
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaPtr schema,
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaBasicItemPtr ownerItem,
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlAttrPtr attr,
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       const xmlChar **uri,
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       const xmlChar **local)
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ownerItem, attr, value, uri, local));
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrQName:
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the schema context
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem:  the parent node of the attribute
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @local: the resulting local part if found, the attribute value otherwise
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uri:  the resulting namespace URI if found
58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts and validates the QName of an attribute value.
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0, in case the QName is valid, a positive error code
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not valid and -1 if an internal error occurs.
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaPtr schema,
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaBasicItemPtr ownerItem,
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNodePtr ownerElem,
58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const char *name,
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const xmlChar **uri,
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const xmlChar **local)
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(ownerElem, name);
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*local = NULL;
58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*uri = NULL;
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaPValAttrNodeQName(ctxt, schema,
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ownerItem, attr, uri, local));
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrID:
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the schema context
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the owner as a schema object
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem:  the parent node of the attribute
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts and validates the ID of an attribute value.
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0, in case the ID is valid, a positive error code
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not valid and -1 if an internal error occurs.
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr)
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr);
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlValidateNCName(value, 1);
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == 0) {
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: the IDness might have already be declared in the DTD
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->atype != XML_ATTRIBUTE_ID) {
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIDPtr res;
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *strip;
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Use xmlSchemaStrip here; it's not exported at this
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * moment.
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    strip = xmlSchemaCollapseString(value);
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (strip != NULL) {
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *) value);
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value = strip;
59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    res = xmlAddID(NULL, attr->doc, value, attr);
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == NULL) {
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSimpleTypeErr(ctxt,
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, (xmlNodePtr) attr,
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL, "Duplicate value '%s' of simple "
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "type 'xs:ID'", value, NULL);
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr->atype = XML_ATTRIBUTE_ID;
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ret > 0) {
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(ctxt,
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr,
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL, "The value '%s' of simple type 'xs:ID' is "
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "not a valid 'xs:NCName'",
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value, NULL);
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL)
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree((xmlChar *)value);
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr ownerElem,
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar *name)
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(ownerElem, (const char *) name);
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaPValAttrNodeID(ctxt, attr));
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetMaxOccurs:
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the maxOccurs property
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the default if not found, or the value
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int min, int max, int def, const char *expected)
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *val, *cur;
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "maxOccurs");
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (def);
60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(val, (const xmlChar *) "unbounded")) {
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (max != UNBOUNDED) {
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(ctxt,
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* XML_SCHEMAP_INVALID_MINOCCURS, */
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr, NULL, expected,
60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		val, NULL, NULL, NULL);
60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (def);
60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (UNBOUNDED);  /* encoding it with -1 might be another option */
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = val;
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_BLANK_CH(*cur))
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0) {
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPSimpleTypeErr(ctxt,
60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr, NULL, expected,
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    val, NULL, NULL, NULL);
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (def);
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*cur >= '0') && (*cur <= '9')) {
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = ret * 10 + (*cur - '0');
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_BLANK_CH(*cur))
60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Restrict the maximal value to Integer.
60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(ctxt,
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr, NULL, expected,
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    val, NULL, NULL, NULL);
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (def);
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetMinOccurs:
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the minOccurs property
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the default if not found, or the value
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int min, int max, int def, const char *expected)
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *val, *cur;
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "minOccurs");
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (def);
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = val;
60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_BLANK_CH(*cur))
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0) {
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPSimpleTypeErr(ctxt,
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr, NULL, expected,
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    val, NULL, NULL, NULL);
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (def);
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*cur >= '0') && (*cur <= '9')) {
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = ret * 10 + (*cur - '0');
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_BLANK_CH(*cur))
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur++;
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Restrict the maximal value to Integer.
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(ctxt,
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr, NULL, expected,
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    val, NULL, NULL, NULL);
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (def);
60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPGetBoolNodeValue:
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes:  owner designation
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem:  the owner as a schema item
61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node holding the value
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Converts a boolean string value into 1 or 0.
61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or 1.
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaBasicItemPtr ownerItem,
61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlNodePtr node)
61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *value = NULL;
61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0;
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = xmlNodeGetContent(node);
61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.2.1 Lexical representation
61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * An instance of a datatype that is defined as �boolean�
61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * can have the following legal literals {true, false, 1, 0}.
61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(BAD_CAST value, BAD_CAST "true"))
61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = 1;
61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false"))
61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = 0;
61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1"))
61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = 1;
61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0"))
61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = 0;
61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPSimpleTypeErr(ctxt,
61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INVALID_BOOLEAN,
61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ownerItem, node,
61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, BAD_CAST value,
61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL, NULL);
61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL)
61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(value);
61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (res);
61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetBooleanProp:
61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @def:  the default value
61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluate if a boolean property is set
61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the default if not found, 0 if found to be false,
61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1 if found to be true
61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlNodePtr node,
61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const char *name, int def)
61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *val;
61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlSchemaGetProp(ctxt, node, name);
61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val == NULL)
61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (def);
61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.2.1 Lexical representation
61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * An instance of a datatype that is defined as �boolean�
61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * can have the following legal literals {true, false, 1, 0}.
61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(val, BAD_CAST "true"))
61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def = 1;
61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(val, BAD_CAST "false"))
61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def = 0;
61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(val, BAD_CAST "1"))
61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	def = 1;
61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(val, BAD_CAST "0"))
61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def = 0;
61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPSimpleTypeErr(ctxt,
61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INVALID_BOOLEAN,
61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL,
61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlNodePtr) xmlSchemaGetPropNode(node, name),
61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, val, NULL, NULL, NULL);
61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (def);
61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Shema extraction from an Infoset			*
61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 ctxt, xmlSchemaPtr schema,
62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 xmlNodePtr node,
62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						 int topLevel);
62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  ctxt,
62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  xmlSchemaPtr schema,
62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  xmlNodePtr node,
62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						  int topLevel);
62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  ctxt,
62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  xmlSchemaPtr schema,
62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  xmlNodePtr node,
62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						  xmlSchemaTypeType parentType);
62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaPtr schema,
62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNodePtr node,
62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaItemListPtr uses,
62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int parentType);
62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           xmlSchemaPtr schema,
62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           xmlNodePtr node);
62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWildcardPtr
62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           xmlSchemaPtr schema, xmlNodePtr node);
62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrNodeValue:
62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the schema object owner if existent
62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the schema attribute node being validated
62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value
62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the built-in type to be validated against
62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validates a value against the given built-in type.
62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used internally for validation
62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of schema attribute values during parsing of the schema.
62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value is valid, a positive error code
62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of an internal or API error.
62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaBasicItemPtr ownerItem,
62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlAttrPtr attr,
62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *value,
62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr type)
62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: Should we move this to xmlschematypes.c? Hmm, but this
62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * one is really meant to be used internally, so better not.
62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (type == NULL) || (attr == NULL))
62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type != XML_SCHEMA_TYPE_BASIC) {
62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaPValAttrNodeValue",
62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "the given type is not a built-in type");
62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type->builtInType) {
62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_NCNAME:
62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_QNAME:
62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_ANYURI:
62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_TOKEN:
62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMAS_LANGUAGE:
62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValPredefTypeNode(type, value, NULL,
62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlNodePtr) attr);
62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default: {
62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaPValAttrNodeValue",
62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"validation using the given type is not supported while "
62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"parsing a schema");
62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Should we use the S4S error codes instead?
62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) {
62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaPValAttrNodeValue",
62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "failed to validate a schema attribute value");
62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ret > 0) {
62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_LIST(type))
62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(pctxt,
62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret, ownerItem, (xmlNodePtr) attr,
62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type, NULL, value, NULL, NULL, NULL);
62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrNode:
63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the schema object owner if existent
63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the schema attribute node being validated
63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the built-in type to be validated against
63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the resulting value if any
63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts and validates a value against the given built-in type.
63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used internally for validation
63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of schema attribute values during parsing of the schema.
63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value is valid, a positive error code
63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of an internal or API error.
63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaBasicItemPtr ownerItem,
63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlAttrPtr attr,
63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr type,
63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar **value)
63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *val;
63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (type == NULL) || (attr == NULL))
63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL)
63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*value = val;
63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr,
63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val, type));
63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttr:
63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node of the attribute
63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerDes: the designation of the parent element
63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerItem: the schema object owner if existent
63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ownerElem: the owner element node
63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the schema attribute node
63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the built-in type to be validated against
63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the resulting value if any
63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extracts and validates a value against the given built-in type.
63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used internally for validation
63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of schema attribute values during parsing of the schema.
63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value is valid, a positive error code
63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of an internal or API error.
63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaBasicItemPtr ownerItem,
63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlNodePtr ownerElem,
63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const char *name,
63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaTypePtr type,
63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar **value)
63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (type == NULL)) {
63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value != NULL)
63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *value = NULL;
63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type != XML_SCHEMA_TYPE_BASIC) {
63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value != NULL)
63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *value = NULL;
63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(ctxt, ownerElem,
63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INTERNAL,
63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Internal error: xmlSchemaPValAttr, the given "
63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "type '%s' is not a built-in type.\n",
63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->name, NULL);
63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(ownerElem, name);
63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
63815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value != NULL)
63825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *value = NULL;
63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
63845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr,
63865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type, value));
63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaPtr schema ATTRIBUTE_UNUSED,
63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlNodePtr node,
63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlAttrPtr attr,
63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *namespaceName)
63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Pointer comparison instead? */
63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(pctxt->targetNamespace, namespaceName))
63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(xmlSchemaNs, namespaceName))
64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check if the referenced namespace was <import>ed.
64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_BUCKET(pctxt)->relations != NULL) {
64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSchemaRelationPtr rel;
64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rel = WXS_BUCKET(pctxt)->relations;
64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlStrEqual(namespaceName, rel->importNamespace))
64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rel = rel->next;
64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (rel != NULL);
64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * No matching <import>ed namespace found.
64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node;
64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (namespaceName == NULL)
64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"References from this schema to components in no "
64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"namespace are not allowed, since not indicated by an "
64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"import statement", NULL, NULL);
64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"References from this schema to components in the "
64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"namespace '%s' are not allowed, since not indicated by an "
64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"import statement", namespaceName, NULL);
64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (XML_SCHEMAP_SRC_RESOLVE);
64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseLocalAttributes:
64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the hosting type where the attributes will be anchored
64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses attribute uses and attribute declarations and
64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute group references.
64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlNodePtr *child, xmlSchemaItemListPtr *list,
64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int parentType, int *hasRefs)
64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *item;
64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((IS_SCHEMA((*child), "attribute")) ||
64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (IS_SCHEMA((*child), "attributeGroup"))) {
64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (IS_SCHEMA((*child), "attribute")) {
64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item = xmlSchemaParseLocalAttribute(ctxt, schema, *child,
64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*list, parentType);
64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child);
64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((item != NULL) && (hasRefs != NULL))
64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*hasRefs = 1;
64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (item != NULL) {
64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*list == NULL) {
64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Customize grow factor. */
64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*list = xmlSchemaItemListCreate();
64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*list == NULL)
64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaItemListAddSize(*list, 2, item) == -1)
64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *child = (*child)->next;
64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
64805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAnnotation:
64815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
64825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Attrribute declaration
64865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 if the declaration is improper and
64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         1 in case of success.
64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAnnotPtr
64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed)
64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr ret;
64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
64965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
64975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int barked = 0;
64985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
65005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * INFO: S4S completed.
65015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * id = ID
65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {any attributes with non-schema namespace . . .}>
65055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Content: (appinfo | documentation)*
65065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
65075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (node == NULL))
65085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
65095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needed)
65105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaNewAnnot(ctxt, node);
65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = NULL;
65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((attr->ns == NULL) &&
65165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!xmlStrEqual(attr->name, BAD_CAST "id"))) ||
65175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((attr->ns != NULL) &&
65185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
65195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child != NULL) {
65315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "appinfo")) {
65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: make available the content of "appinfo". */
65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * source = anyURI
65355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {any attributes with non-schema namespace . . .}>
65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Content: ({any})*
65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = child->properties;
65395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (attr != NULL) {
65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (((attr->ns == NULL) &&
65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (!xmlStrEqual(attr->name, BAD_CAST "source"))) ||
65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     ((attr->ns != NULL) &&
65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
65465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = attr->next;
65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
65505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPValAttr(ctxt, NULL, child, "source",
65515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
65525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
65535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "documentation")) {
65545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: make available the content of "documentation". */
65555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * source = anyURI
65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {any attributes with non-schema namespace . . .}>
65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Content: ({any})*
65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = child->properties;
65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (attr != NULL) {
65625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (attr->ns == NULL) {
65635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!xmlStrEqual(attr->name, BAD_CAST "source")) {
65645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalAttrErr(ctxt,
65655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
65665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
65675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(attr->ns->href, xmlSchemaNs) ||
65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlStrEqual(attr->name, BAD_CAST "lang") &&
65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) {
65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalAttrErr(ctxt,
65735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
65745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
65755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
65765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = attr->next;
65775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
65785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Attribute "xml:lang".
65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang");
65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr != NULL)
65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPValAttrNode(ctxt, NULL, attr,
65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL);
65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
65865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
65875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!barked)
65885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPContentErr(ctxt,
65895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
65905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, child, NULL, "(appinfo | documentation)*");
65915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    barked = 1;
65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseFacet:
66015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
66025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
66035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
66045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Facet declaration
66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new type structure or NULL in case of error
66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaFacetPtr
66115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlNodePtr node)
66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetPtr facet;
66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *value;
66175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    facet = xmlSchemaNewFacet();
66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (facet == NULL) {
66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt, "allocating facet", node);
66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
66255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    facet->node = node;
66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = xmlSchemaGetProp(ctxt, node, "value");
66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL) {
66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE,
66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "Facet %s has no value\n", node->name, NULL);
66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeFacet(facet);
66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(node, "minInclusive")) {
66355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "minExclusive")) {
66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "maxInclusive")) {
66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "maxExclusive")) {
66415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "totalDigits")) {
66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "fractionDigits")) {
66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
66465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "pattern")) {
66475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_PATTERN;
66485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "enumeration")) {
66495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_ENUMERATION;
66505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "whiteSpace")) {
66515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_WHITESPACE;
66525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "length")) {
66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_LENGTH;
66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "maxLength")) {
66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MAXLENGTH;
66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(node, "minLength")) {
66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->type = XML_SCHEMA_FACET_MINLENGTH;
66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
66595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE,
66605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "Unknown facet type %s\n", node->name, NULL);
66615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeFacet(facet);
66625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
66635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    facet->value = value;
66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *fixed;
66695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fixed = xmlSchemaGetProp(ctxt, node, "fixed");
66715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fixed != NULL) {
66725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(fixed, BAD_CAST "true"))
66735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet->fixed = 1;
66745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
66755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
66815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
66835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD,
66845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "Facet %s has unexpected child content\n",
66855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       node->name, NULL);
66865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (facet);
66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseWildcardNs:
66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
66935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @wildc:  the wildcard, already created
66945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses the attribute "processContents" and "namespace"
66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of a xsd:anyAttribute and xsd:any.
66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if everything goes fine, a positive error code
67015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if something is not valid and -1 if an internal error occurs.
67025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaPtr schema ATTRIBUTE_UNUSED,
67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaWildcardPtr wildc,
67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr node)
67085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *pc, *ns, *dictnsItem;
67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *nsItem;
67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr tmp, lastNs = NULL;
67135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = xmlSchemaGetProp(ctxt, node, "processContents");
67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pc == NULL)
67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        || (xmlStrEqual(pc, (const xmlChar *) "strict"))) {
67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) {
67205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wildc->processContents = XML_SCHEMAS_ANY_SKIP;
67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) {
67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wildc->processContents = XML_SCHEMAS_ANY_LAX;
67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPSimpleTypeErr(ctxt,
67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(strict | skip | lax)", pc,
67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL, NULL);
67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
67325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
67335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Build the namespace constraints.
67345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "namespace");
67365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any")))
67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wildc->any = 1;
67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(ns, BAD_CAST "##other")) {
67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (wildc->negNsSet == NULL) {
67425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wildc->negNsSet->value = ctxt->targetNamespace;
67455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *end, *cur;
67475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = ns;
67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
67505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (IS_BLANK_CH(*cur))
67515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (end == cur)
67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsItem = xmlStrndup(cur, end - cur);
67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((xmlStrEqual(nsItem, BAD_CAST "##other")) ||
67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlStrEqual(nsItem, BAD_CAST "##any"))) {
67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSimpleTypeErr(ctxt,
67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER,
67625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, (xmlNodePtr) attr,
67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL,
67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "((##any | ##other) | List of (xs:anyURI | "
67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "(##targetNamespace | ##local)))",
67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nsItem, NULL, NULL, NULL);
67675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER;
67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) {
67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    dictnsItem = ctxt->targetNamespace;
67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(nsItem, BAD_CAST "##local")) {
67725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    dictnsItem = NULL;
67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Validate the item (anyURI).
67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPValAttrNodeValue(ctxt, NULL, attr,
67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1);
67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Avoid dublicate namespaces.
67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = wildc->nsSet;
67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != NULL) {
67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (dictnsItem == tmp->value)
67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = tmp->next;
67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == NULL) {
67915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
67925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (tmp == NULL) {
67935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(nsItem);
67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp->value = dictnsItem;
67975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp->next = NULL;
67985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (wildc->nsSet == NULL)
67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			wildc->nsSet = tmp;
68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (lastNs != NULL)
68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			lastNs->next = tmp;
68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastNs = tmp;
68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsItem);
68075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = end;
68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (*cur != 0);
68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaParticlePtr item ATTRIBUTE_UNUSED,
68165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlNodePtr node,
68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int minOccurs,
68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int maxOccurs) {
68195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((maxOccurs == 0) && ( minOccurs == 0))
68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (maxOccurs != UNBOUNDED) {
68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
68245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Maybe we should better not create the particle,
68255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* if min/max is invalid, since it could confuse the build of the
68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* content model.
68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
68285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
68295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.9.6 Schema Component Constraint: Particle Correct
68305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
68315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (maxOccurs < 1) {
68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
68345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.2 {max occurs} must be greater than or equal to 1.
68355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
68365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomAttrErr(ctxt,
68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_P_PROPS_CORRECT_2_2,
68385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL,
68395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetPropNode(node, "maxOccurs"),
68405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value must be greater than or equal to 1");
68415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_2);
68425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (minOccurs > maxOccurs) {
68435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
68445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.1 {min occurs} must not be greater than {max occurs}.
68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomAttrErr(ctxt,
68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_P_PROPS_CORRECT_2_1,
68485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL,
68495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetPropNode(node, "minOccurs"),
68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value must not be greater than the value of 'maxOccurs'");
68515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_1);
68525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
68535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
68555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAny:
68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
68615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parsea a XML schema <any> element. A particle and wildcard
68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be created (except if minOccurs==maxOccurs==0, in this case
68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nothing will be created).
68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
68675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0
68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
68705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaParticlePtr
68715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
68725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  xmlNodePtr node)
68735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
68745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr particle;
68755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
68765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardPtr wild;
68775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int min, max;
68785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
68795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot = NULL;
68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
68825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
68865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
68875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
68885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
68895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
68935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
68945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
68955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
68965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
68975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
68985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
68995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
69025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
69055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * minOccurs/maxOccurs.
69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
69085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"(xs:nonNegativeInteger | unbounded)");
69095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1,
69105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"xs:nonNegativeInteger");
69115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
69125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
69135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create & parse the wildcard.
69145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
69155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node);
69165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild == NULL)
69175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
69185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParseWildcardNs(ctxt, schema, wild, node);
69195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
69205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
69215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
69225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
69235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
69245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        annot = xmlSchemaParseAnnotation(ctxt, child, 1);
69255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
69265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
69285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
69295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
69305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
69315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?)");
69325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
69345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * No component if minOccurs==maxOccurs==0.
69355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
69365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((min == 0) && (max == 0)) {
69375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Don't free the wildcard, since it's already on the list. */
69385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
69395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
69415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create the particle.
69425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
69435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    particle = xmlSchemaAddParticle(ctxt, node, min, max);
69445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle == NULL)
69455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
69465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    particle->annot = annot;
69475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    particle->children = (xmlSchemaTreeItemPtr) wild;
69485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (particle);
69505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
69535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseNotation:
69545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
69555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
69565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
69575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Notation declaration
69595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new structure or NULL in case of error
69615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
69625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaNotationPtr
69635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
69645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlNodePtr node)
69655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
69665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
69675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNotationPtr ret;
69685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
69695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
69715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
69725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = xmlSchemaGetProp(ctxt, node, "name");
69735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
69745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME,
69755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "Notation has no name\n", NULL, NULL);
69765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
69775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddNotation(ctxt, schema, name,
69795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->targetNamespace, node);
69805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
69815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
69825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
69835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
69855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
69865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
69875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
69885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
69905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
69915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
69925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
69935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?)");
69945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
69975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
70005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAnyAttribute:
70015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
70025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
70035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
70045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema AnyAttrribute declaration
70065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a wildcard or NULL.
70095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
70105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWildcardPtr
70115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
70125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           xmlSchemaPtr schema, xmlNodePtr node)
70135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
70145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardPtr ret;
70155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
70165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
70175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
70195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
70205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
70225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node);
70235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
70245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
70255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
70275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
70285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
70295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
70305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
70315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
70325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
70335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
70345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
70355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
70365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
70375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
70385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
70395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
70405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
70415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
70425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
70435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
70455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
70465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse the namespace list.
70475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
70485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0)
70495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
70505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
70515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
70525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
70535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
70545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
70555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
70565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
70575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
70595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
70605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
70615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
70625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?)");
70635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
70665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
70675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
70705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAttribute:
70715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
70725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
70735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
70745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Attrribute declaration
70765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
70775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute declaration.
70795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
70805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
70815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
70825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaPtr schema,
70835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNodePtr node,
70845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaItemListPtr uses,
70855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int parentType)
70865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
70875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *attrValue, *name = NULL, *ns = NULL;
70885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr use = NULL;
70895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
70905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
70915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL;
70925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
70935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int	nberrors, hasForm = 0, defValueType = 0;
70945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_DEF_VAL_DEFAULT 1
70965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ATTR_DEF_VAL_FIXED 2
70975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
70995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 3.2.3 Constraints on XML Representations of Attribute Declarations
71005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
71015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
71035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
71045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "ref");
71055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
71065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaPValAttrNodeQName(pctxt, schema,
71075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, attr, &tmpNs, &tmpName) != 0) {
71085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
71095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
71105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0)
71115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
71125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	isRef = 1;
71135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
71145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nberrors = pctxt->nberrors;
71155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
71165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
71175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
71185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
71195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
71205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
71215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (isRef) {
71225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attr->name, BAD_CAST "id")) {
71235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPValAttrNodeID(pctxt, attr);
71245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "ref")) {
71265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
71285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
71295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
71305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "id")) {
71325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPValAttrNodeID(pctxt, attr);
71335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "type")) {
71355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPValAttrNodeQName(pctxt, schema, NULL,
71365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attr, &tmpNs, &tmpName);
71375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "form")) {
71395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
71405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Evaluate the target namespace
71415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
71425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasForm = 1;
71435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrValue = xmlSchemaGetNodeContent(pctxt,
71445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlNodePtr) attr);
71455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
71465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = pctxt->targetNamespace;
71475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified"))
71485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
71495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPSimpleTypeErr(pctxt,
71505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
71515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, (xmlNodePtr) attr,
71525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, "(qualified | unqualified)",
71535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attrValue, NULL, NULL, NULL);
71545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
71555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto attr_next;
71565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
71575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
71585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->name, BAD_CAST "use")) {
71595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
71615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Maybe we need to normalize the value beforehand. */
71625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attrValue, BAD_CAST "optional"))
71635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
71645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (xmlStrEqual(attrValue, BAD_CAST "prohibited"))
71655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
71665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (xmlStrEqual(attrValue, BAD_CAST "required"))
71675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
71685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else {
71695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPSimpleTypeErr(pctxt,
71705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_INVALID_ATTR_USE,
71715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, (xmlNodePtr) attr,
71725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, "(optional | prohibited | required)",
71735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attrValue, NULL, NULL, NULL);
71745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
71755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto attr_next;
71765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->name, BAD_CAST "default")) {
71775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
71785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 3.2.3 : 1
71795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* default and fixed must not both be present.
71805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
71815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (defValue) {
71825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPMutualExclAttrErr(pctxt,
71835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_ATTRIBUTE_1,
71845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, attr, "default", "fixed");
71855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
71865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
71875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
71885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
71895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto attr_next;
71905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) {
71915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
71925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 3.2.3 : 1
71935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* default and fixed must not both be present.
71945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
71955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (defValue) {
71965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPMutualExclAttrErr(pctxt,
71975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_ATTRIBUTE_1,
71985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, attr, "default", "fixed");
71995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
72005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
72015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    defValueType = WXS_ATTR_DEF_VAL_FIXED;
72025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
72035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto attr_next;
72045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
72055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs))
72065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto attr_next;
72075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPIllegalAttrErr(pctxt,
72095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
72105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)attr_next:
72125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
72135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
72145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
72155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.3 : 2
72165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If default and use are both present, use must have
72175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the actual value optional.
72185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
72195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
72205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
72215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(pctxt,
72225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_ATTRIBUTE_2,
72235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, NULL,
72245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(optional | prohibited | required)", NULL,
72255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The value of the attribute 'use' must be 'optional' "
72265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "if the attribute 'default' is present",
72275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL);
72285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
72295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
72305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We want correct attributes.
72315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
72325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nberrors != pctxt->nberrors)
72335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
72345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! isRef) {
72355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributePtr attrDecl;
72365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */
72385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR))
72395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = pctxt->targetNamespace;
72405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
72415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.2.6 Schema Component Constraint: xsi: Not Allowed
72425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Move this to the component layer.
72435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
72445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlStrEqual(ns, xmlSchemaInstanceNs)) {
72455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
72465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_NO_XSI,
72475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
72485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The target namespace must not match '%s'",
72495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaInstanceNs, NULL);
72505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "name");
72525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
72535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
72545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, "name", NULL);
72555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
72565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
72585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
72595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
72605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
72625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.2.6 Schema Component Constraint: xmlns Not Allowed
72635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Move this to the component layer.
72645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
72655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlStrEqual(name, BAD_CAST "xmlns")) {
72665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(pctxt,
72675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_NO_XMLNS,
72685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr,
72695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
72705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value of the attribute must not match 'xmlns'",
72715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
72725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
72735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
72755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto check_children;
72765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
72775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the attribute use component.
72785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
72795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = xmlSchemaAddAttributeUse(pctxt, node);
72805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (use == NULL)
72815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
72825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use->occurs = occurs;
72835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
72845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the attribute declaration.
72855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
72865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0);
72875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attrDecl == NULL)
72885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
72895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmpName != NULL) {
72905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrDecl->typeName = tmpName;
72915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrDecl->typeNs = tmpNs;
72925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use->attrDecl = attrDecl;
72945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
72955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Value constraint.
72965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
72975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (defValue != NULL) {
72985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrDecl->defValue = defValue;
72995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
73005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
73015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
73035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr ref;
73045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the attribute use component.
73075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = xmlSchemaAddAttributeUse(pctxt, node);
73095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (use == NULL)
73105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
73115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We need to resolve the reference at later stage.
73135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(pctxt, use);
73155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use->occurs = occurs;
73165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a QName reference to the attribute declaration.
73185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
73205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpName, tmpNs);
73215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ref == NULL)
73225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
73235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Assign the reference. This will be substituted for the
73255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* referenced attribute declaration when the QName is resolved.
73265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use->attrDecl = WXS_ATTR_CAST ref;
73285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Value constraint.
73305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (defValue != NULL)
73325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use->defValue = defValue;
73335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
73345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
73355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)check_children:
73385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
73395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
73405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
73415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
73425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
73435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributeUseProhibPtr prohib;
73445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "annotation")) {
73465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(pctxt, child, 0);
73475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
73485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (child != NULL) {
73505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(pctxt,
73515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
73525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
73535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?)");
73545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for pointlessness of attribute prohibitions.
73575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
73595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
73605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
73615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
73625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Skipping attribute use prohibition, since it is "
73635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"pointless inside an <attributeGroup>",
73645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL, NULL);
73655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
73665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
73675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
73685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
73695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
73705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Skipping attribute use prohibition, since it is "
73715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"pointless when extending a type",
73725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL, NULL);
73735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
73745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! isRef) {
73765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpName = name;
73775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpNs = ns;
73785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
73805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for duplicate attribute prohibitions.
73815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
73825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (uses) {
73835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i;
73845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < uses->nbItems; i++) {
73865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		use = uses->items[i];
73875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
73885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
73895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
73905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
73915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
73925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
73945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
73955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node, NULL,
73965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Skipping duplicate attribute use prohibition '%s'",
73975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatQName(&str, tmpNs, tmpName),
73985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
73995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
74005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(NULL);
74015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
74025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
74035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
74045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
74055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the attribute prohibition helper component.
74065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
74075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohib = xmlSchemaAddAttributeUseProhib(pctxt);
74085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prohib == NULL)
74095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
74105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohib->node = node;
74115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohib->name = tmpName;
74125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohib->targetNamespace = tmpNs;
74135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isRef) {
74145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
74155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We need at least to resolve to the attribute declaration.
74165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
74175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_ADD_PENDING(pctxt, prohib);
74185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
74195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(WXS_BASIC_CAST prohib);
74205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
74215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "annotation")) {
74225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
74235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Should this go into the attr decl?
74245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
74255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
74265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
74275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
74285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isRef) {
74295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (child != NULL) {
74305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (IS_SCHEMA(child, "simpleType"))
74315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
74325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 3.2.3 : 3.2
74335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * If ref is present, then all of <simpleType>,
74345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * form and type must be absent.
74355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
74365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPContentErr(pctxt,
74375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_ATTRIBUTE_3_2,
74385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, node, child, NULL,
74395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"(annotation?)");
74405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
74415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPContentErr(pctxt,
74425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
74435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, node, child, NULL,
74445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"(annotation?)");
74455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
74465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
74475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (IS_SCHEMA(child, "simpleType")) {
74485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_ATTRUSE_DECL(use)->typeName != NULL) {
74495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
74505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 3.2.3 : 4
74515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * type and <simpleType> must not both be present.
74525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
74535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
74545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, node, child,
74555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The attribute 'type' and the <simpleType> child "
74565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"are mutually exclusive", NULL);
74575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
74585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ATTRUSE_TYPEDEF(use) =
74595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaParseSimpleType(pctxt, schema, child, 0);
74605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		child = child->next;
74615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
74625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (child != NULL)
74635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
74645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
74655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, simpleType?)");
74665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
74675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
74685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (WXS_BASIC_CAST use);
74695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
74705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributePtr
74735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
74745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaPtr schema,
74755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlNodePtr node)
74765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
74775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *attrValue;
74785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr ret;
74795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
74805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
74815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
74835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Note that the w3c spec assumes the schema to be validated with schema
74845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * for schemas beforehand.
74855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
74865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 3.2.3 Constraints on XML Representations of Attribute Declarations
74875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
74885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
74895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
74905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
74915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.3 : 3.1
74925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * One of ref or name must be present, but not both
74935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
74945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "name");
74955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
74965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
74975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "name", NULL);
74985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
74995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
75015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
75025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
75035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.6 Schema Component Constraint: xmlns Not Allowed
75065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Move this to the component layer.
75075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) {
75095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(pctxt,
75105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_NO_XMLNS,
75115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, (xmlNodePtr) attr,
75125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
75135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The value of the attribute must not match 'xmlns'",
75145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL);
75155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
75165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.2.6 Schema Component Constraint: xsi: Not Allowed
75195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Move this to the component layer.
75205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *       Or better leave it here and add it to the component layer
75215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *       if we have a schema construction API.
75225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
75245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomErr(ACTXT_CAST pctxt,
75255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_NO_XSI, node, NULL,
75265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The target namespace must not match '%s'",
75275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaInstanceNs, NULL);
75285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddAttribute(pctxt, schema, attrValue,
75315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->targetNamespace, node, 1);
75325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
75335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
75345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
75355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
75385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
75405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
75415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
75425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
75435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "default")) &&
75445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
75455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
75465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "type")))
75475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
75485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(pctxt,
75495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
75505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
75515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
75525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(pctxt,
75535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
75545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
75555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
75565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrQName(pctxt, schema, NULL,
75585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node, "type", &ret->typeNs, &ret->typeName);
75595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
75615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "fixed".
75635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed");
75655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->defValue != NULL)
75665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->flags |= XML_SCHEMAS_ATTR_FIXED;
75675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "default".
75695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "default");
75715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
75725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
75735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.2.3 : 1
75745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* default and fixed must not both be present.
75755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
75765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->flags & XML_SCHEMAS_ATTR_FIXED) {
75775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1,
75785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST ret, attr, "default", "fixed");
75795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
75805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
75815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
75835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
75845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
75855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
75865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
75875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
75885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
75895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "simpleType")) {
75915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->typeName != NULL) {
75925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
75935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.2.3 : 4
75945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * type and <simpleType> must not both be present.
75955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
75965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
75975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child,
75985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The attribute 'type' and the <simpleType> child "
75995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"are mutually exclusive", NULL);
76005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
76015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0);
76025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
76035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL)
76055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
76065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
76075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, simpleType?)");
76085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
76105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
76115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
76135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAttributeGroupRef:
76145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
76155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
76165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
76175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
76185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse an attribute group definition reference.
76195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that a reference to an attribute group does not
76205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * correspond to any component at all.
76215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
76225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
76235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute group or NULL in case of error.
76245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
76255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaQNameRefPtr
76265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
76275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaPtr schema,
76285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlNodePtr node)
76295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
76305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ret;
76315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
76325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
76335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *refNs = NULL, *ref = NULL;
76345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
76365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
76375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "ref");
76395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
76405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(pctxt,
76415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
76425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "ref", NULL);
76435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
76445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrNodeQName(pctxt, schema,
76465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, attr, &refNs, &ref);
76475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0)
76485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
76495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
76515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
76525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
76535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
76545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
76555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
76565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
76575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "id")))
76585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
76595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(pctxt,
76605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
76615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
76625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
76635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(pctxt,
76645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
76655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
76665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
76675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Attribute ID */
76695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
76705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
76725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
76735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
76745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
76755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
76765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
76775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: We do not have a place to store the annotation, do we?
76785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
76795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseAnnotation(pctxt, child, 0);
76805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
76815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
76835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(pctxt,
76845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
76855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
76865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?)");
76875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
76905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle attribute group redefinitions.
76915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
76925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->isRedefine && pctxt->redef &&
76935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(pctxt->redef->item->type ==
76945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
76955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(ref == pctxt->redef->refName) &&
76965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(refNs == pctxt->redef->refTargetNs))
76975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
76985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
76995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC src-redefine:
77005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (7.1) "If it has an <attributeGroup> among its contents
77015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the �actual value� of whose ref [attribute] is the same
77025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* as the �actual value� of its own name attribute plus
77035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* target namespace, then it must have exactly one such group."
77045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (pctxt->redefCounter != 0) {
77065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
77075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
77095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
77105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The redefining attribute group definition "
77115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"'%s' must not contain more than one "
77125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"reference to the redefined definition",
77135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str, refNs, ref), NULL);
77145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
77155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
77165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
77175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redefCounter++;
77185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* URGENT TODO: How to ensure that the reference will not be
77205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* handled by the normal component resolution mechanism?
77215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaNewQNameRef(pctxt,
77235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
77245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL)
77255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
77265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->node = node;
77275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redef->reference = WXS_BASIC_CAST ret;
77285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
77295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a QName-reference helper component. We will substitute this
77315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* component for the attribute uses of the referenced attribute group
77325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition.
77335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaNewQNameRef(pctxt,
77355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
77365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL)
77375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
77385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->node = node;
77395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Add to pending items, to be able to resolve the reference. */
77405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(pctxt, ret);
77415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
77435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
77445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
77465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseAttributeGroupDefinition:
77475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  a schema validation context
77485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
77495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
77505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
77515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Attribute Group declaration
77525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
77535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
77545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute group definition or NULL in case of error.
77555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
77565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttributeGroupPtr
77575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
77585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaPtr schema,
77595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlNodePtr node)
77605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
77615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
77625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr ret;
77635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
77645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
77655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int hasRefs = 0;
77665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
77685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
77695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "name");
77715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
77725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(pctxt,
77735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
77745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "name", NULL);
77755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
77765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
77785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The name is crucial, exit if invalid.
77795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
77805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPValAttrNode(pctxt,
77815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, attr,
77825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
77835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
77845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema,
77865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name, pctxt->targetNamespace, node);
77875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
77885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
77895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
77905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
77915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
77925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
77935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
77945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
77955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
77965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "id")))
77975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
77985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(pctxt,
77995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
78005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
78015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
78025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(pctxt,
78035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
78045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
78055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
78065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Attribute ID */
78085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
78095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
78115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
78135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
78145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
78155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
78165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse contained attribute decls/refs.
78195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaParseLocalAttributes(pctxt, schema, &child,
78215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaItemListPtr *) &(ret->attrUses),
78225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
78235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
78245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hasRefs)
78255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
78265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse the attribute wildcard.
78285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "anyAttribute")) {
78305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
78315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema, child);
78325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
78335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
78355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(pctxt,
78365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
78375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
78385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
78395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
78415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
78445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrFormDefault:
78455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value
78465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: the flags to be modified
78475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagQualified: the specific flag for "qualified"
78485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
78495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value is valid, 1 otherwise.
78505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
78515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
78525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrFormDefault(const xmlChar *value,
78535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int *flags,
78545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int flagQualified)
78555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
78565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(value, BAD_CAST "qualified")) {
78575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if  ((*flags & flagQualified) == 0)
78585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *flags |= flagQualified;
78595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!xmlStrEqual(value, BAD_CAST "unqualified"))
78605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
78615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
78635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
78665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaPValAttrBlockFinal:
78675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value
78685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: the flags to be modified
78695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagAll: the specific flag for "#all"
78705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagExtension: the specific flag for "extension"
78715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagRestriction: the specific flag for "restriction"
78725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagSubstitution: the specific flag for "substitution"
78735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagList: the specific flag for "list"
78745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flagUnion: the specific flag for "union"
78755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
78765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validates the value of the attribute "final" and "block". The value
78775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is converted into the specified flag values and returned in @flags.
78785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
78795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the value is valid, 1 otherwise.
78805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
78815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
78835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPValAttrBlockFinal(const xmlChar *value,
78845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int *flags,
78855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagAll,
78865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagExtension,
78875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagRestriction,
78885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagSubstitution,
78895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagList,
78905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int flagUnion)
78915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
78925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
78935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: This does not check for dublicate entries.
78965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((flags == NULL) || (value == NULL))
78985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
78995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value[0] == 0)
79005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
79015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(value, BAD_CAST "#all")) {
79025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (flagAll != -1)
79035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *flags |= flagAll;
79045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
79055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (flagExtension != -1)
79065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*flags |= flagExtension;
79075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (flagRestriction != -1)
79085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*flags |= flagRestriction;
79095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (flagSubstitution != -1)
79105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*flags |= flagSubstitution;
79115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (flagList != -1)
79125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*flags |= flagList;
79135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (flagUnion != -1)
79145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*flags |= flagUnion;
79155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
79165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
79175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *end, *cur = value;
79185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *item;
79195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
79215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (IS_BLANK_CH(*cur))
79225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
79235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
79245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
79255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
79265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (end == cur)
79275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
79285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item = xmlStrndup(cur, end - cur);
79295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(item, BAD_CAST "extension")) {
79305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flagExtension != -1) {
79315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((*flags & flagExtension) == 0)
79325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*flags |= flagExtension;
79335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
79345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = 1;
79355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(item, BAD_CAST "restriction")) {
79365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flagRestriction != -1) {
79375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((*flags & flagRestriction) == 0)
79385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*flags |= flagRestriction;
79395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
79405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = 1;
79415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(item, BAD_CAST "substitution")) {
79425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flagSubstitution != -1) {
79435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((*flags & flagSubstitution) == 0)
79445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*flags |= flagSubstitution;
79455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
79465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = 1;
79475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(item, BAD_CAST "list")) {
79485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flagList != -1) {
79495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((*flags & flagList) == 0)
79505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*flags |= flagList;
79515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
79525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = 1;
79535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(item, BAD_CAST "union")) {
79545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flagUnion != -1) {
79555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((*flags & flagUnion) == 0)
79565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*flags |= flagUnion;
79575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
79585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = 1;
79595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
79605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = 1;
79615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (item != NULL)
79625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(item);
79635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = end;
79645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while ((ret == 0) && (*cur != 0));
79655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
79685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
79715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
79725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaIDCPtr idc,
79735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaIDCSelectPtr selector,
79745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlAttrPtr attr,
79755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int isField)
79765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
79775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
79785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
79805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * c-selector-xpath:
79815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Selector Value OK
79825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
79835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: 1 The {selector} must be a valid XPath expression, as defined
79845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * in [XPath].
79855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
79865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selector == NULL) {
79875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(ctxt, idc->node,
79885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INTERNAL,
79895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Internal error: xmlSchemaCheckCSelectorXPath, "
79905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "the selector is not specified.\n", NULL, NULL);
79915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
79925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL)
79945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = idc->node;
79955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
79965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = (xmlNodePtr) attr;
79975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selector->xpath == NULL) {
79985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
79995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: Adjust error code. */
80005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
80015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
80025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The XPath expression of the selector is not valid", NULL);
80035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
80045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
80055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar **nsArray = NULL;
80065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr *nsList = NULL;
80075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
80085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Compile the XPath expression.
80095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
80105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
80115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: We need the array of in-scope namespaces for compilation.
80125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Call xmlPatterncompile with different options for selector/
80135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* field.
80145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
80155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL)
80165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsList = NULL;
80175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
80185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsList = xmlGetNsList(attr->doc, attr->parent);
80195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
80205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Build an array of prefixes and namespaces.
80215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
80225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsList != NULL) {
80235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i, count = 0;
80245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; nsList[i] != NULL; i++)
80265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		count++;
80275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsArray = (const xmlChar **) xmlMalloc(
80295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(count * 2 + 1) * sizeof(const xmlChar *));
80305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsArray == NULL) {
80315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPErrMemory(ctxt, "allocating a namespace array",
80325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL);
80335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(nsList);
80345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
80355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
80365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < count; i++) {
80375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsArray[2 * i] = nsList[i]->href;
80385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsArray[2 * i + 1] = nsList[i]->prefix;
80395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
80405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsArray[count * 2] = NULL;
80415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsList);
80425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
80435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
80445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Differentiate between "selector" and "field".
80455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
80465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isField)
80475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
80485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, XML_PATTERN_XSFIELD, nsArray);
80495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
80505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
80515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, XML_PATTERN_XSSEL, nsArray);
80525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsArray != NULL)
80535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((xmlChar **) nsArray);
80545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (selector->xpathComp == NULL) {
80565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
80575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Adjust error code? */
80585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
80595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
80605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The XPath expression '%s' could not be "
80615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"compiled", selector->xpath);
80625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
80635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
80645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
80655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
80665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
80675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ADD_ANNOTATION(annot)   \
80695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr cur = item->annot; \
80705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->annot == NULL) {  \
80715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->annot = annot;    \
80725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (annot);         \
80735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }                           \
80745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = item->annot;          \
80755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->next != NULL) {    \
80765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;	\
80775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }                           \
80785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = annot;
80795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
80815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAssignAnnotation:
80825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the schema component
80835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @annot: the annotation
80845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
80855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds the annotation to the given schema component.
80865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
80875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the given annotaion.
80885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
80895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAnnotPtr
80905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
80915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaAnnotPtr annot)
80925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
80935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((annItem == NULL) || (annot == NULL))
80945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
80955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (annItem->type) {
80965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ELEMENT: {
80975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem;
80985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
80995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTE: {
81025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem;
81035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
81075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY: {
81085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem;
81095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_PARTICLE:
81135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEY:
81145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_KEYREF:
81155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_IDC_UNIQUE: {
81165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem;
81175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
81215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaAttributeGroupPtr item =
81225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaAttributeGroupPtr) annItem;
81235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_NOTATION: {
81275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem;
81285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MININCLUSIVE:
81325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MINEXCLUSIVE:
81335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXINCLUSIVE:
81345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
81355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_TOTALDIGITS:
81365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_FRACTIONDIGITS:
81375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_PATTERN:
81385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_ENUMERATION:
81395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_WHITESPACE:
81405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_LENGTH:
81415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MAXLENGTH:
81425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_MINLENGTH: {
81435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem;
81445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SIMPLE:
81485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_COMPLEX: {
81495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem;
81505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP: {
81545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem;
81555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_SEQUENCE:
81595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_CHOICE:
81605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ALL: {
81615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem;
81625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ADD_ANNOTATION(annot)
81635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
81645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
81665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     xmlSchemaPCustomErr(NULL,
81675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_INTERNAL,
81685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL,
81695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Internal error: xmlSchemaAddAnnotation, "
81705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The item is not a annotated schema component", NULL);
81715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     break;
81725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
81735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (annot);
81745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
81755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
81775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseIDCSelectorAndField:
81785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
81795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
81805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
81815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
81825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses a XML Schema identity-contraint definition's
81835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <selector> and <field> elements.
81845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
81855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parsed identity-constraint definition.
81865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
81875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaIDCSelectPtr
81885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
81895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaIDCPtr idc,
81905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlNodePtr node,
81915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  int isField)
81925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
81935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr item;
81945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
81955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
81965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
81985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
81995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
82005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
82015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
82025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
82035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
82045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "xpath"))) {
82055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
82065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
82075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
82085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
82095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
82105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
82115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
82125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
82135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
82155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create the item.
82165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
82175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect));
82185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item == NULL) {
82195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(ctxt,
82205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating a 'selector' of an identity-constraint definition",
82215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL);
82225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
82235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(item, 0, sizeof(xmlSchemaIDCSelect));
82255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
82265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "xpath" (mandatory).
82275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
82285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "xpath");
82295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
82305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	xmlSchemaPMissingAttrErr(ctxt,
82315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
82325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
82335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "name", NULL);
82345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
82355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
82365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
82375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* URGENT TODO: "field"s have an other syntax than "selector"s.
82385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
82395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr,
82415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    isField) == -1) {
82425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(ctxt,
82435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlNodePtr) attr,
82445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_INTERNAL,
82455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Internal error: xmlSchemaParseIDCSelectorAndField, "
82465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"validating the XPath expression of a IDC selector.\n",
82475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
82485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
82495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
82525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
82535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
82545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
82555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
82565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
82575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
82585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the parent IDC.
82595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
82605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
82615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
82625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
82635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
82655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
82665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
82675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
82685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?)");
82695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (item);
82725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
82735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
82755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseIDC:
82765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
82775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
82785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
82795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
82805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses a XML Schema identity-contraint definition.
82815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
82825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parsed identity-constraint definition.
82835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
82845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaIDCPtr
82855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
82865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaPtr schema,
82875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlNodePtr node,
82885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  xmlSchemaTypeType idcCategory,
82895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  const xmlChar *targetNamespace)
82905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
82915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr item = NULL;
82925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
82935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
82945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name = NULL;
82955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCSelectPtr field = NULL, lastField = NULL;
82965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
82985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
82995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
83015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
83025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
83035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
83045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
83055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
83065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!xmlStrEqual(attr->name, BAD_CAST "refer")))) {
83075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
83085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
83095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
83105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
83115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
83125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
83135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
83145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
83155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
83175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "name" (mandatory).
83185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "name");
83205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
83215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(ctxt,
83225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
83235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
83245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "name", NULL);
83255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
83265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlSchemaPValAttrNode(ctxt,
83275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, attr,
83285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
83295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
83305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create the component. */
83325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace,
83335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	idcCategory, node);
83345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item == NULL)
83355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
83365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
83385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
83395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
83405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute "refer" (mandatory).
83415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
83425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "refer");
83435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
83445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(ctxt,
83455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_MISSING,
83465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
83475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"refer", NULL);
83485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
83495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
83505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Create a reference item.
83515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
83525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
83535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
83545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (item->ref == NULL)
83555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (NULL);
83565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPValAttrNodeQName(ctxt, schema,
83575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, attr,
83585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&(item->ref->targetNamespace),
83595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&(item->ref->name));
83605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCheckReference(ctxt, schema, node, attr,
83615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		item->ref->targetNamespace);
83625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
83635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
83655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
83665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
83685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
83695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
83705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
83715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
83735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
83745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_MISSING,
83755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child,
83765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"A child element is missing",
83775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, (selector, field+))");
83785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
83805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Child element <selector>.
83815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "selector")) {
83835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
83845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item, child, 0);
83855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
83865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
83875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Child elements <field>.
83885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
83895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "field")) {
83905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
83915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		field = xmlSchemaParseIDCSelectorAndField(ctxt,
83925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item, child, 1);
83935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (field != NULL) {
83945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    field->index = item->nbFields;
83955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item->nbFields++;
83965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (lastField != NULL)
83975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			lastField->next = field;
83985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
83995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			item->fields = field;
84005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastField = field;
84015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
84025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		child = child->next;
84035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (IS_SCHEMA(child, "field"));
84045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
84055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
84065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
84075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child,
84085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, "(annotation?, (selector, field+))");
84095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
84125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
84135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
84145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
84155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?, (selector, field+))");
84165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (item);
84195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
84205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
84225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseElement:
84235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
84245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
84255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
84265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @topLevel: indicates if this is global declaration
84275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
84285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses a XML schema element declaration.
84295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
84305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
84315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the element declaration or a particle; NULL in case
84325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of an error or if the particle has minOccurs==maxOccurs==0.
84335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
84345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBasicItemPtr
84355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
84365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      xmlNodePtr node, int *isElemRef, int topLevel)
84375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
84385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr decl = NULL;
84395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr particle = NULL;
84405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot = NULL;
84415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
84425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr, nameAttr;
84435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int min, max, isRef = 0;
84445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *des = NULL;
84455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* 3.3.3 Constraints on XML Representations of Element Declarations */
84475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Complete implementation of 3.3.6 */
84485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
84505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
84515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (isElemRef != NULL)
84535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*isElemRef = 0;
84545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
84555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If we get a "ref" attribute on a local <element> we will assume it's
84565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a reference - even if there's a "name" attribute; this seems to be more
84575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * robust.
84585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
84595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nameAttr = xmlSchemaGetPropNode(node, "name");
84605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "ref");
84615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((topLevel) || (attr == NULL)) {
84625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nameAttr == NULL) {
84635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(ctxt,
84645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_MISSING,
84655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, "name", NULL);
84665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
84675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
84695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	isRef = 1;
84705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
84725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
84735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
84745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	annot = xmlSchemaParseAnnotation(ctxt, child, 1);
84755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
84765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
84785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Skip particle part if a global declaration.
84795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
84805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel)
84815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto declaration_part;
84825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
84835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The particle part ==================================================
84845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
84855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
84865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)");
84875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
84885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    particle = xmlSchemaAddParticle(ctxt, node, min, max);
84895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle == NULL)
84905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto return_null;
84915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* ret->flags |= XML_SCHEMAS_ELEM_REF; */
84935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (isRef) {
84955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *refNs = NULL, *ref = NULL;
84965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr refer = NULL;
84975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
84985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The reference part =============================================
84995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isElemRef != NULL)
85015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *isElemRef = 1;
85025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPValAttrNodeQName(ctxt, schema,
85045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, attr, &refNs, &ref);
85055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
85065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both"
85085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nameAttr != NULL) {
85105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMutualExclAttrErr(ctxt,
85115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name");
85125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
85135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
85155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
85175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
85185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
85195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attr->name, BAD_CAST "ref") ||
85205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlStrEqual(attr->name, BAD_CAST "name") ||
85215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlStrEqual(attr->name, BAD_CAST "id") ||
85225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlStrEqual(attr->name, BAD_CAST "maxOccurs") ||
85235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlStrEqual(attr->name, BAD_CAST "minOccurs"))
85245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
85255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attr = attr->next;
85265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
85275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
85285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* SPEC (3.3.3 : 2.2) */
85295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomAttrErr(ctxt,
85305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_ELEMENT_2_2,
85315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL, attr,
85325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Only the attributes 'minOccurs', 'maxOccurs' and "
85335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"'id' are allowed in addition to 'ref'");
85345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
85355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
85365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
85375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
85385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
85395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
85405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
85415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
85425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* No children except <annotation> expected.
85445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (child != NULL) {
85465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
85475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL, "(annotation?)");
85485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
85495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((min == 0) && (max == 0))
85505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto return_null;
85515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the reference item and attach it to the particle.
85535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
85555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ref, refNs);
85565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (refer == NULL)
85575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto return_null;
85585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle->children = (xmlSchemaTreeItemPtr) refer;
85595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle->annot = annot;
85605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the particle to pending components, since the reference
85625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* need to be resolved.
85635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(ctxt, particle);
85655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ((xmlSchemaBasicItemPtr) particle);
85665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
85675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
85685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The declaration part ===============================================
85695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
85705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)declaration_part:
85715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
85725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *ns = NULL, *fixed, *name, *attrValue;
85735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL;
85745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr,
85765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0)
85775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto return_null;
85785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
85795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Evaluate the target namespace.
85805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
85815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (topLevel) {
85825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = ctxt->targetNamespace;
85835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
85845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = xmlSchemaGetPropNode(node, "form");
85855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr != NULL) {
85865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
85875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
85885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = ctxt->targetNamespace;
85895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) {
85905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPSimpleTypeErr(ctxt,
85915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
85925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, (xmlNodePtr) attr,
85935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, "(qualified | unqualified)",
85945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attrValue, NULL, NULL, NULL);
85955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
85965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
85975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ns = ctxt->targetNamespace;
85985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
85995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel);
86005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (decl == NULL) {
86015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto return_null;
86025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
86035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
86045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
86055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
86065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
86075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
86085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
86095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
86105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "type")) &&
86115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "id")) &&
86125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "default")) &&
86135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
86145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "block")) &&
86155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "nillable")))
86165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
86175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (topLevel == 0) {
86185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
86195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
86205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (!xmlStrEqual(attr->name, BAD_CAST "form")))
86215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
86225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaPIllegalAttrErr(ctxt,
86235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
86245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
86255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) &&
86265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(!xmlStrEqual(attr->name, BAD_CAST "abstract")) &&
86275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) {
86285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalAttrErr(ctxt,
86305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
86315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
86325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
86345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
86365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
86375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
86385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
86395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
86405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
86415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Extract/validate attributes.
86425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
86435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (topLevel) {
86445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
86455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process top attributes of global element declarations here.
86465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
86475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
86485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
86495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPValAttrQName(ctxt, schema,
86505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, "substitutionGroup",
86515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&(decl->substGroupNs), &(decl->substGroup));
86525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlGetBooleanProp(ctxt, node, "abstract", 0))
86535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
86545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
86555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Attribute "final".
86565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
86575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = xmlSchemaGetPropNode(node, "final");
86585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr == NULL) {
86595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
86605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
86615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
86625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
86635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
86645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
86655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
86665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    -1,
86675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ELEM_FINAL_EXTENSION,
86685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
86695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPSimpleTypeErr(ctxt,
86705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
86715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, (xmlNodePtr) attr,
86725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, "(#all | List of (extension | restriction))",
86735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attrValue, NULL, NULL, NULL);
86745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
86765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
86775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
86785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute "block".
86795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
86805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "block");
86815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
86825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
86835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Apply default "block" values.
86845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
86855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
86865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
86875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
86885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
86895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
86905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
86915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
86925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
86935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
86945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		-1,
86955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
86965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
86975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
86985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSimpleTypeErr(ctxt,
86995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
87005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, (xmlNodePtr) attr,
87015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, "(#all | List of (extension | "
87025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "restriction | substitution))", attrValue,
87035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL, NULL);
87045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
87055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlGetBooleanProp(ctxt, node, "nillable", 0))
87075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
87085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "type");
87105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr != NULL) {
87115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPValAttrNodeQName(ctxt, schema,
87125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, attr,
87135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&(decl->namedTypeNs), &(decl->namedType));
87145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCheckReference(ctxt, schema, node,
87155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr, decl->namedTypeNs);
87165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	decl->value = xmlSchemaGetProp(ctxt, node, "default");
87185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "fixed");
87195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr != NULL) {
87205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
87215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (decl->value != NULL) {
87225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
87235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 3.3.3 : 1
87245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* default and fixed must not both be present.
87255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
87265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPMutualExclAttrErr(ctxt,
87275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_ELEMENT_1,
87285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, attr, "default", "fixed");
87295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
87305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->flags |= XML_SCHEMAS_ELEM_FIXED;
87315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->value = fixed;
87325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
87335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
87355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* And now for the children...
87365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
87375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "complexType")) {
87385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
87395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.3 : 3
87405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "type" and either <simpleType> or <complexType> are mutually
87415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * exclusive
87425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
87435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (decl->namedType != NULL) {
87445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPContentErr(ctxt,
87455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_ELEMENT_3,
87465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, child,
87475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The attribute 'type' and the <complexType> child are "
87485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "mutually exclusive", NULL);
87495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
87505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0);
87515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
87525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "simpleType")) {
87535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
87545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.3 : 3
87555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "type" and either <simpleType> or <complexType> are
87565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * mutually exclusive
87575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
87585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (decl->namedType != NULL) {
87595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPContentErr(ctxt,
87605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_ELEMENT_3,
87615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, child,
87625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The attribute 'type' and the <simpleType> child are "
87635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "mutually exclusive", NULL);
87645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
87655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
87665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
87675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((IS_SCHEMA(child, "unique")) ||
87695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) {
87705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (IS_SCHEMA(child, "unique")) {
87715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
87725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
87735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "key")) {
87745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
87755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
87765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "keyref")) {
87775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
87785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
87795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
87805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (lastIDC != NULL)
87815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastIDC->next = curIDC;
87825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
87835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		decl->idcs = (void *) curIDC;
87845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    lastIDC = curIDC;
87855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
87865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (child != NULL) {
87885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
87895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
87905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child,
87915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, "(annotation?, ((simpleType | complexType)?, "
87925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(unique | key | keyref)*))");
87935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	decl->annot = annot;
87955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
87965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
87975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: Element Declaration Representation OK 4. will be checked at a
87985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * different layer.
87995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des)
88015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel)
88025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ((xmlSchemaBasicItemPtr) decl);
88035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
88045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle->children = (xmlSchemaTreeItemPtr) decl;
88055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ((xmlSchemaBasicItemPtr) particle);
88065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
88075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)return_null:
88095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FREE_AND_NULL(des);
88105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (annot != NULL) {
88115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (particle != NULL)
88125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    particle->annot = NULL;
88135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (decl != NULL)
88145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    decl->annot = NULL;
88155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeAnnot(annot);
88165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
88175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
88185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
88195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
88215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseUnion:
88225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
88235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
88245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
88255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
88265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Union definition
88275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
88285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
88295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of internal error, 0 in case of success and a positive
88305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code otherwise.
88315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
88325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
88335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
88345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlNodePtr node)
88355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
88365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
88375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
88385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
88395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = NULL;
88405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
88425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
88435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
88445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
88455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Mark the simple type as being of variety "union".
88475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
88495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
88515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the �simple ur-type definition�."
88525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
88545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
88565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
88585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
88595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
88605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
88615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) {
88625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
88635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
88645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
88655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
88665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
88675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
88685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
88695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
88705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
88715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
88725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "memberTypes". This is a list of QNames.
88745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Check the value to contain anything.
88755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "memberTypes");
88775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
88785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *end;
88795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *tmp;
88805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *localName, *nsName;
88815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeLinkPtr link, lastLink = NULL;
88825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr ref;
88835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
88855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->base = cur;
88865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
88875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (IS_BLANK_CH(*cur))
88885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
88895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
88905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
88915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
88925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (end == cur)
88935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
88945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrndup(cur, end - cur);
88955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
88965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) {
88975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
88985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create the member type link.
88995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		link = (xmlSchemaTypeLinkPtr)
89015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlMalloc(sizeof(xmlSchemaTypeLink));
89025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (link == NULL) {
89035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, "
89045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"allocating a type link", NULL);
89055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
89065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		link->type = NULL;
89085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		link->next = NULL;
89095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (lastLink == NULL)
89105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->memberTypes = link;
89115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
89125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastLink->next = link;
89135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastLink = link;
89145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
89155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create a reference item.
89165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
89185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    localName, nsName);
89195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ref == NULL) {
89205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(tmp)
89215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
89225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
89245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Assign the reference to the link, it will be resolved
89255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* later during fixup of the union simple type.
89265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		link->type = (xmlSchemaTypePtr) ref;
89285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
89295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(tmp)
89305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = end;
89315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (*cur != 0);
89325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
89345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
89355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
89365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
89375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
89385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
89395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
89405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the simple type ancestor.
89415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
89425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
89435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
89445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
89455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
89465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "simpleType")) {
89475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr subtype, last = NULL;
89485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
89505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Anchor the member types in the "subtypes" field of the
89515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* simple type.
89525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
89535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_SCHEMA(child, "simpleType")) {
89545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    subtype = (xmlSchemaTypePtr)
89555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
89565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (subtype != NULL) {
89575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (last == NULL) {
89585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->subtypes = subtype;
89595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    last = subtype;
89605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
89615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    last->next = subtype;
89625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    last = subtype;
89635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last->next = NULL;
89655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
89665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
89675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
89685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
89695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
89705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
89715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
89725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL, "(annotation?, simpleType*)");
89735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
89745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((attr == NULL) && (type->subtypes == NULL)) {
89755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /*
89765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* src-union-memberTypes-or-simpleTypes
89775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Either the memberTypes [attribute] of the <union> element must
89785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* be non-empty or there must be at least one simpleType [child].
89795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
89805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
89815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES,
89825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
89835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Either the attribute 'memberTypes' or "
89845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "at least one <simpleType> child must be present", NULL);
89855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
89865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
89875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
89885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
89905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseList:
89915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
89925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
89935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
89945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
89955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema List definition
89965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
89975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
89985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 if the declaration is improper and
89995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         1 in case of success.
90005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
90015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
90025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
90035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   xmlNodePtr node)
90045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
90055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
90065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
90075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
90085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
90105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
90115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
90125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
90135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Mark the type as being of variety "list".
90155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
90165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
90175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
90195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the �simple ur-type definition�."
90205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
90215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
90225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
90245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
90255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
90265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
90275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
90285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
90295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "itemType"))) {
90305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
90315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
90325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
90335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
90345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
90355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
90365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
90385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
90415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "itemType". NOTE that we will use the "ref" and "refNs"
90445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * fields for holding the reference to the itemType.
90455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
90465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove
90475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the "ref" fields.
90485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
90495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrQName(ctxt, schema, NULL,
90505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node, "itemType", &(type->baseNs), &(type->base));
90515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
90535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
90545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
90555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
90565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
90575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
90585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
90595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "simpleType")) {
90615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
90625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* src-list-itemType-or-simpleType
90635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Either the itemType [attribute] or the <simpleType> [child] of
90645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the <list> element must be present, but not both.
90655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
90665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->base != NULL) {
90675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
90685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
90695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
90705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The attribute 'itemType' and the <simpleType> child "
90715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"are mutually exclusive", NULL);
90725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
90735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
90745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
90765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (type->base == NULL) {
90775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
90785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
90795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
90805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Either the attribute 'itemType' or the <simpleType> child "
90815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "must be present", NULL);
90825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
90845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
90855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
90865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL, "(annotation?, simpleType?)");
90875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->base == NULL) &&
90895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->subtypes == NULL) &&
90905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaGetPropNode(node, "itemType") == NULL)) {
90915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
90925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
90935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
90945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Either the attribute 'itemType' or the <simpleType> child "
90955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "must be present", NULL);
90965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
90985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
90995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
91015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseSimpleType:
91025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
91035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
91045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
91055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
91065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Simple Type definition
91075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
91085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
91095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 if the declaration is improper and
91105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1 in case of success.
91115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
91125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
91135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
91145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         xmlNodePtr node, int topLevel)
91155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
91165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type, oldCtxtType;
91175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
91185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *attrValue = NULL;
91195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
91205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int hasRestriction = 0;
91215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
91235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
91245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel) {
91265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "name");
91275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
91285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(ctxt,
91295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_MISSING,
91305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
91315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"name", NULL);
91325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
91335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
91345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaPValAttrNode(ctxt,
91355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, attr,
91365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
91375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (NULL);
91385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
91395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Skip built-in types.
91405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
91415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ctxt->isS4S) {
91425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypePtr biType;
91435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt->isRedefine) {
91455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
91465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * REDEFINE: Disallow redefinition of built-in-types.
91475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * TODO: It seems that the spec does not say anything
91485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * about this case.
91495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
91505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
91515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, node,
91525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Redefinition of built-in simple types is not "
91535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"supported", NULL);
91545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(NULL);
91555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
91565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
91575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (biType != NULL)
91585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (biType);
91595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
91605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
91615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
91625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
91635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TargetNamespace:
91645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "The �actual value� of the targetNamespace [attribute]
91655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of the <schema> ancestor element information item if present,
91665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * otherwise �absent�.
91675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
91685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel == 0) {
91695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
91705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char buf[40];
91715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
91725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
91735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse as local simple type definition.
91745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
91755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
91765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1);
91775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema,
91785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SIMPLE,
91795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
91805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->targetNamespace, node, 0);
91815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
91825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema,
91835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SIMPLE,
91845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, ctxt->targetNamespace, node, 0);
91855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
91865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == NULL)
91875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
91885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->type = XML_SCHEMA_TYPE_SIMPLE;
91895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
91905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
91915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
91925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
91935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
91945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
91955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
91965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
91975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
91985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
91995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
92005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
92015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
92025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
92035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
92045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
92055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
92065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
92075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
92085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse as global simple type definition.
92095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
92105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that attrValue is the value of the attribute "name" here.
92115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
92125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE,
92135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrValue, ctxt->targetNamespace, node, 1);
92145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == NULL)
92155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
92165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->type = XML_SCHEMA_TYPE_SIMPLE;
92175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
92185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
92195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
92205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
92215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
92225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
92235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
92245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
92255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
92265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
92275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "final"))) {
92285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
92295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
92305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
92315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
92325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
92335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
92345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
92355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
92365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
92375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
92385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute "final".
92395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
92405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "final");
92415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
92425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
92435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
92445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
92455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
92465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
92475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
92485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
92495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrValue = xmlSchemaGetProp(ctxt, node, "final");
92505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
92515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		-1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
92525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_TYPE_FINAL_LIST,
92535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
92545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSimpleTypeErr(ctxt,
92565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
92575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, (xmlNodePtr) attr,
92585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, "(#all | List of (list | union | restriction)",
92595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrValue, NULL, NULL, NULL);
92605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
92615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
92625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
92635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->targetNamespace = ctxt->targetNamespace;
92645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
92655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
92665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
92675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
92685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oldCtxtType = ctxt->ctxtType;
92695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->ctxtType = type;
92715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
92735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
92745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
92755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
92765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
92775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
92785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING,
92795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
92805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (restriction | list | union))");
92815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "restriction")) {
92825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseRestriction(ctxt, schema, child,
92835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SIMPLE);
92845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	hasRestriction = 1;
92855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
92865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "list")) {
92875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseList(ctxt, schema, child);
92885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
92895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "union")) {
92905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseUnion(ctxt, schema, child);
92915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
92925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
92935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
92945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
92955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
92965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (restriction | list | union))");
92975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
92985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
92995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * REDEFINE: SPEC src-redefine (5)
93005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "Within the [children], each <simpleType> must have a
93015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * <restriction> among its [children] ... the �actual value� of whose
93025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * base [attribute] must be the same as the �actual value� of its own
93035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * name attribute plus target namespace;"
93045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
93055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
93065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
93075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "This is a redefinition, thus the "
93085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "<simpleType> must have a <restriction> child", NULL);
93095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
93105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->ctxtType = oldCtxtType;
93125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (type);
93135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
93145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
93165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseModelGroupDefRef:
93175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
93185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the schema being built
93195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
93205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
93215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses a reference to a model group definition.
93225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
93235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We will return a particle component with a qname-component or
93245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of an error.
93255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
93265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTreeItemPtr
93275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
93285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaPtr schema,
93295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlNodePtr node)
93305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
93315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr item;
93325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
93335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
93345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *ref = NULL, *refNs = NULL;
93355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int min, max;
93365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
93385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
93395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "ref");
93415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
93425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(ctxt,
93435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
93445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "ref", NULL);
93455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
93465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL,
93475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr, &refNs, &ref) != 0) {
93485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
93495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
93505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
93515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
93525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
93535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"(xs:nonNegativeInteger | unbounded)");
93545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
93555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
93565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
93575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
93585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
93595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
93605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
93615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "id")) &&
93625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
93635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) {
93645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
93655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
93665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
93675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
93685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
93695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
93705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
93715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
93725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
93735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
93745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = xmlSchemaAddParticle(ctxt, node, min, max);
93755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item == NULL)
93765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
93775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
93785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a qname-reference and set as the term; it will be substituted
93795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * for the model group after the reference has been resolved.
93805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
93815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->children = (xmlSchemaTreeItemPtr)
93825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs);
93835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max);
93845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
93855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
93865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
93875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
93885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Is annotation even allowed for a model group reference? */
93895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
93905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
93915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: What to do exactly with the annotation?
93925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
93935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
93945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
93955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
93965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
93975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
93985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
93995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
94005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?)");
94015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
94025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
94035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Corresponds to no component at all if minOccurs==maxOccurs==0.
94045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
94055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((min == 0) && (max == 0))
94065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
94075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ((xmlSchemaTreeItemPtr) item);
94095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
94105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
94125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseModelGroupDefinition:
94135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
94145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
94155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
94165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
94175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses a XML schema model group definition.
94185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
94195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that the contraint src-redefine (6.2) can't be applied until
94205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * references have been resolved. So we will do this at the
94215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * component fixup level.
94225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
94235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
94245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
94255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 if the declaration is improper and
94265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         1 in case of success.
94275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
94285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaModelGroupDefPtr
94295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
94305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaPtr schema,
94315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNodePtr node)
94325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
94335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupDefPtr item;
94345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
94355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
94365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
94375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
94395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
94405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "name");
94425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
94435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(ctxt,
94445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
94455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
94465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "name", NULL);
94475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
94485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
94495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
94505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
94515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
94525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name,
94535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->targetNamespace, node);
94545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item == NULL)
94555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
94565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
94575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
94585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
94595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
94605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
94615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
94625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
94635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "id"))) {
94645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
94655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
94665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
94675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
94685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
94695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
94705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
94715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
94725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
94735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
94745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
94755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
94765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
94775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
94785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
94795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
94805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
94815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
94825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "all")) {
94835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
94845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_ALL, 0);
94855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
94865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "choice")) {
94875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
94885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_CHOICE, 0);
94895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
94905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "sequence")) {
94915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
94925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SEQUENCE, 0);
94935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
94945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
94955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
94995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
95005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
95015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
95025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (all | choice | sequence)?)");
95035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
95045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (item);
95055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
95065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
95085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCleanupDoc:
95095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
95105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the root of the document.
95115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * removes unwanted nodes in a schemas document tree
95135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
95145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
95155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root)
95165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
95175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr delete, cur;
95185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (root == NULL)) return;
95205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
95225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Remove all the blank text nodes
95235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
95245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete = NULL;
95255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = root;
95265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
95275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (delete != NULL) {
95285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlUnlinkNode(delete);
95295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFreeNode(delete);
95305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            delete = NULL;
95315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
95325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->type == XML_TEXT_NODE) {
95335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (IS_BLANK_NODE(cur)) {
95345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (xmlNodeGetSpacePreserve(cur) != 1) {
95355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    delete = cur;
95365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
95375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
95385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((cur->type != XML_ELEMENT_NODE) &&
95395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (cur->type != XML_CDATA_SECTION_NODE)) {
95405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            delete = cur;
95415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            goto skip_children;
95425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
95435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
95455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Skip to next node
95465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
95475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->children != NULL) {
95485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((cur->children->type != XML_ENTITY_DECL) &&
95495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (cur->children->type != XML_ENTITY_REF_NODE) &&
95505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (cur->children->type != XML_ENTITY_NODE)) {
95515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = cur->children;
95525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                continue;
95535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
95545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
95555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      skip_children:
95565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->next != NULL) {
95575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = cur->next;
95585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            continue;
95595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
95605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        do {
95625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = cur->parent;
95635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur == NULL)
95645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
95655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur == root) {
95665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = NULL;
95675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
95685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
95695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->next != NULL) {
95705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = cur->next;
95715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
95725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
95735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } while (cur != NULL);
95745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
95755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delete != NULL) {
95765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlUnlinkNode(delete);
95775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeNode(delete);
95785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete = NULL;
95795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
95805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
95815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
95845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaClearSchemaDefaults(xmlSchemaPtr schema)
95855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
95865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
95875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
95885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_QUALIF_ATTR)
95905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
95915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
95935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
95945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
95955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
95965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
95975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
95985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
95995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
96005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
96025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
96035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
96045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
96055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
96065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
96075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
96085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
96105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
96115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaPtr schema,
96125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNodePtr node)
96135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
96145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
96155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *val;
96165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0, oldErrs = ctxt->nberrors;
96175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
96195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Those flags should be moved to the parser context flags,
96205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * since they are not visible at the component level. I.e.
96215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * they are used if processing schema *documents* only.
96225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
96235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
96245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE;
96255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
96275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Since the version is of type xs:token, we won't bother to
96285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * check it.
96295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
96305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* REMOVED:
96315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "version");
96325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr,
96345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val);
96355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
96365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
96385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "targetNamespace");
96395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrNode(ctxt, NULL, attr,
96415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
96425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
96435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
96445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
96455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
96465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "elementFormDefault");
96495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
96515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
96525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_QUALIF_ELEM);
96535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
96545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
96555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(ctxt,
96565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_ELEMFORMDEFAULT_VALUE,
96575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr, NULL,
96585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(qualified | unqualified)", val, NULL, NULL, NULL);
96595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "attributeFormDefault");
96625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
96645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
96655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_QUALIF_ATTR);
96665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
96675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
96685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(ctxt,
96695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_ATTRFORMDEFAULT_VALUE,
96705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr, NULL,
96715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(qualified | unqualified)", val, NULL, NULL, NULL);
96725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "finalDefault");
96755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
96775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
96785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
96795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
96805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    -1,
96815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_FINAL_DEFAULT_LIST,
96825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_FINAL_DEFAULT_UNION);
96835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
96845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
96855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(ctxt,
96865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
96875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr, NULL,
96885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(#all | List of (extension | restriction | list | union))",
96895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		val, NULL, NULL, NULL);
96905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "blockDefault");
96935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
96945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
96955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
96965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
96975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
96985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
96995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE;
97005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
97015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSimpleTypeErr(ctxt,
97025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
97035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, (xmlNodePtr) attr, NULL,
97045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(#all | List of (extension | restriction | substitution))",
97055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		val, NULL, NULL, NULL);
97065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
97085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
97105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (oldErrs != ctxt->nberrors)
97115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = ctxt->err;
97125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
97135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
97145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
97155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
97165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
97185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseSchemaTopLevel:
97195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
97205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schemas
97215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodes:  the list of top level nodes
97225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
97235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal XML Schema structure built from the resource or
97245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         NULL in case of error
97255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
97265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
97275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
97285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             xmlSchemaPtr schema, xmlNodePtr nodes)
97295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
97305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child;
97315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAnnotPtr annot;
97325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0, oldErrs, tmpOldErrs;
97335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL))
97355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
97365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oldErrs = ctxt->nberrors;
97385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = nodes;
97395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((IS_SCHEMA(child, "include")) ||
97405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (IS_SCHEMA(child, "import")) ||
97415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (IS_SCHEMA(child, "redefine")) ||
97425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (IS_SCHEMA(child, "annotation"))) {
97435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "annotation")) {
97445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
97455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->annot == NULL)
97465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schema->annot = annot;
97475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
97485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeAnnot(annot);
97495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "import")) {
97505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpOldErrs = ctxt->nberrors;
97515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaParseImport(ctxt, schema, child);
97525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE;
97535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HSTOP(ctxt);
97545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpOldErrs != ctxt->nberrors)
97555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
97565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "include")) {
97575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpOldErrs = ctxt->nberrors;
97585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaParseInclude(ctxt, schema, child);
97595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE;
97605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HSTOP(ctxt);
97615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpOldErrs != ctxt->nberrors)
97625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
97635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "redefine")) {
97645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpOldErrs = ctxt->nberrors;
97655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaParseRedefine(ctxt, schema, child);
97665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE;
97675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HSTOP(ctxt);
97685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpOldErrs != ctxt->nberrors)
97695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
97705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child->next;
97725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
97735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
97745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * URGENT TODO: Change the functions to return int results.
97755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We need especially to catch internal errors.
97765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
97775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child != NULL) {
97785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "complexType")) {
97795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseComplexType(ctxt, schema, child, 1);
97805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "simpleType")) {
97825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseSimpleType(ctxt, schema, child, 1);
97835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "element")) {
97855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseElement(ctxt, schema, child, NULL, 1);
97865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "attribute")) {
97885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseGlobalAttribute(ctxt, schema, child);
97895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "attributeGroup")) {
97915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child);
97925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "group")) {
97945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseModelGroupDefinition(ctxt, schema, child);
97955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "notation")) {
97975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseNotation(ctxt, schema, child);
97985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
97995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
98005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
98015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
98025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, child->parent, child,
98035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, "((include | import | redefine | annotation)*, "
98045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(((simpleType | complexType | group | attributeGroup) "
98055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"| element | attribute | notation), annotation*)*)");
98065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
98075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
98085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_SCHEMA(child, "annotation")) {
98095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
98105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: We should add all annotations.
98115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
98125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
98135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schema->annot == NULL)
98145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schema->annot = annot;
98155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
98165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeAnnot(annot);
98175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
98185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
98195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
98215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->ctxtType = NULL;
98225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (oldErrs != ctxt->nberrors)
98235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = ctxt->err;
98245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
98255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
98265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
98275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
98285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaSchemaRelationPtr
98305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSchemaRelationCreate(void)
98315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr ret;
98335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaSchemaRelationPtr)
98355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaSchemaRelation));
98365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
98375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL);
98385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
98395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaSchemaRelation));
98415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
98425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
98435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
98455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
98465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
98475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(rel);
98495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
98505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
98515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
98535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
98545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr prev;
98565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (redef != NULL) {
98585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = redef;
98595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	redef = redef->next;
98605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(prev);
98615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
98635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
98655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
98665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
98685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * After the construction context has been freed, there will be
98695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * no schema graph available any more. Only the schema buckets
98705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * will stay alive, which are put into the "schemasImports" and
98715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "includes" slots of the xmlSchema.
98725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
98735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->buckets != NULL)
98745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(con->buckets);
98755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->pending != NULL)
98765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(con->pending);
98775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->substGroups != NULL)
98785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashFree(con->substGroups,
98795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
98805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->redefs != NULL)
98815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaRedefListFree(con->redefs);
98825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->dict != NULL)
98835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDictFree(con->dict);
98845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(con);
98855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
98865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaConstructionCtxtPtr
98885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaConstructionCtxtCreate(xmlDictPtr dict)
98895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaConstructionCtxtPtr ret;
98915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaConstructionCtxtPtr)
98935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaConstructionCtxt));
98945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
98955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(NULL,
98965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating schema construction context", NULL);
98975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
98985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaConstructionCtxt));
99005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buckets = xmlSchemaItemListCreate();
99025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buckets == NULL) {
99035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL,
99045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating list of schema buckets", NULL);
99055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret);
99065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
99075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
99085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->pending = xmlSchemaItemListCreate();
99095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->pending == NULL) {
99105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErrMemory(NULL,
99115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating list of pending global components", NULL);
99125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaConstructionCtxtFree(ret);
99135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
99145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
99155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = dict;
99165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictReference(dict);
99175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
99185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaParserCtxtPtr
99215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtCreate(void)
99225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
99235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ret;
99245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt));
99265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
99275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPErrMemory(NULL, "allocating schema parser context",
99285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NULL);
99295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
99305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
99315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaParserCtxt));
99325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_CTXT_PARSER;
99335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->attrProhibs = xmlSchemaItemListCreate();
99345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->attrProhibs == NULL) {
99355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret);
99365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
99375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
99385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
99395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
99425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewParserCtxtUseDict:
99435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the location of the schema
99445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dict: the dictionary to be used
99455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
99465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML Schemas parse context for that file/resource expected
99475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to contain an XML Schemas file.
99485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
99495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error
99505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
99515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaParserCtxtPtr
99525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict)
99535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
99545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ret;
99555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParserCtxtCreate();
99575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
99585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
99595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = dict;
99605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictReference(dict);
99615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL != NULL)
99625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1);
99635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
99645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
99675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
99685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
99695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->pctxt == NULL) {
99705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (vctxt->schema != NULL)
99715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->pctxt =
99725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict);
99735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
99745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->pctxt = xmlSchemaNewParserCtxt("*");
99755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->pctxt == NULL) {
99765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt",
99775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to create a temp. parser context");
99785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
99795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
99805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Pass user data. */
99815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
99825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->warning, vctxt->errCtxt);
99835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
99845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->errCtxt);
99855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
99865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
99875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
99905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetSchemaBucket:
99915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt: the schema parser context
99925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schemaLocation: the URI of the schema document
99935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
99945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a schema bucket if it was already parsed.
99955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
99965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a schema bucket if it was already parsed from
99975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         @schemaLocation, NULL otherwise.
99985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
99995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBucketPtr
100005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
100015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const xmlChar *schemaLocation)
100025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
100035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr cur;
100045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr list;
100055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = pctxt->constructor->buckets;
100075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->nbItems == 0)
100085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
100095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
100105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
100115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < list->nbItems; i++) {
100125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = (xmlSchemaBucketPtr) list->items[i];
100135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Pointer comparison! */
100145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->schemaLocation == schemaLocation)
100155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(cur);
100165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
100175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
100185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
100195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
100205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBucketPtr
100225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
100235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     const xmlChar *schemaLocation,
100245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     const xmlChar *targetNamespace)
100255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
100265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr cur;
100275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr list;
100285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = pctxt->constructor->buckets;
100305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->nbItems == 0)
100315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
100325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
100335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
100345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < list->nbItems; i++) {
100355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = (xmlSchemaBucketPtr) list->items[i];
100365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Pointer comparison! */
100375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->origTargetNamespace == NULL) &&
100385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->schemaLocation == schemaLocation) &&
100395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->targetNamespace == targetNamespace))
100405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(cur);
100415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
100425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
100435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
100445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
100455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_BAD_SCHEMA_DOC(b) \
100485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
100495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaBucketPtr
100515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
100525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar *targetNamespace,
100535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int imported)
100545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
100555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr cur;
100565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr list;
100575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = pctxt->constructor->buckets;
100595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->nbItems == 0)
100605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
100615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
100625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
100635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < list->nbItems; i++) {
100645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = (xmlSchemaBucketPtr) list->items[i];
100655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((! IS_BAD_SCHEMA_DOC(cur)) &&
100665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->origTargetNamespace == targetNamespace) &&
100675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((imported && cur->imported) ||
100685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 ((!imported) && (!cur->imported))))
100695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(cur);
100705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
100715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
100725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
100735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
100745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
100765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
100775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaPtr schema,
100785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaBucketPtr bucket)
100795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
100805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int oldFlags;
100815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr oldDoc;
100825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
100835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret, oldErrs;
100845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
100855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
100875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Save old values; reset the *main* schema.
100885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * URGENT TODO: This is not good; move the per-document information
100895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to the parser. Get rid of passing the main schema to the
100905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * parsing functions.
100915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
100925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oldFlags = schema->flags;
100935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oldDoc = schema->doc;
100945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schema->flags != 0)
100955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaClearSchemaDefaults(schema);
100965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    schema->doc = bucket->doc;
100975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->schema = schema;
100985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
100995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Keep the current target namespace on the parser *not* on the
101005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * main schema.
101015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
101025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->targetNamespace = bucket->targetNamespace;
101035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
101045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket->targetNamespace != NULL) &&
101065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
101075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
101085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We are parsing the schema for schemas!
101095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
101105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->isS4S = 1;
101115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
101125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Mark it as parsed, even if parsing fails. */
101135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bucket->parsed++;
101145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Compile the schema doc. */
101155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = xmlDocGetRootElement(bucket->doc);
101165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParseSchemaElement(pctxt, schema, node);
101175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
101185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
101195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* An empty schema; just get out. */
101205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->children == NULL)
101215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
101225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oldErrs = pctxt->nberrors;
101235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children);
101245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
101255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
101265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
101275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Not nice, but I'm not 100% sure we will get always an error
101285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * as a result of the obove functions; so better rely on pctxt->err
101295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * as well.
101305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
101315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret == 0) && (oldErrs != pctxt->nberrors)) {
101325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = pctxt->err;
101335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
101345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
101355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
101375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
101385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Restore schema values. */
101395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    schema->doc = oldDoc;
101405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    schema->flags = oldFlags;
101415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
101425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
101435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
101455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
101465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaPtr schema,
101475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaBucketPtr bucket)
101485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
101495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr newpctxt;
101505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0;
101515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket == NULL)
101535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
101545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->parsed) {
101555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaParseNewDoc",
101565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "reparsing a schema doc");
101575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
101585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
101595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->doc == NULL) {
101605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaParseNewDoc",
101615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "parsing a schema doc, but there's no doc");
101625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
101635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
101645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->constructor == NULL) {
101655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaParseNewDoc",
101665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no constructor");
101675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
101685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
101695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create and init the temporary parser context. */
101705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newpctxt = xmlSchemaNewParserCtxtUseDict(
101715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) bucket->schemaLocation, pctxt->dict);
101725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (newpctxt == NULL)
101735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
101745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newpctxt->constructor = pctxt->constructor;
101755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
101765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Can we avoid that the parser knows about the main schema?
101775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * It would be better if he knows about the current schema bucket
101785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * only.
101795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
101805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newpctxt->schema = schema;
101815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
101825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->errCtxt);
101835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
101845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->errCtxt);
101855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newpctxt->counter = pctxt->counter;
101865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket);
101895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Channel back errors and cleanup the temporary parser context. */
101915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
101925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->err = res;
101935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->nberrors += newpctxt->nberrors;
101945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->counter = newpctxt->counter;
101955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newpctxt->constructor = NULL;
101965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Free the parser context. */
101975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFreeParserCtxt(newpctxt);
101985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
101995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
102005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
102025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
102035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaSchemaRelationPtr rel)
102045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
102055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr cur = bucket->relations;
102065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
102085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bucket->relations = rel;
102095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
102105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
102115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur->next != NULL)
102125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
102135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = rel;
102145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
102155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
102185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location,
102195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlNodePtr ctxtNode)
102205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
102215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
102225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Build an absolue location URI.
102235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
102245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (location != NULL) {
102255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxtNode == NULL)
102265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(location);
102275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
102285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *base, *URI;
102295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *ret = NULL;
102305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
102325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (base == NULL) {
102335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		URI = xmlBuildURI(location, ctxtNode->doc->URL);
102345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
102355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		URI = xmlBuildURI(location, base);
102365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(base);
102375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
102385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (URI != NULL) {
102395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlDictLookup(dict, URI, -1);
102405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(URI);
102415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
102425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
102435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
102445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
102455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
102465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
102475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
102515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAddSchemaDoc:
102525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  a schema validation context
102535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
102545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
102555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
102565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse an included (and to-be-redefined) XML schema document.
102575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
102585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success, a positive error code on errors and
102595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         -1 in case of an internal or API error.
102605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
102615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
102635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
102645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int type, /* import or include or redefine */
102655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *schemaLocation,
102665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDocPtr schemaDoc,
102675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const char *schemaBuffer,
102685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int schemaBufferLen,
102695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNodePtr invokingNode,
102705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *sourceTargetNamespace,
102715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *importNamespace,
102725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBucketPtr *bucket)
102735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
102745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *targetNamespace = NULL;
102755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationPtr relation = NULL;
102765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc = NULL;
102775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0, err = 0, located = 0, preserveDoc = 0;
102785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bkt = NULL;
102795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket != NULL)
102815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*bucket = NULL;
102825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
102845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_SCHEMA_IMPORT:
102855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_SCHEMA_MAIN:
102865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = XML_SCHEMAP_SRC_IMPORT;
102875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
102885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_SCHEMA_INCLUDE:
102895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = XML_SCHEMAP_SRC_INCLUDE;
102905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
102915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_SCHEMA_REDEFINE:
102925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = XML_SCHEMAP_SRC_REDEFINE;
102935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
102945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
102955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Special handling for the main schema:
102985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * skip the location and relation logic and just parse the doc.
102995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We need just a bucket to be returned in this case.
103005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
103015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
103025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto doc_load;
103035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Note that we expect the location to be an absulute URI. */
103055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schemaLocation != NULL) {
103065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
103075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((bkt != NULL) &&
103085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (pctxt->constructor->bucket == bkt)) {
103095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Report self-imports/inclusions/redefinitions. */
103105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
103125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		invokingNode, NULL,
103135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The schema must not import/include/redefine itself",
103145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
103155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
103165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
103175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
103185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
103195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a relation for the graph of schemas.
103205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
103215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    relation = xmlSchemaSchemaRelationCreate();
103225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (relation == NULL)
103235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
103245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
103255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	relation);
103265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    relation->type = type;
103275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
103295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Save the namespace import information.
103305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
103315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_BUCKET_IMPMAIN(type)) {
103325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	relation->importNamespace = importNamespace;
103335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schemaLocation == NULL) {
103345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
103355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * No location; this is just an import of the namespace.
103365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that we don't assign a bucket to the relation
103375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * in this case.
103385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
103395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
103405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
103415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	targetNamespace = importNamespace;
103425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
103435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Did we already fetch the doc? */
103455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bkt != NULL) {
103465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) {
103475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
103485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We included/redefined and then try to import a schema,
103495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * but the new location provided for import was different.
103505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
103515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schemaLocation == NULL)
103525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation = BAD_CAST "in_memory_buffer";
103535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrEqual(schemaLocation,
103545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bkt->schemaLocation)) {
103555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
103565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    invokingNode, NULL,
103575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The schema document '%s' cannot be imported, since "
103585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "it was already included or redefined",
103595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, NULL);
103605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
103615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
103625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) {
103635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
103645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We imported and then try to include/redefine a schema,
103655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * but the new location provided for the include/redefine
103665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * was different.
103675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
103685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (schemaLocation == NULL)
103695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation = BAD_CAST "in_memory_buffer";
103705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrEqual(schemaLocation,
103715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bkt->schemaLocation)) {
103725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
103735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    invokingNode, NULL,
103745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The schema document '%s' cannot be included or "
103755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "redefined, since it was already imported",
103765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, NULL);
103775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
103785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
103795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
103805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
103815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_BUCKET_IMPMAIN(type)) {
103835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
103845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Given that the schemaLocation [attribute] is only a hint, it is open
103855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to applications to ignore all but the first <import> for a given
103865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* namespace, regardless of the �actual value� of schemaLocation, but
103875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* such a strategy risks missing useful information when new
103885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* schemaLocations are offered.
103895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
103905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We will use the first <import> that comes with a location.
103915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Further <import>s *with* a location, will result in an error.
103925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Better would be to just report a warning here, but
103935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* we'll try it this way until someone complains.
103945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
103955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Schema Document Location Strategy:
103965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3 Based on the namespace name, identify an existing schema document,
103975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* either as a resource which is an XML document or a <schema> element
103985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* information item, in some local schema repository;
103995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 5 Attempt to resolve the namespace name to locate such a resource.
104005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
104015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: (3) and (5) are not supported.
104025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
104035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt != NULL) {
104045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    relation->bucket = bkt;
104055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
104065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
104075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
104085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    importNamespace, 1);
104095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt != NULL) {
104115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    relation->bucket = bkt;
104125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bkt->schemaLocation == NULL) {
104135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* First given location of the schema; load the doc. */
104145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bkt->schemaLocation = schemaLocation;
104155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
104165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!xmlStrEqual(schemaLocation,
104175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bkt->schemaLocation)) {
104185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
104195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Additional location given; just skip it.
104205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * URGENT TODO: We should report a warning here.
104215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * res = XML_SCHEMAP_SRC_IMPORT;
104225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
104235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (schemaLocation == NULL)
104245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			schemaLocation = BAD_CAST "in_memory_buffer";
104255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
104275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_WARN_SKIP_SCHEMA,
104285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			invokingNode, NULL,
104295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Skipping import of schema located at '%s' for the "
104305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"namespace '%s', since this namespace was already "
104315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"imported with the schema located at '%s'",
104325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			schemaLocation, importNamespace, bkt->schemaLocation);
104335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
104345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
104355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
104365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
104375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
104385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* No bucket + first location: load the doc and create a
104395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* bucket.
104405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
104415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
104425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* <include> and <redefine> */
104435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt != NULL) {
104445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((bkt->origTargetNamespace == NULL) &&
104465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(bkt->targetNamespace != sourceTargetNamespace)) {
104475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBucketPtr chamel;
104485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
104505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Chameleon include/redefine: skip loading only if it was
104515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* aleady build for the targetNamespace of the including
104525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* schema.
104535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
104545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
104555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* URGENT TODO: If the schema is a chameleon-include then copy
104565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the components into the including schema and modify the
104575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* targetNamespace of those components, do nothing otherwise.
104585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE: This is currently worked-around by compiling the
104595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* chameleon for every destinct including targetNamespace; thus
104605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* not performant at the moment.
104615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Check when the namespace in wildcards for chameleons
104625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* needs to be converted: before we built wildcard intersections
104635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* or after.
104645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   Answer: after!
104655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
104665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
104675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, sourceTargetNamespace);
104685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (chamel != NULL) {
104695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* A fitting chameleon was already parsed; NOP. */
104705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    relation->bucket = chamel;
104715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit;
104725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
104735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
104745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* We need to parse the chameleon again for a different
104755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* targetNamespace.
104765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* CHAMELEON TODO: Optimize this by only parsing the
104775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* chameleon once, and then copying the components to
104785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the new targetNamespace.
104795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
104805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bkt = NULL;
104815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
104825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		relation->bucket = bkt;
104835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
104845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
104855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
104865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
104875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bkt != NULL) && (bkt->doc != NULL)) {
104885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaAddSchemaDoc",
104895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "trying to load a schema doc, but a doc is already "
104905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "assigned to the schema bucket");
104915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
104925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
104935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)doc_load:
104955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
104965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Load the document.
104975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
104985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schemaDoc != NULL) {
104995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = schemaDoc;
105005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Don' free this one, since it was provided by the caller. */
105015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	preserveDoc = 1;
105025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Does the context or the doc hold the location? */
105035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schemaDoc->URL != NULL)
105045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schemaLocation = xmlDictLookup(pctxt->dict,
105055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaDoc->URL, -1);
105065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
105075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schemaLocation = BAD_CAST "in_memory_buffer";
105085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) {
105095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserCtxtPtr parserCtxt;
105105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parserCtxt = xmlNewParserCtxt();
105125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parserCtxt == NULL) {
105135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, "
105145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating a parser context", NULL);
105155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_failure;
105165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
105175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) {
105185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
105195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Do we have to burden the schema parser dict with all
105205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the content of the schema doc?
105215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
105225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDictFree(parserCtxt->dict);
105235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parserCtxt->dict = pctxt->dict;
105245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDictReference(parserCtxt->dict);
105255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
105265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schemaLocation != NULL) {
105275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Parse from file. */
105285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation,
105295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, SCHEMAS_PARSE_OPTIONS);
105305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (schemaBuffer != NULL) {
105315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Parse from memory buffer. */
105325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen,
105335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL, SCHEMAS_PARSE_OPTIONS);
105345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schemaLocation = BAD_CAST "in_memory_buffer";
105355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc != NULL)
105365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->URL = xmlStrdup(schemaLocation);
105375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
105385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
105395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* For <import>:
105405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2.1 The referent is (a fragment of) a resource which is an
105415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* XML document (see clause 1.1), which in turn corresponds to
105425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* a <schema> element information item in a well-formed information
105435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* set, which in turn corresponds to a valid schema.
105445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: (2.1) fragments of XML documents are not supported.
105455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
105465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2.2 The referent is a <schema> element information item in
105475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* a well-formed information set, which in turn corresponds
105485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to a valid schema.
105495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: (2.2) is not supported.
105505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
105515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc == NULL) {
105525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlErrorPtr lerr;
105535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    lerr = xmlGetLastError();
105545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
105555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Check if this a parser error, or if the document could
105565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * just not be located.
105575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Try to find specific error codes to react only on
105585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * localisation failures.
105595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
105605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) {
105615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
105625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* We assume a parser error here.
105635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
105645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		located = 1;
105655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Error code ?? */
105665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = XML_SCHEMAP_SRC_IMPORT_2_1;
105675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
105685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    invokingNode, NULL,
105695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Failed to parse the XML resource '%s'",
105705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, NULL);
105715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
105725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
105735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeParserCtxt(parserCtxt);
105745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((doc == NULL) && located)
105755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_error;
105765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
105775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(pctxt, NULL,
105785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_NOTHING_TO_PARSE,
105795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No information for parsing was provided with the "
105805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "given schema parser context.\n",
105815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL);
105825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
105835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
105845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
105855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Preprocess the document.
105865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
105875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL) {
105885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr docElem = NULL;
105895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	located = 1;
105915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	docElem = xmlDocGetRootElement(doc);
105925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (docElem == NULL) {
105935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT,
105945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		invokingNode, NULL,
105955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The document '%s' has no document element",
105965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation, NULL);
105975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_error;
105985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
105995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
106005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Remove all the blank text nodes.
106015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
106025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCleanupDoc(pctxt, docElem);
106035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
106045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check the schema's top level element.
106055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
106065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!IS_SCHEMA(docElem, "schema")) {
106075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA,
106085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		invokingNode, NULL,
106095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The XML document '%s' is not a schema document",
106105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation, NULL);
106115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_error;
106125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
106135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
106145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we don't apply a type check for the
106155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* targetNamespace value here.
106165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
106175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	targetNamespace = xmlSchemaGetProp(pctxt, docElem,
106185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "targetNamespace");
106195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
106205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* after_doc_loading: */
106225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bkt == NULL) && located) {
106235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Only create a bucket if the schema was located. */
106245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bkt = xmlSchemaBucketCreate(pctxt, type,
106255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    targetNamespace);
106265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt == NULL)
106275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_failure;
106285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
106295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bkt != NULL) {
106305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bkt->schemaLocation = schemaLocation;
106315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bkt->located = located;
106325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
106335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->doc = doc;
106345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->targetNamespace = targetNamespace;
106355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->origTargetNamespace = targetNamespace;
106365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (preserveDoc)
106375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bkt->preserveDoc = 1;
106385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
106395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_BUCKET_IMPMAIN(type))
106405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->imported++;
106415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
106425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Add it to the graph of schemas.
106435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
106445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (relation != NULL)
106455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    relation->bucket = bkt;
106465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
106475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
106495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
106505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Return the bucket explicitely; this is needed for the
106515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * main schema.
106525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
106535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket != NULL)
106545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*bucket = bkt;
106555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
106565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
106585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (! preserveDoc)) {
106595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
106605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt != NULL)
106615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->doc = NULL;
106625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
106635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(pctxt->err);
106645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
106665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (! preserveDoc)) {
106675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
106685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bkt != NULL)
106695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bkt->doc = NULL;
106705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
106715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
106725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
106735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
106755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseImport:
106765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
106775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
106785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
106795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
106805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Import definition
106815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
106825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
106835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, a positive error code if
106845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not valid and -1 in case of an internal error.
106855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
106865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
106875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
106885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     xmlNodePtr node)
106895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
106905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child;
106915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *namespaceName = NULL, *schemaLocation = NULL;
106925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *thisTargetNamespace;
106935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
106945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
106955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket = NULL;
106965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
106985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
106995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
107015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
107025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
107035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
107045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
107055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
107065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
107075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
107085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
107095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(pctxt,
107105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
107115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
107125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
107135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(pctxt,
107145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
107155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
107165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
107175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
107195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Extract and validate attributes.
107205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
107215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPValAttr(pctxt, NULL, node,
107225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
107235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&namespaceName) != 0) {
107245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(pctxt,
107255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
107265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
107275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
107285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, namespaceName, NULL, NULL, NULL);
107295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (pctxt->err);
107305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPValAttr(pctxt, NULL, node,
107335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
107345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&schemaLocation) != 0) {
107355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSimpleTypeErr(pctxt,
107365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
107375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node,
107385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
107395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, namespaceName, NULL, NULL, NULL);
107405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (pctxt->err);
107415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
107435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
107445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
107455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
107465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
107475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
107485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * the annotation here is simply discarded ...
107495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * TODO: really?
107505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
107515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
107525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
107545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(pctxt,
107555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
107565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
107575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?)");
107585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
107605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply additional constraints.
107615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
107625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that it is important to use the original @targetNamespace
107635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (or none at all), to rule out imports of schemas _with_ a
107645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * @targetNamespace if the importing schema is a chameleon schema
107655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (with no @targetNamespace).
107665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
107675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
107685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (namespaceName != NULL) {
107695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
107705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1.1 If the namespace [attribute] is present, then its �actual value�
107715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must not match the �actual value� of the enclosing <schema>'s
107725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* targetNamespace [attribute].
107735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
107745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlStrEqual(thisTargetNamespace, namespaceName)) {
107755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
107765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_IMPORT_1_1,
107775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
107785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value of the attribute 'namespace' must not match "
107795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"the target namespace '%s' of the importing schema",
107805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		thisTargetNamespace);
107815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (pctxt->err);
107825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
107835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
107845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
107855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1.2 If the namespace [attribute] is not present, then the enclosing
107865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <schema> must have a targetNamespace [attribute].
107875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
107885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (thisTargetNamespace == NULL) {
107895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
107905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_IMPORT_1_2,
107915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
107925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The attribute 'namespace' must be existent if "
107935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"the importing schema has no target namespace",
107945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
107955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (pctxt->err);
107965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
107975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
107995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Locate and acquire the schema document.
108005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
108015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schemaLocation != NULL)
108025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
108035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schemaLocation, node);
108045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
108055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schemaLocation, NULL, NULL, 0, node, thisTargetNamespace,
108065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	namespaceName, &bucket);
108075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
108095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
108105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
108125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For <import>: "It is *not* an error for the application
108135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * schema reference strategy to fail."
108145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * So just don't parse if no schema document was found.
108155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that we will get no bucket if the schema could not be
108165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * located or if there was no schemaLocation.
108175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
108185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket == NULL) && (schemaLocation != NULL)) {
108195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomWarning(ACTXT_CAST pctxt,
108205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA,
108215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node, NULL,
108225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Failed to locate a schema at location '%s'. "
108235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Skipping the import", schemaLocation, NULL, NULL);
108245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
108255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) {
108275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaParseNewDoc(pctxt, schema, bucket);
108285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
108295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
108315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
108325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
108345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
108355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlSchemaPtr schema,
108365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlNodePtr node,
108375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlChar **schemaLocation,
108385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     int type)
108395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
108405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
108415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL) ||
108435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(schemaLocation == NULL))
108445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
108455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *schemaLocation = NULL;
108475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
108485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
108495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Applies for both <include> and <redefine>.
108505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
108515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
108525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
108535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
108545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
108555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
108565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(pctxt,
108575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
108585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
108595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
108605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(pctxt,
108615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
108625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
108635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
108645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
108655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
108665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
108675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Preliminary step, extract the URI-Reference and make an URI
108685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * from the base.
108695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
108705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
108715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "schemaLocation" is mandatory.
108725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
108735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetPropNode(node, "schemaLocation");
108745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr != NULL) {
108755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlChar *base = NULL;
108765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlChar *uri = NULL;
108775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
108795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
108805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (const xmlChar **) schemaLocation) != 0)
108815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_error;
108825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = xmlNodeGetBase(node->doc, node);
108835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base == NULL) {
108845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    uri = xmlBuildURI(*schemaLocation, node->doc->URL);
108855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
108865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    uri = xmlBuildURI(*schemaLocation, base);
108875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(base);
108885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
108895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (uri == NULL) {
108905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaParseIncludeOrRedefine",
108915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"could not build an URI from the schemaLocation")
108925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_failure;
108935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
108945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1);
108955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(uri);
108965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
108975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(pctxt,
108985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
108995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "schemaLocation", NULL);
109005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
109015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
109025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
109035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Report self-inclusion and self-redefinition.
109045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
109055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(*schemaLocation, pctxt->URL)) {
109065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
109075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
109085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_REDEFINE,
109095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
109105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The schema document '%s' cannot redefine itself.",
109115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*schemaLocation);
109125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
109135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
109145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_INCLUDE,
109155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node,
109165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The schema document '%s' cannot include itself.",
109175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*schemaLocation);
109185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
109195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
109205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
109215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
109235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
109245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(pctxt->err);
109255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
109265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
109275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
109285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
109305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
109315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaPtr schema,
109325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlNodePtr node,
109335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				int type)
109345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
109355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
109365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *schemaLocation = NULL;
109375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0; /* hasRedefinitions = 0 */
109385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isChameleon = 0, wasChameleon = 0;
109395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket = NULL;
109405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
109425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
109435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
109455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse attributes. Note that the returned schemaLocation will
109465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * be already converted to an absolute URI.
109475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
109485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema,
109495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node, (xmlChar **) (&schemaLocation), type);
109505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
109515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(res);
109525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
109535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Load and add the schema document.
109545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
109555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL,
109565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, 0, node, pctxt->targetNamespace, NULL, &bucket);
109575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
109585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(res);
109595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
109605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If we get no schema bucket back, then this means that the schema
109615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * document could not be located or was broken XML or was not
109625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a schema document.
109635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
109645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket == NULL) || (bucket->doc == NULL)) {
109655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_SCHEMA_SCHEMA_INCLUDE) {
109665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
109675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * WARNING for <include>:
109685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We will raise an error if the schema cannot be located
109695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * for inclusions, since the that was the feedback from the
109705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * schema people. I.e. the following spec piece will *not* be
109715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * satisfied:
109725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC src-include: "It is not an error for the �actual value� of the
109735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * schemaLocation [attribute] to fail to resolve it all, in which
109745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * case no corresponding inclusion is performed.
109755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * So do we need a warning report here?"
109765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
109775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = XML_SCHEMAP_SRC_INCLUDE;
109785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
109795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
109805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Failed to load the document '%s' for inclusion",
109815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation, NULL);
109825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
109835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
109845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: This was changed to raise an error even if no redefinitions
109855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * are specified.
109865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
109875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC src-redefine (1)
109885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "If there are any element information items among the [children]
109895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * other than <annotation> then the �actual value� of the
109905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * schemaLocation [attribute] must successfully resolve."
109915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Ask the WG if a the location has always to resolve
109925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * here as well!
109935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
109945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = XML_SCHEMAP_SRC_REDEFINE;
109955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
109965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
109975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Failed to load the document '%s' for redefinition",
109985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schemaLocation, NULL);
109995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
110005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
110015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
110025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check targetNamespace sanity before parsing the new schema.
110035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Note that we won't check further content if the
110045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* targetNamespace was bad.
110055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
110065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bucket->origTargetNamespace != NULL) {
110075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
110085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC src-include (2.1)
110095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "SII has a targetNamespace [attribute], and its �actual
110105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * value� is identical to the �actual value� of the targetNamespace
110115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * [attribute] of SII� (which must have such an [attribute])."
110125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
110135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (pctxt->targetNamespace == NULL) {
110145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt,
110155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_INCLUDE,
110165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node, NULL,
110175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The target namespace of the included/redefined schema "
110185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "'%s' has to be absent, since the including/redefining "
110195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "schema has no target namespace",
110205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, NULL);
110215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_error;
110225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (!xmlStrEqual(bucket->origTargetNamespace,
110235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pctxt->targetNamespace)) {
110245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Change error function. */
110255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErrExt(pctxt,
110265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_INCLUDE,
110275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node,
110285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The target namespace '%s' of the included/redefined "
110295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "schema '%s' differs from '%s' of the "
110305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "including/redefining schema",
110315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bucket->origTargetNamespace, schemaLocation,
110325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->targetNamespace);
110335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_error;
110345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
110355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (pctxt->targetNamespace != NULL) {
110365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
110375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Chameleons: the original target namespace will
110385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * differ from the resulting namespace.
110395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
110405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    isChameleon = 1;
110415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bucket->parsed &&
110425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bucket->origTargetNamespace != NULL) {
110435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt,
110445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_INCLUDE,
110455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node, NULL,
110465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The target namespace of the included/redefined schema "
110475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "'%s' has to be absent or the same as the "
110485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "including/redefining schema's target namespace",
110495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schemaLocation, NULL);
110505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_error;
110515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
110525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bucket->targetNamespace = pctxt->targetNamespace;
110535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
110545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
110555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
110565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse the schema.
110575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
110585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) {
110595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isChameleon) {
110605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: Get rid of this flag on the schema itself. */
110615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
110625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
110635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
110645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		wasChameleon = 1;
110655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
110665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParseNewDoc(pctxt, schema, bucket);
110675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Restore chameleon flag. */
110685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (isChameleon && (!wasChameleon))
110695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
110705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
110715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
110725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
110735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
110745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
110755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
110765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
110775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse (simpleType | complexType | group | attributeGroup))*
110785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
110795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redefined = bucket;
110805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
110815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* How to proceed if the redefined schema was not located?
110825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
110835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->isRedefine = 1;
110845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_SCHEMA(child, "annotation") ||
110855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    IS_SCHEMA(child, "simpleType") ||
110865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    IS_SCHEMA(child, "complexType") ||
110875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    IS_SCHEMA(child, "group") ||
110885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    IS_SCHEMA(child, "attributeGroup")) {
110895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (IS_SCHEMA(child, "annotation")) {
110905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
110915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: discard or not?
110925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
110935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "simpleType")) {
110945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseSimpleType(pctxt, schema, child, 1);
110955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "complexType")) {
110965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseComplexType(pctxt, schema, child, 1);
110975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* hasRedefinitions = 1; */
110985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "group")) {
110995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* hasRedefinitions = 1; */
111005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroupDefinition(pctxt,
111015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schema, child);
111025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "attributeGroup")) {
111035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* hasRedefinitions = 1; */
111045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseAttributeGroupDefinition(pctxt, schema,
111055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    child);
111065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
111075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
111085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
111095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->redefined = NULL;
111105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->isRedefine = 0;
111115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
111125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "annotation")) {
111135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
111145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: discard or not?
111155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
111165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
111175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
111185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
111195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
111205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED;
111215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
111225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(pctxt, res,
111235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
111245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation | (simpleType | complexType | group | attributeGroup))*");
111255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
111265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     xmlSchemaPContentErr(pctxt, res,
111275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
111285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?)");
111295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
111305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
111315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
111325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
111345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(pctxt->err);
111355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
111365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
111385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
111395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlNodePtr node)
111405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
111415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
111425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ENABLE_REDEFINE
111435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TODO
111445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
111455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
111465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
111475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_SCHEMA_REDEFINE);
111485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
111495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(res);
111505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
111515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
111525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
111545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
111555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlNodePtr node)
111565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
111575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
111585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
111605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_SCHEMA_INCLUDE);
111615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
111625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(res);
111635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
111645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
111655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
111675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseModelGroup:
111685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
111695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
111705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
111715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the "compositor" type
111725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particleNeeded: if a a model group with a particle
111735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
111745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Sequence definition.
111755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Applies parts of:
111765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Schema Representation Constraint:
111775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     Redefinition Constraints and Semantics (src-redefine)
111785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     (6.1), (6.1.1), (6.1.2)
111795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
111805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Schema Component Constraint:
111815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     All Group Limited (cos-all-limited) (2)
111825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     TODO: Actually this should go to component-level checks,
111835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     but is done here due to performance. Move it to an other layer
111845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     is schema construction via an API is implemented.
111855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
111865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
111875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
111885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 if the declaration is improper and
111895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         1 in case of success.
111905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
111915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTreeItemPtr
111925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
111935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlNodePtr node, xmlSchemaTypeType type,
111945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int withParticle)
111955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
111965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupPtr item;
111975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr particle = NULL;
111985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
111995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
112005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int min = 1, max = 1, isElemRef, hasRefs = 0;
112015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
112035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
112045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
112055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a model group with the given compositor.
112065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
112075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item = xmlSchemaAddModelGroup(ctxt, schema, type, node);
112085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item == NULL)
112095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
112105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (withParticle) {
112125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_SCHEMA_TYPE_ALL) {
112135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)");
112145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1");
112155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
112165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* choice + sequence */
112175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
112185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
112195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(xs:nonNegativeInteger | unbounded)");
112205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
112215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
112225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
112235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a particle
112245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
112255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle = xmlSchemaAddParticle(ctxt, node, min, max);
112265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (particle == NULL)
112275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
112285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle->children = (xmlSchemaTreeItemPtr) item;
112295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
112305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
112315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
112325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
112335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
112345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
112355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
112365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
112375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) {
112385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
112395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
112405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
112415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
112425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
112435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
112445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
112455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
112465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
112475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
112485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
112495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check for illegal attributes.
112505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
112515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = node->properties;
112525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (attr != NULL) {
112535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->ns == NULL) {
112545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
112555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalAttrErr(ctxt,
112565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
112575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
112585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
112595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
112605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
112615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
112625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = attr->next;
112635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
112645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
112655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
112675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Extract and validate attributes.
112685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
112695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
112705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
112715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
112725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
112735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
112745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
112755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
112765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
112775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
112785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == XML_SCHEMA_TYPE_ALL) {
112795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr part, last = NULL;
112805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_SCHEMA(child, "element")) {
112825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
112835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schema, child, &isElemRef, 0);
112845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
112855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC cos-all-limited (2)
112865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "The {max occurs} of all the particles in the {particles}
112875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * of the ('all') group must be 0 or 1.
112885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
112895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (part != NULL) {
112905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (isElemRef)
112915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasRefs++;
112925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (part->minOccurs > 1) {
112935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt,
112945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ALL_LIMITED,
112955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, child,
112965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Invalid value for minOccurs (must be 0 or 1)",
112975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
112985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Reset to 1. */
112995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    part->minOccurs = 1;
113005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
113015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (part->maxOccurs > 1) {
113025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt,
113035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ALL_LIMITED,
113045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, child,
113055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Invalid value for maxOccurs (must be 0 or 1)",
113065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
113075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Reset to 1. */
113085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    part->maxOccurs = 1;
113095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
113105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (last == NULL)
113115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item->children = (xmlSchemaTreeItemPtr) part;
113125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
113135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    last->next = (xmlSchemaTreeItemPtr) part;
113145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last = part;
113155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
113165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
113175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
113185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (child != NULL) {
113195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
113205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
113215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
113225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, (annotation?, element*)");
113235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
113245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
113255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* choice + sequence */
113265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTreeItemPtr part = NULL, last = NULL;
113275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((IS_SCHEMA(child, "element")) ||
113295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "group")) ||
113305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "any")) ||
113315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "choice")) ||
113325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "sequence"))) {
113335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (IS_SCHEMA(child, "element")) {
113355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		part = (xmlSchemaTreeItemPtr)
113365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0);
113375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (part && isElemRef)
113385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasRefs++;
113395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "group")) {
113405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		part =
113415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
113425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (part != NULL)
113435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasRefs++;
113445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
113455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Handle redefinitions.
113465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
113475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt->isRedefine && ctxt->redef &&
113485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
113495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    part && part->children)
113505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
113515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((xmlSchemaGetQNameRefName(part->children) ==
113525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ctxt->redef->refName) &&
113535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaGetQNameRefTargetNs(part->children) ==
113545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ctxt->redef->refTargetNs))
113555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
113565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
113575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* SPEC src-redefine:
113585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (6.1) "If it has a <group> among its contents at
113595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* some level the �actual value� of whose ref
113605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* [attribute] is the same as the �actual value� of
113615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* its own name attribute plus target namespace, then
113625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* all of the following must be true:"
113635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (6.1.1) "It must have exactly one such group."
113645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
113655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ctxt->redefCounter != 0) {
113665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlChar *str = NULL;
113675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
113695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
113705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"The redefining model group definition "
113715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"'%s' must not contain more than one "
113725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"reference to the redefined definition",
113735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaFormatQName(&str,
113745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ctxt->redef->refTargetNs,
113755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ctxt->redef->refName),
113765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				NULL);
113775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(str)
113785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    part = NULL;
113795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
113805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ((WXS_PARTICLE(part))->maxOccurs != 1))
113815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
113825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlChar *str = NULL;
113835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
113845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * SPEC src-redefine:
113855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * (6.1.2) "The �actual value� of both that
113865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * group's minOccurs and maxOccurs [attribute]
113875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * must be 1 (or �absent�).
113885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
113895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
113905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
113915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"The redefining model group definition "
113925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"'%s' must not contain a reference to the "
113935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"redefined definition with a "
113945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"maxOccurs/minOccurs other than 1",
113955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaFormatQName(&str,
113965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ctxt->redef->refTargetNs,
113975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ctxt->redef->refName),
113985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				NULL);
113995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(str)
114005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    part = NULL;
114015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
114025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ctxt->redef->reference = WXS_BASIC_CAST part;
114035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ctxt->redefCounter++;
114045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
114055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
114065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "any")) {
114075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		part = (xmlSchemaTreeItemPtr)
114085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaParseAny(ctxt, schema, child);
114095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "choice")) {
114105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		part = xmlSchemaParseModelGroup(ctxt, schema, child,
114115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_CHOICE, 1);
114125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (IS_SCHEMA(child, "sequence")) {
114135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		part = xmlSchemaParseModelGroup(ctxt, schema, child,
114145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_SEQUENCE, 1);
114155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
114165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (part != NULL) {
114175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (last == NULL)
114185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item->children = part;
114195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
114205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    last->next = part;
114215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last = part;
114225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
114235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
114245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
114255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (child != NULL) {
114265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
114275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
114285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
114295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, (element | group | choice | sequence | any)*)");
114305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
114315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
114325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((max == 0) && (min == 0))
114335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
114345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hasRefs) {
114355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
114365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We need to resolve references.
114375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
114385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_ADD_PENDING(ctxt, item);
114395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
114405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (withParticle)
114415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ((xmlSchemaTreeItemPtr) particle);
114425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
114435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ((xmlSchemaTreeItemPtr) item);
114445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
114455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
114475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseRestriction:
114485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
114495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
114505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
114515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
114525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Restriction definition
114535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
114545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
114555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the type definition or NULL in case of error
114565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
114575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
114585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
114595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          xmlNodePtr node, xmlSchemaTypeType parentType)
114605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
114615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
114625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
114635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
114645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
114665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
114675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
114685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
114695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
114705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
114725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
114735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
114745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
114755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
114765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
114775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
114785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
114795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
114805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
114815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
114825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
114835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
114845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
114855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
114865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
114875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
114885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
114895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Extract and validate attributes.
114905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
114915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
114925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
114935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute
114945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
114955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
114965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Extract the base type. The "base" attribute is mandatory if inside
114975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a complex type or if redefining.
114985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
114995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1.2) "...otherwise (<restriction> has no <simpleType> "
115005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * among its [children]), the simple type definition which is
115015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the {content type} of the type definition �resolved� to by
115025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the �actual value� of the base [attribute]"
115035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
115045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base",
115055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&(type->baseNs), &(type->base)) == 0)
115065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
115075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) {
115085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(ctxt,
115095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_MISSING,
115105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, "base", NULL);
115115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((ctxt->isRedefine) &&
115125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (type->flags & XML_SCHEMAS_TYPE_GLOBAL))
115135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
115145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->base == NULL) {
115155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPMissingAttrErr(ctxt,
115165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_MISSING,
115175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, "base", NULL);
115185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if ((! xmlStrEqual(type->base, type->name)) ||
115195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(! xmlStrEqual(type->baseNs, type->targetNamespace)))
115205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
115215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str1 = NULL, *str2 = NULL;
115225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
115235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* REDEFINE: SPEC src-redefine (5)
115245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "Within the [children], each <simpleType> must have a
115255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* <restriction> among its [children] ... the �actual value� of
115265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* whose base [attribute] must be the same as the �actual value�
115275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of its own name attribute plus target namespace;"
115285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
115295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE,
115305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, "This is a redefinition, but the QName "
115315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "value '%s' of the 'base' attribute does not match the "
115325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "type's designation '%s'",
115335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str1, type->baseNs, type->base),
115345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str2, type->targetNamespace,
115355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->name), NULL);
115365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str1);
115375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str2);
115385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Avoid confusion and erase the values. */
115395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->base = NULL;
115405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->baseNs = NULL;
115415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
115425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
115435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
115445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
115455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
115465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
115475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
115485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
115495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
115505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the simple type ancestor.
115515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
115525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
115535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
115545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
115555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
115565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
115575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
115585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <simpleType><restriction><simpleType>.
115595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
115605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "simpleType")) {
115615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->base != NULL) {
115625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
115635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* src-restriction-base-or-simpleType
115645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Either the base [attribute] or the simpleType [child] of the
115655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* <restriction> element must be present, but not both.
115665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
115675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPContentErr(ctxt,
115685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
115695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, node, child,
115705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The attribute 'base' and the <simpleType> child are "
115715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "mutually exclusive", NULL);
115725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
115735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->baseType = (xmlSchemaTypePtr)
115745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaParseSimpleType(ctxt, schema, child, 0);
115755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
115765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
115775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (type->base == NULL) {
115785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
115795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
115805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child,
115815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Either the attribute 'base' or a <simpleType> child "
115825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"must be present", NULL);
115835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
115845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
115855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
115865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><complexContent><restriction>...
115875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* followed by:
115885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
115895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Model groups <all>, <choice> and <sequence>.
115905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
115915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "all")) {
115925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
115935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema, child,
115945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_ALL, 1);
115955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
115965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "choice")) {
115975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
115985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt,
115995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    schema, child, XML_SCHEMA_TYPE_CHOICE, 1);
116005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
116015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "sequence")) {
116025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
116035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema, child,
116045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_SEQUENCE, 1);
116055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
116065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Model group reference <group>.
116085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "group")) {
116105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
116115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
116125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
116135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that the reference will be resolved in
116145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * xmlSchemaResolveTypeReferences();
116155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
116165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
116175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
116185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
116195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><simpleContent><restriction>...
116215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
116225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "1.1 the simple type definition corresponding to the <simpleType>
116235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* among the [children] of <restriction> if there is one;"
116245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "simpleType")) {
116265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
116275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We will store the to-be-restricted simple type in
116285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * type->contentTypeDef *temporarily*.
116295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
116305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentTypeDef = (xmlSchemaTypePtr)
116315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
116325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( type->contentTypeDef == NULL)
116335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (NULL);
116345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
116355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
116365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
116375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
116395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
116405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFacetPtr facet, lastfacet = NULL;
116415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><simpleContent><restriction>...
116435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <simpleType><restriction>...
116445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the facets to the simple type ancestor.
116485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Datatypes: 4.1.3 Constraints on XML Representation of
116515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Simple Type Definition Schema Representation Constraint:
116525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* *Single Facet Value*
116535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((IS_SCHEMA(child, "minInclusive")) ||
116555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "minExclusive")) ||
116565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "maxInclusive")) ||
116575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "maxExclusive")) ||
116585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "totalDigits")) ||
116595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "fractionDigits")) ||
116605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "pattern")) ||
116615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "enumeration")) ||
116625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "whiteSpace")) ||
116635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "length")) ||
116645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "maxLength")) ||
116655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (IS_SCHEMA(child, "minLength"))) {
116665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    facet = xmlSchemaParseFacet(ctxt, schema, child);
116675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (facet != NULL) {
116685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (lastfacet == NULL)
116695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->facets = facet;
116705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
116715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastfacet->next = facet;
116725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastfacet = facet;
116735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastfacet->next = NULL;
116745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
116755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
116765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
116775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
116785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create links for derivation and validation.
116795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
116805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->facets != NULL) {
116815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL;
116825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    facet = type->facets;
116845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
116855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facetLink = (xmlSchemaFacetLinkPtr)
116865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlMalloc(sizeof(xmlSchemaFacetLink));
116875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (facetLink == NULL) {
116885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL);
116895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(facetLink);
116905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (NULL);
116915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
116925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facetLink->facet = facet;
116935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facetLink->next = NULL;
116945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (lastFacetLink == NULL)
116955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->facetSet = facetLink;
116965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
116975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastFacetLink->next = facetLink;
116985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastFacetLink = facetLink;
116995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet = facet->next;
117005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (facet != NULL);
117015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
117025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
117035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_COMPLEX) {
117045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
117055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute uses/declarations.
117065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
117075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
117085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaItemListPtr *) &(type->attrUses),
117095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
117105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
117115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
117125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute wildcard.
117135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
117145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "anyAttribute")) {
117155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->attributeWildcard =
117165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseAnyAttribute(ctxt, schema, child);
117175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
117185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
117195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
117205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
117215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
117225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
117235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
117245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
117255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"annotation?, (group | all | choice | sequence)?, "
117265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"((attribute | attributeGroup)*, anyAttribute?))");
117275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
117285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     xmlSchemaPContentErr(ctxt,
117295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
117305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
117315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
117325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
117335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"length | minLength | maxLength | enumeration | whiteSpace | "
117345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
117355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
117365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Simple type */
117375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
117385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
117395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
117405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
117415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
117425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"length | minLength | maxLength | enumeration | whiteSpace | "
117435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"pattern)*))");
117445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
117455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
117465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
117475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
117505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseExtension:
117515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
117525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
117535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
117545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
117555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses an <extension>, which is found inside a
117565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <simpleContent> or <complexContent>.
117575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change.
117585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
117595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Returns the type definition or NULL in case of error
117605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
117615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
117625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
117635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlNodePtr node, xmlSchemaTypeType parentType)
117645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
117655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
117665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
117675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
117685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
117705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
117715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
117725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
117735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
117745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
117765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
117775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
117785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
117795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
117805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
117815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
117825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
117835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
117845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
117855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
117865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
117875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
117885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
117895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
117905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
117915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
117925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
117945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
117965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute "base" - mandatory.
117975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
117985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node,
117995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"base", &(type->baseNs), &(type->base)) == 0) &&
118005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->base == NULL)) {
118015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPMissingAttrErr(ctxt,
118025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ATTR_MISSING,
118035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "base", NULL);
118045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
118055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
118065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
118075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
118085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
118095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
118105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
118115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the type ancestor.
118125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
118135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
118145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
118155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
118165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
118175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
118185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
118195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><complexContent><extension>... and:
118205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
118215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Model groups <all>, <choice>, <sequence> and <group>.
118225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
118235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "all")) {
118245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
118255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema,
118265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    child, XML_SCHEMA_TYPE_ALL, 1);
118275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
118285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "choice")) {
118295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
118305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema,
118315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    child, XML_SCHEMA_TYPE_CHOICE, 1);
118325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
118335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "sequence")) {
118345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
118355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema,
118365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		child, XML_SCHEMA_TYPE_SEQUENCE, 1);
118375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
118385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (IS_SCHEMA(child, "group")) {
118395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = (xmlSchemaTypePtr)
118405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
118415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
118425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that the reference will be resolved in
118435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * xmlSchemaResolveTypeReferences();
118445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
118455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
118465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
118475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
118485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
118495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
118505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute uses/declarations.
118515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
118525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
118535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaItemListPtr *) &(type->attrUses),
118545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_EXTENSION, NULL) == -1)
118555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
118565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
118575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Attribute wildcard.
118585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
118595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "anyAttribute")) {
118605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->ctxtType->attributeWildcard =
118615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseAnyAttribute(ctxt, schema, child);
118625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
118635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
118645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
118655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
118665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
118675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Complex content extension. */
118685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
118695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
118705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
118715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, ((group | all | choice | sequence)?, "
118725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"((attribute | attributeGroup)*, anyAttribute?)))");
118735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
118745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Simple content extension. */
118755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPContentErr(ctxt,
118765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
118775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, node, child, NULL,
118785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"(annotation?, ((attribute | attributeGroup)*, "
118795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"anyAttribute?))");
118805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
118815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
118825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
118835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
118845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
118865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseSimpleContent:
118875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
118885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
118895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
118905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
118915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema SimpleContent definition
118925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
118935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
118945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the type definition or NULL in case of error
118955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
118965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
118975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
118985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlSchemaPtr schema, xmlNodePtr node,
118995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int *hasRestrictionOrExtension)
119005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
119015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
119025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
119035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
119045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
119065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(hasRestrictionOrExtension == NULL))
119075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
119085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *hasRestrictionOrExtension = 0;
119095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
119105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
119115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
119125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
119135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
119145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
119155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
119165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
119175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
119185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) {
119195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
119205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
119215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
119225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
119235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
119245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
119255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
119265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
119275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
119305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
119325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
119335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
119345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
119355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
119365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
119375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the complex type ancestor.
119385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
119395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
119405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
119415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
119425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
119445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
119455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_MISSING,
119465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, NULL, NULL,
119475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (restriction | extension))");
119485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
119505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
119515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_MISSING,
119525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, NULL, NULL,
119535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (restriction | extension))");
119545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "restriction")) {
119565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseRestriction(ctxt, schema, child,
119575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
119585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*hasRestrictionOrExtension) = 1;
119595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
119605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "extension")) {
119615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseExtension(ctxt, schema, child,
119625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
119635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*hasRestrictionOrExtension) = 1;
119645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
119655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
119675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
119685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
119695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child, NULL,
119705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "(annotation?, (restriction | extension))");
119715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
119725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
119735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
119745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
119765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseComplexContent:
119775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
119785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
119795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
119805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
119815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema ComplexContent definition
119825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
119835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
119845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the type definition or NULL in case of error
119855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
119865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
119875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
119885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             xmlSchemaPtr schema, xmlNodePtr node,
119895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int *hasRestrictionOrExtension)
119905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
119915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type;
119925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
119935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
119945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
119965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(hasRestrictionOrExtension == NULL))
119975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
119985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *hasRestrictionOrExtension = 0;
119995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Not a component, don't create it. */
120005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = ctxt->ctxtType;
120015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
120025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check for illegal attributes.
120035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
120045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
120055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
120065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
120075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
120085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrEqual(attr->name, BAD_CAST "mixed")))
120095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
120105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
120115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
120125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
120135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
120145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
120155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
120165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
120175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
120185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
120215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
120235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Set the 'mixed' on the complex type ancestor.
120245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
120255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlGetBooleanProp(ctxt, node, "mixed", 0))  {
120265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
120275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_MIXED;
120285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
120305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
120315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
120325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add the annotation to the complex type ancestor.
120335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
120345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
120355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaParseAnnotation(ctxt, child, 1));
120365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
120375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
120395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
120405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_MISSING,
120415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, NULL,
120425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?, (restriction | extension))");
120435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child == NULL) {
120455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
120465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_MISSING,
120475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, NULL,
120485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?, (restriction | extension))");
120495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "restriction")) {
120515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseRestriction(ctxt, schema, child,
120525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
120535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*hasRestrictionOrExtension) = 1;
120545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
120555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "extension")) {
120565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseExtension(ctxt, schema, child,
120575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
120585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*hasRestrictionOrExtension) = 1;
120595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
120605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
120625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
120635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
120645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
120655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?, (restriction | extension))");
120665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
120675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
120685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
120695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
120715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseComplexType:
120725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
120735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema being built
120745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a subtree containing XML Schema informations
120755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
120765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a XML schema Complex Type definition
120775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *WARNING* this interface is highly subject to change
120785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
120795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the type definition or NULL in case of error
120805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
120815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
120825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
120835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          xmlNodePtr node, int topLevel)
120845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
120855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type, ctxtType;
120865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr child = NULL;
120875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name = NULL;
120885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
120895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *attrValue;
120905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
120915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char buf[40];
120925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
120935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int final = 0, block = 0, hasRestrictionOrExtension = 0;
120945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
120975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
120985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxtType = ctxt->ctxtType;
121005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel) {
121025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = xmlSchemaGetPropNode(node, "name");
121035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == NULL) {
121045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPMissingAttrErr(ctxt,
121055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL);
121065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
121075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
121085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
121095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
121105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
121115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
121125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel == 0) {
121145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
121155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse as local complex type definition.
121165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
121175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
121185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1);
121195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema,
121205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_COMPLEX,
121215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
121225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->targetNamespace, node, 0);
121235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
121245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema,
121255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_COMPLEX,
121265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, ctxt->targetNamespace, node, 0);
121275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
121285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == NULL)
121295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
121305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = type->name;
121315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->node = node;
121325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->type = XML_SCHEMA_TYPE_COMPLEX;
121335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
121345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: We need the target namespace.
121355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
121365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
121375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
121385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse as global complex type definition.
121395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
121405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaAddType(ctxt, schema,
121415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_COMPLEX,
121425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name, ctxt->targetNamespace, node, 1);
121435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == NULL)
121445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
121455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->node = node;
121465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->type = XML_SCHEMA_TYPE_COMPLEX;
121475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
121485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
121495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->targetNamespace = ctxt->targetNamespace;
121505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
121515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle attributes.
121525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
121535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = node->properties;
121545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
121555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->ns == NULL) {
121565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->name, BAD_CAST "id")) {
121575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
121585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Attribute "id".
121595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
121605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
121615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) {
121625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
121635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Attribute "mixed".
121645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
121655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaPGetBoolNodeValue(ctxt,
121665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, (xmlNodePtr) attr))
121675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_MIXED;
121685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (topLevel) {
121695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
121705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Attributes of global complex type definitions.
121715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
121725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
121735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Pass. */
121745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) {
121755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
121765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Attribute "abstract".
121775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
121785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaPGetBoolNodeValue(ctxt,
121795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, (xmlNodePtr) attr))
121805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
121815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "final")) {
121825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
121835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Attribute "final".
121845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
121855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrValue = xmlSchemaGetNodeContent(ctxt,
121865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlNodePtr) attr);
121875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaPValAttrBlockFinal(attrValue,
121885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			&(type->flags),
121895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			-1,
121905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAS_TYPE_FINAL_EXTENSION,
121915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
121925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			-1, -1, -1) != 0)
121935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
121945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPSimpleTypeErr(ctxt,
121955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
121965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, (xmlNodePtr) attr, NULL,
121975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "(#all | List of (extension | restriction))",
121985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attrValue, NULL, NULL, NULL);
121995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else
122005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			final = 1;
122015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (xmlStrEqual(attr->name, BAD_CAST "block")) {
122025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
122035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Attribute "block".
122045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
122055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrValue = xmlSchemaGetNodeContent(ctxt,
122065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlNodePtr) attr);
122075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
122085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			-1,
122095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
122105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
122115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			-1, -1, -1) != 0) {
122125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPSimpleTypeErr(ctxt,
122135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
122145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, (xmlNodePtr) attr, NULL,
122155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "(#all | List of (extension | restriction)) ",
122165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attrValue, NULL, NULL, NULL);
122175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else
122185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			block = 1;
122195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
122205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalAttrErr(ctxt,
122215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
122225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
122235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
122245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPIllegalAttrErr(ctxt,
122255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
122265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
122275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
122285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPIllegalAttrErr(ctxt,
122295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
122305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
122315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = attr->next;
122325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
122335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! block) {
122345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Apply default "block" values.
122365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
122385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
122395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
122405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
122415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
122425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! final) {
122435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Apply default "block" values.
122455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
122475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
122485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
122495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
122505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
122515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
122525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * And now for the children...
122535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
122545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node->children;
122555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "annotation")) {
122565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
122575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
122585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
122595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->ctxtType = type;
122605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_SCHEMA(child, "simpleContent")) {
122615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <complexType><simpleContent>...
122635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.4.3 : 2.2
122645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Specifying mixed='true' when the <simpleContent>
122655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* alternative is chosen has no effect
122665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->flags & XML_SCHEMAS_TYPE_MIXED)
122685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags ^= XML_SCHEMAS_TYPE_MIXED;
122695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseSimpleContent(ctxt, schema, child,
122705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    &hasRestrictionOrExtension);
122715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
122725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (IS_SCHEMA(child, "complexContent")) {
122735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <complexType><complexContent>...
122755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->contentType = XML_SCHEMA_CONTENT_EMPTY;
122775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaParseComplexContent(ctxt, schema, child,
122785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    &hasRestrictionOrExtension);
122795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child = child->next;
122805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
122815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* E.g <complexType><sequence>... or <complexType><attribute>... etc.
122835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
122845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC
122855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "...the third alternative (neither <simpleContent> nor
122865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <complexContent>) is chosen. This case is understood as shorthand
122875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* for complex content restricting the �ur-type definition�, and the
122885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* details of the mappings should be modified as necessary.
122895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
122915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
122925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
122935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse model groups.
122945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
122955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (IS_SCHEMA(child, "all")) {
122965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            type->subtypes = (xmlSchemaTypePtr)
122975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema, child,
122985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_ALL, 1);
122995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            child = child->next;
123005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (IS_SCHEMA(child, "choice")) {
123015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            type->subtypes = (xmlSchemaTypePtr)
123025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema, child,
123035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_CHOICE, 1);
123045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            child = child->next;
123055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (IS_SCHEMA(child, "sequence")) {
123065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            type->subtypes = (xmlSchemaTypePtr)
123075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroup(ctxt, schema, child,
123085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_SEQUENCE, 1);
123095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            child = child->next;
123105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (IS_SCHEMA(child, "group")) {
123115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            type->subtypes = (xmlSchemaTypePtr)
123125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
123135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
123145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that the reference will be resolved in
123155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * xmlSchemaResolveTypeReferences();
123165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
123175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            child = child->next;
123185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
123195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
123205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse attribute decls/refs.
123215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
123225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
123235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaItemListPtr *) &(type->attrUses),
123245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
123255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
123265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
123275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Parse attribute wildcard.
123285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
123295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_SCHEMA(child, "anyAttribute")) {
123305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child);
123315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    child = child->next;
123325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
123335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
123345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child != NULL) {
123355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPContentErr(ctxt,
123365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
123375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, child,
123385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, "(annotation?, (simpleContent | complexContent | "
123395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "((group | all | choice | sequence)?, ((attribute | "
123405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "attributeGroup)*, anyAttribute?))))");
123415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
123425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
123435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * REDEFINE: SPEC src-redefine (5)
123445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
123455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
123465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
123475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, node, "This is a redefinition, thus the "
123485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "<complexType> must have a <restriction> or <extension> "
123495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "grand-child", NULL);
123505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
123515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->ctxtType = ctxtType;
123525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (type);
123535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
123545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
123565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
123575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Validating using Schemas			*
123585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
123595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
123605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
123625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
123635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Reading/Writing Schemas				*
123645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
123655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
123665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* Will be enabled if it is clear what options are needed. */
123685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
123695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParserCtxtSetOptions:
123705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:	a schema parser context
123715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlSchemaParserOption
123725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
123735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sets the options to be used during the parse.
123745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
123755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of an
123765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * API error.
123775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
123785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
123795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
123805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int options)
123815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
123835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
123845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
123865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
123875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
123885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * WARNING: Change the start value if adding to the
123895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * xmlSchemaParseOption.
123905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
123915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < (int) sizeof(int) * 8; i++) {
123925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (options & 1<<i) {
123935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
123945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
123955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
123965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->options = options;
123975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
123985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
123995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
124015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidCtxtGetOptions:
124025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema parser context
124035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the option combination of the parser context.
124055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
124065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
124075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
124085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
124105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
124115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
124125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
124135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->options);
124145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
124165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
124185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewParserCtxt:
124195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the location of the schema
124205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML Schemas parse context for that file/resource expected
124225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to contain an XML Schemas file.
124235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error
124255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
124265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtPtr
124275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewParserCtxt(const char *URL)
124285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
124295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ret;
124305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL == NULL)
124325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
124335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParserCtxtCreate();
124355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
124365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
124375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = xmlDictCreate();
124385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1);
124395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
124405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
124435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewMemParserCtxt:
124445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  a pointer to a char array containing the schemas
124455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size:  the size of the array
124465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML Schemas parse context for that memory buffer expected
124485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to contain an XML Schemas file.
124495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error
124515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
124525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtPtr
124535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewMemParserCtxt(const char *buffer, int size)
124545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
124555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ret;
124565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buffer == NULL) || (size <= 0))
124585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
124595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParserCtxtCreate();
124605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
124615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
124625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer = buffer;
124635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->size = size;
124645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = xmlDictCreate();
124655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
124665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
124695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewDocParserCtxt:
124705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  a preparsed document tree
124715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML Schemas parse context for that document.
124735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NB. The document may be modified during the parsing process.
124745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context or NULL in case of error
124765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
124775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParserCtxtPtr
124785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewDocParserCtxt(xmlDocPtr doc)
124795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
124805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ret;
124815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
124835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
124845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParserCtxtCreate();
124855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
124865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
124875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->doc = doc;
124885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = xmlDictCreate();
124895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The application has responsibility for the document */
124905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->preserve = 1;
124915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
124935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
124965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeParserCtxt:
124975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
124985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
124995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the resources associated to the schema parser context
125005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
125015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
125025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
125035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
125045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
125055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
125065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->doc != NULL && !ctxt->preserve)
125075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeDoc(ctxt->doc);
125085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->vctxt != NULL) {
125095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValidCtxt(ctxt->vctxt);
125105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
125115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) {
125125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaConstructionCtxtFree(ctxt->constructor);
125135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->constructor = NULL;
125145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->ownsConstructor = 0;
125155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
125165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->attrProhibs != NULL)
125175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(ctxt->attrProhibs);
125185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictFree(ctxt->dict);
125195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(ctxt);
125205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
125215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
125235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
125245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Building the content models			*
125255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
125265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
125275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
125295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBuildContentModelForSubstGroup:
125305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if nillable, 0 otherwise
125325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
125335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
125345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
125355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end)
125365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
125375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataStatePtr start, tmp;
125385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr elemDecl, member;
125395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSubstGroupPtr substGroup;
125405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
125415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
125425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elemDecl = (xmlSchemaElementPtr) particle->children;
125445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
125455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Wrap the substitution group with a CHOICE.
125465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
125475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start = pctxt->state;
125485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (end == NULL)
125495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	end = xmlAutomataNewState(pctxt->am);
125505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
125515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (substGroup == NULL) {
125525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
125535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INTERNAL,
125545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
125555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "declaration is marked having a subst. group but none "
125565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "available.\n", elemDecl->name, NULL);
125575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
125585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
125595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (counter >= 0) {
125605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
125615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE that we put the declaration in, even if it's abstract.
125625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* However, an error will be raised during *validation* if an element
125635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* information item shall be validated against an abstract element
125645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* declaration.
125655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
125665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter);
125675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlAutomataNewTransition2(pctxt->am, tmp, end,
125685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            elemDecl->name, elemDecl->targetNamespace, elemDecl);
125695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
125705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add subst. group members.
125715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
125725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < substGroup->members->nbItems; i++) {
125735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
125745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlAutomataNewTransition2(pctxt->am, tmp, end,
125755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		               member->name, member->targetNamespace, member);
125765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
125775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (particle->maxOccurs == 1) {
125785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
125795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE that we put the declaration in, even if it's abstract,
125805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
125815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataNewEpsilon(pctxt->am,
125825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewTransition2(pctxt->am,
125835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start, NULL,
125845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemDecl->name, elemDecl->targetNamespace, elemDecl), end);
125855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
125865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Add subst. group members.
125875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
125885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < substGroup->members->nbItems; i++) {
125895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
125905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
125915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2()
125925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  was incorrectly used instead of xmlAutomataNewTransition2()
125935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL
125945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  section in xmlSchemaBuildAContentModel() ).
125955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Check if xmlAutomataNewOnceTrans2() was instead
125965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  intended for the above "counter" section originally. I.e.,
125975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  check xs:all with subst-groups.
125985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
125995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL,
126005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *	               member->name, member->targetNamespace,
126015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *		       1, 1, member);
126025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
126035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL,
126045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		member->name, member->targetNamespace, member);
126055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewEpsilon(pctxt->am, tmp, end);
126065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
126075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
126085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataStatePtr hop;
126095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int maxOccurs = particle->maxOccurs == UNBOUNDED ?
126105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UNBOUNDED : particle->maxOccurs - 1;
126115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
126125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	counter =
126145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewCounter(pctxt->am, minOccurs,
126155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    maxOccurs);
126165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	hop = xmlAutomataNewState(pctxt->am);
126175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataNewEpsilon(pctxt->am,
126195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewTransition2(pctxt->am,
126205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start, NULL,
126215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemDecl->name, elemDecl->targetNamespace, elemDecl),
126225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    hop);
126235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
126245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Add subst. group members.
126255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
126265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < substGroup->members->nbItems; i++) {
126275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
126285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewEpsilon(pctxt->am,
126295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAutomataNewTransition2(pctxt->am,
126305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		start, NULL,
126315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		member->name, member->targetNamespace, member),
126325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		hop);
126335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
126345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
126355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
126365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
126375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->minOccurs == 0) {
126385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataNewEpsilon(pctxt->am, start, end);
126395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 1;
126405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
126415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->state = end;
126425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
126435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
126445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
126465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBuildContentModelForElement:
126475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
126485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if nillable, 0 otherwise
126495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
126505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
126515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
126525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlSchemaParticlePtr particle)
126535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
126545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
126555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((xmlSchemaElementPtr) particle->children)->flags &
126575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
126585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
126595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Substitution groups.
126605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
126615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL);
126625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
126635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaElementPtr elemDecl;
126645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAutomataStatePtr start;
126655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elemDecl = (xmlSchemaElementPtr) particle->children;
126675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
126695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
126705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (particle->maxOccurs == 1) {
126715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start = ctxt->state;
126725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
126735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    elemDecl->name, elemDecl->targetNamespace, elemDecl);
126745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((particle->maxOccurs >= UNBOUNDED) &&
126755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	           (particle->minOccurs < 2)) {
126765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Special case. */
126775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start = ctxt->state;
126785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
126795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->name, elemDecl->targetNamespace, elemDecl);
126805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
126815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->name, elemDecl->targetNamespace, elemDecl);
126825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
126835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int counter;
126845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int maxOccurs = particle->maxOccurs == UNBOUNDED ?
126855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    UNBOUNDED : particle->maxOccurs - 1;
126865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int minOccurs = particle->minOccurs < 1 ?
126875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    0 : particle->minOccurs - 1;
126885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
126905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
126915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
126925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->name, elemDecl->targetNamespace, elemDecl);
126935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter);
126945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
126955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, counter);
126965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
126975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (particle->minOccurs == 0) {
126985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state);
126995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 1;
127005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
127015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
127025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
127035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
127045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
127065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBuildAContentModel:
127075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
127085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle:  the particle component
127095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the complex type's name whose content is being built
127105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
127115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create the automaton for the {content type} of a complex type.
127125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
127135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the content is nillable, 0 otherwise
127145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
127155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
127165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
127175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaParticlePtr particle)
127185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
127195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, tmp2;
127205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle == NULL) {
127225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL");
127235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
127245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
127255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->children == NULL) {
127265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
127275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Just return in this case. A missing "term" of the particle
127285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* might arise due to an invalid "term" component.
127295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
127305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
127315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
127325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (particle->children->type) {
127345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ANY: {
127355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAutomataStatePtr start, end;
127365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaWildcardPtr wild;
127375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaWildcardNsPtr ns;
127385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    wild = (xmlSchemaWildcardPtr) particle->children;
127405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    start = pctxt->state;
127425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = xmlAutomataNewState(pctxt->am);
127435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (particle->maxOccurs == 1) {
127455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (wild->any == 1) {
127465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
127475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * We need to add both transitions:
127485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *
127495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 1. the {"*", "*"} for elements in a namespace.
127505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
127515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state =
127525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewTransition2(pctxt->am,
127535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
127545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
127555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
127565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 2. the {"*"} for elements in no namespace.
127575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
127585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state =
127595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewTransition2(pctxt->am,
127605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, NULL, BAD_CAST "*", NULL, wild);
127615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
127625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (wild->nsSet != NULL) {
127645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = wild->nsSet;
127655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    do {
127665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			pctxt->state = start;
127675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			pctxt->state = xmlAutomataNewTransition2(pctxt->am,
127685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    pctxt->state, NULL, BAD_CAST "*", ns->value, wild);
127695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
127705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = ns->next;
127715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } while (ns != NULL);
127725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (wild->negNsSet != NULL) {
127745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
127755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, end, BAD_CAST "*", wild->negNsSet->value,
127765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			wild);
127775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
127785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
127795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int counter;
127805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAutomataStatePtr hop;
127815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int maxOccurs =
127825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
127835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           particle->maxOccurs - 1;
127845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int minOccurs =
127855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
127865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
127885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		hop = xmlAutomataNewState(pctxt->am);
127895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (wild->any == 1) {
127905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state =
127915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewTransition2(pctxt->am,
127925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
127935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
127945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state =
127955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewTransition2(pctxt->am,
127965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, NULL, BAD_CAST "*", NULL, wild);
127975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
127985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (wild->nsSet != NULL) {
127995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = wild->nsSet;
128005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    do {
128015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			pctxt->state =
128025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlAutomataNewTransition2(pctxt->am,
128035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				start, NULL, BAD_CAST "*", ns->value, wild);
128045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
128055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = ns->next;
128065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } while (ns != NULL);
128075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (wild->negNsSet != NULL) {
128095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
128105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			start, hop, BAD_CAST "*", wild->negNsSet->value,
128115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			wild);
128125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
128135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
128145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
128155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
128165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (particle->minOccurs == 0) {
128175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAutomataNewEpsilon(pctxt->am, start, end);
128185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = 1;
128195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
128205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pctxt->state = end;
128215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
128225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
128235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_ELEMENT:
128245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
128255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
128265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_SEQUENCE:{
128275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSchemaTreeItemPtr sub;
128285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 1;
128305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
128315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * If max and min occurances are default (1) then
128325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * simply iterate over the particles of the <sequence>.
128335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
128345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
128355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sub = particle->children->children;
128365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (sub != NULL) {
128385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
128395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
128405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp2 != 1) ret = 0;
128415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    sub = sub->next;
128425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
128435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
128445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataStatePtr oldstate = pctxt->state;
128455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (particle->maxOccurs >= UNBOUNDED) {
128475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (particle->minOccurs > 1) {
128485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataStatePtr tmp;
128495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int counter;
128505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
128525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            oldstate, NULL);
128535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        oldstate = pctxt->state;
128545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        counter = xmlAutomataNewCounter(pctxt->am,
128565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            particle->minOccurs - 1, UNBOUNDED);
128575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        sub = particle->children->children;
128595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        while (sub != NULL) {
128605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
128615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            (xmlSchemaParticlePtr) sub);
128625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (tmp2 != 1) ret = 0;
128635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            sub = sub->next;
128645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
128655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp = pctxt->state;
128665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewCountedTrans(pctxt->am, tmp,
128675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   oldstate, counter);
128685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        pctxt->state =
128695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlAutomataNewCounterTrans(pctxt->am, tmp,
128705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       NULL, counter);
128715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (ret == 1)
128725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlAutomataNewEpsilon(pctxt->am,
128735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                oldstate, pctxt->state);
128745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    } else {
128765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
128775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            oldstate, NULL);
128785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        oldstate = pctxt->state;
128795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        sub = particle->children->children;
128815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        while (sub != NULL) {
128825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
128835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
128845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (tmp2 != 1) ret = 0;
128855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            sub = sub->next;
128865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
128875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
128885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              oldstate);
128895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        /*
128905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         * epsilon needed to block previous trans from
128915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         * being allowed to enter back from another
128925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         * construct
128935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         */
128945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
128955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            pctxt->state, NULL);
128965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (particle->minOccurs == 0) {
128975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlAutomataNewEpsilon(pctxt->am,
128985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                oldstate, pctxt->state);
128995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ret = 1;
129005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
129015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
129025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if ((particle->maxOccurs > 1)
129035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           || (particle->minOccurs > 1)) {
129045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataStatePtr tmp;
129055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int counter;
129065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
129085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        oldstate, NULL);
129095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    oldstate = pctxt->state;
129105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    counter = xmlAutomataNewCounter(pctxt->am,
129125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        particle->minOccurs - 1,
129135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        particle->maxOccurs - 1);
129145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    sub = particle->children->children;
129165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    while (sub != NULL) {
129175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp2 = xmlSchemaBuildAContentModel(pctxt,
129185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
129195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp2 != 1) ret = 0;
129205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        sub = sub->next;
129215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
129225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp = pctxt->state;
129235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataNewCountedTrans(pctxt->am,
129245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp, oldstate, counter);
129255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pctxt->state =
129265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL,
129275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   counter);
129285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((particle->minOccurs == 0) || (ret == 1)) {
129295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewEpsilon(pctxt->am,
129305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            oldstate, pctxt->state);
129315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret = 1;
129325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
129335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
129345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    sub = particle->children->children;
129355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    while (sub != NULL) {
129365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp2 = xmlSchemaBuildAContentModel(pctxt,
129375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
129385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp2 != 1) ret = 0;
129395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        sub = sub->next;
129405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
129415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (particle->minOccurs == 0) {
129425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewEpsilon(pctxt->am, oldstate,
129435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              pctxt->state);
129445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret = 1;
129455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
129465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
129475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
129485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
129495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
129505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_CHOICE:{
129515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSchemaTreeItemPtr sub;
129525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlAutomataStatePtr start, end;
129535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 0;
129555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            start = pctxt->state;
129565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            end = xmlAutomataNewState(pctxt->am);
129575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
129595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * iterate over the subtypes and remerge the end with an
129605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * epsilon transition
129615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
129625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (particle->maxOccurs == 1) {
129635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sub = particle->children->children;
129645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (sub != NULL) {
129655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pctxt->state = start;
129665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
129675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
129685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp2 == 1) ret = 1;
129695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
129705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    sub = sub->next;
129715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
129725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
129735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int counter;
129745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataStatePtr hop, base;
129755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int maxOccurs = particle->maxOccurs == UNBOUNDED ?
129765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    UNBOUNDED : particle->maxOccurs - 1;
129775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int minOccurs =
129785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
129795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /*
129815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * use a counter to keep track of the number of transtions
129825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * which went through the choice.
129835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 */
129845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                counter =
129855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
129865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                hop = xmlAutomataNewState(pctxt->am);
129875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                base = xmlAutomataNewState(pctxt->am);
129885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sub = particle->children->children;
129905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (sub != NULL) {
129915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pctxt->state = base;
129925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
129935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        (xmlSchemaParticlePtr) sub);
129945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp2 == 1) ret = 1;
129955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
129965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    sub = sub->next;
129975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
129985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewEpsilon(pctxt->am, start, base);
129995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter);
130005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
130015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ret == 1)
130025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlAutomataNewEpsilon(pctxt->am, base, end);
130035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
130045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (particle->minOccurs == 0) {
130055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewEpsilon(pctxt->am, start, end);
130065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = 1;
130075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
130085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pctxt->state = end;
130095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
130105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
130115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_TYPE_ALL:{
130125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlAutomataStatePtr start, tmp;
130135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSchemaParticlePtr sub;
130145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSchemaElementPtr elemDecl;
130155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 1;
130175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sub = (xmlSchemaParticlePtr) particle->children->children;
130195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (sub == NULL)
130205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
130215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 0;
130235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            start = pctxt->state;
130255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = xmlAutomataNewState(pctxt->am);
130265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
130275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pctxt->state = tmp;
130285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (sub != NULL) {
130295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pctxt->state = tmp;
130305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                elemDecl = (xmlSchemaElementPtr) sub->children;
130325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (elemDecl == NULL) {
130335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PERROR_INT("xmlSchemaBuildAContentModel",
130345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "<element> particle has no term");
130355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return(ret);
130365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                };
130375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /*
130385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                * NOTE: The {max occurs} of all the particles in the
130395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                * {particles} of the group must be 0 or 1; this is
130405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                * already ensured during the parse of the content of
130415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                * <all>.
130425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                */
130435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
130445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int counter;
130455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    /*
130475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * This is an abstract group, we need to share
130485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * the same counter for all the element transitions
130495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * derived from the group
130505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     */
130515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    counter = xmlAutomataNewCounter(pctxt->am,
130525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       sub->minOccurs, sub->maxOccurs);
130535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlSchemaBuildContentModelForSubstGroup(pctxt,
130545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       sub, counter, pctxt->state);
130555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
130565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((sub->minOccurs == 1) &&
130575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (sub->maxOccurs == 1)) {
130585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
130595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                pctxt->state,
130605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                elemDecl->name,
130615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                elemDecl->targetNamespace,
130625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                1, 1, elemDecl);
130635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    } else if ((sub->minOccurs == 0) &&
130645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (sub->maxOccurs == 1)) {
130655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
130675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 pctxt->state,
130685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 elemDecl->name,
130695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 elemDecl->targetNamespace,
130705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 0,
130715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 1,
130725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 elemDecl);
130735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
130745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
130755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sub = (xmlSchemaParticlePtr) sub->next;
130765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
130775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pctxt->state =
130785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0);
130795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (particle->minOccurs == 0) {
130805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state);
130815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = 1;
130825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
130835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
130845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
130855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_GROUP:
130865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
130875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * If we hit a model group definition, then this means that
130885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * it was empty, thus was not substituted for the containing
130895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * model group. Just do nothing in this case.
130905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: But the group should be substituted and not occur at
130915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * all in the content model at this point. Fix this.
130925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
130935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = 1;
130945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
130955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
130965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaInternalErr2(ACTXT_CAST pctxt,
130975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlSchemaBuildAContentModel",
130985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"found unexpected term of type '%s' in content model",
130995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(particle->children), NULL);
131005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(ret);
131015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
131025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
131035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
131045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
131065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBuildContentModel:
131075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
131085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
131095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the element name
131105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
131115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Builds the content model of the complex type.
131125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
131135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
131145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBuildContentModel(xmlSchemaTypePtr type,
131155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaParserCtxtPtr ctxt)
131165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
131175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->type != XML_SCHEMA_TYPE_COMPLEX) ||
131185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->contModel != NULL) ||
131195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
131205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->contentType != XML_SCHEMA_CONTENT_MIXED)))
131215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
131225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CONTENT
131245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
131255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Building content model for %s\n", name);
131265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
131275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->am = NULL;
131285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->am = xmlNewAutomata();
131295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->am == NULL) {
131305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
131315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Cannot create automata for complex type %s\n", type->name);
131325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
131335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
131345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->state = xmlAutomataGetInitState(ctxt->am);
131355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
131365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Build the automaton.
131375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
131385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type));
131395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAutomataSetFinalState(ctxt->am, ctxt->state);
131405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->contModel = xmlAutomataCompile(ctxt->am);
131415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->contModel == NULL) {
131425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPCustomErr(ctxt,
131435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_INTERNAL,
131445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, type->node,
131455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Failed to compile the content model", NULL);
131465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlRegexpIsDeterminist(type->contModel) != 1) {
131475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaPCustomErr(ctxt,
131485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_NOT_DETERMINISTIC,
131495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* XML_SCHEMAS_ERR_NOTDETERMINIST, */
131505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, type->node,
131515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The content model is not determinist", NULL);
131525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
131535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CONTENT_REGEXP
131545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
131555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Content model of %s:\n", type->name);
131565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRegexpPrint(stderr, type->contModel);
131575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
131585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
131595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->state = NULL;
131605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeAutomata(ctxt->am);
131615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->am = NULL;
131625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
131635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
131655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveElementReferences:
131665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  the schema element context
131675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
131685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
131695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves the references of an element declaration
131705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or particle, which has an element declaration as it's
131715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * term.
131725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
131735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
131745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
131755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaParserCtxtPtr ctxt)
131765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
131775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (elemDecl == NULL) ||
131785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((elemDecl != NULL) &&
131795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
131805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
131815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
131825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) {
131845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr type;
131855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* (type definition) ... otherwise the type definition �resolved�
131875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to by the �actual value� of the type [attribute] ...
131885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
131895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
131905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemDecl->namedTypeNs);
131915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == NULL) {
131925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt,
131935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE,
131945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST elemDecl, elemDecl->node,
131955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"type", elemDecl->namedType, elemDecl->namedTypeNs,
131965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_BASIC, "type definition");
131975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
131985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemDecl->subtypes = type;
131995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
132005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemDecl->substGroup != NULL) {
132015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaElementPtr substHead;
132025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
132045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* FIXME TODO: Do we need a new field in _xmlSchemaElement for
132055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* substitutionGroup?
132065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
132075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
132085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemDecl->substGroupNs);
132095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (substHead == NULL) {
132105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt,
132115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE,
132125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST elemDecl, NULL,
132135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"substitutionGroup", elemDecl->substGroup,
132145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL);
132155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
132165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaResolveElementReferences(substHead, ctxt);
132175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
132185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Set the "substitution group affiliation".
132195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE that now we use the "refDecl" field for this.
132205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
132215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_SUBST_HEAD(elemDecl) = substHead;
132225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
132235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The type definitions is set to:
132245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC "...the {type definition} of the element
132255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * declaration �resolved� to by the �actual value�
132265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * of the substitutionGroup [attribute], if present"
132275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
132285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (elemDecl->subtypes == NULL)
132295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->subtypes = substHead->subtypes;
132305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
132315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
132325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
132335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "The definition of anyType serves as the default type definition
132345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * for element declarations whose XML representation does not specify one."
132355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
132365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemDecl->subtypes == NULL) &&
132375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elemDecl->namedType == NULL) &&
132385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elemDecl->substGroup == NULL))
132395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
132405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
132415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
132435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveUnionMemberTypes:
132445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
132455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the schema simple type definition
132465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
132475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks and builds the "member type definitions" property of the union
132485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * simple type. This handles part (1), part (2) is done in
132495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFinishMemberTypeDefinitionsProperty()
132505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
132515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of an internal error, 0 otherwise.
132525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
132535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
132545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
132555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaTypePtr type)
132565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
132575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeLinkPtr link, lastLink, newLink;
132595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr memberType;
132605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
132625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "If the <union> alternative is chosen, then [Definition:]
132635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * define the explicit members as the type definitions �resolved�
132645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to by the items in the �actual value� of the memberTypes [attribute],
132655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * if any, followed by the type definitions corresponding to the
132665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * <simpleType>s among the [children] of <union>, if any."
132675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
132685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
132695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Resolve references.
132705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
132715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    link = type->memberTypes;
132725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lastLink = NULL;
132735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (link != NULL) {
132745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *name, *nsName;
132755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = ((xmlSchemaQNameRefPtr) link->type)->name;
132775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace;
132785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memberType = xmlSchemaGetType(ctxt->schema, name, nsName);
132805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) {
132815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
132825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, type->node, "memberTypes",
132835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL);
132845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
132855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Remove the member type link.
132865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
132875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (lastLink == NULL)
132885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->memberTypes = link->next;
132895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
132905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastLink->next = link->next;
132915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    newLink = link;
132925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link = link->next;
132935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(newLink);
132945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
132955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link->type = memberType;
132965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    lastLink = link;
132975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link = link->next;
132985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
132995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
133005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
133015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add local simple types,
133025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
133035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memberType = type->subtypes;
133045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (memberType != NULL) {
133055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink));
133065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (link == NULL) {
133075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL);
133085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
133095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
133105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link->type = memberType;
133115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link->next = NULL;
133125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (lastLink == NULL)
133135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->memberTypes = link;
133145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
133155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    lastLink->next = link;
133165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	lastLink = link;
133175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memberType = memberType->next;
133185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
133195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
133205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
133215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
133235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsDerivedFromBuiltInType:
133245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
133255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type definition
133265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @valType: the value type
133275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
133285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
133295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the type has the given value type, or
133305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is derived from such a type.
133315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
133325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
133335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
133345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
133355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
133365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
133375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(type))
133385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
133395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_BASIC) {
133405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->builtInType == valType)
133415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
133425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
133435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (type->builtInType == XML_SCHEMAS_ANYTYPE))
133445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
133455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
133465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
133475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
133485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
133495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
133515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
133525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsDerivedFromBuiltInType:
133535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
133545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type definition
133555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @valType: the value type
133565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
133575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
133585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the type has the given value type, or
133595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is derived from such a type.
133605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
133615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
133625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
133635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
133645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
133655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
133665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(type))
133675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
133685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_BASIC) {
133695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->builtInType == valType)
133705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
133715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
133725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
133735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
133745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
133765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
133775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
133795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaQueryBuiltInType(xmlSchemaTypePtr type)
133805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
133815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
133825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
133835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(type))
133845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
133855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_BASIC)
133865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(type);
133875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaQueryBuiltInType(type->subtypes));
133885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
133895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
133905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
133925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetPrimitiveType:
133935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simpleType definition
133945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
133955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the primitive type of the given type or
133965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of error.
133975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
133985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
133995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetPrimitiveType(xmlSchemaTypePtr type)
134005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
134015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (type != NULL) {
134035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
134045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that anySimpleType is actually not a primitive type
134055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* but we need that here.
134065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
134075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
134085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
134095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (type);
134105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = type->baseType;
134115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
134125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
134145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
134155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
134175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
134185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetBuiltInTypeAncestor:
134195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simpleType definition
134205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
134215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the primitive type of the given type or
134225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of error.
134235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
134245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypePtr
134255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type)
134265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
134275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_LIST(type) || WXS_IS_UNION(type))
134285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
134295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (type != NULL) {
134305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->type == XML_SCHEMA_TYPE_BASIC)
134315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (type);
134325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = type->baseType;
134335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
134345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
134365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
134375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
134385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
134405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCloneWildcardNsConstraints:
134415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
134425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dest:  the destination wildcard
134435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @source: the source wildcard
134445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
134455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clones the namespace constraints of source
134465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and assignes them to dest.
134475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 on internal error, 0 otherwise.
134485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
134495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
134505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
134515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaWildcardPtr dest,
134525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaWildcardPtr source)
134535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
134545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr cur, tmp, last;
134555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((source == NULL) || (dest == NULL))
134575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
134585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dest->any = source->any;
134595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = source->nsSet;
134605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last = NULL;
134615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
134625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
134635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmp == NULL)
134645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
134655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp->value = cur->value;
134665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (last == NULL)
134675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dest->nsSet = tmp;
134685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
134695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    last->next = tmp;
134705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	last = tmp;
134715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
134725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
134735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dest->negNsSet != NULL)
134745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeWildcardNsSet(dest->negNsSet);
134755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source->negNsSet != NULL) {
134765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
134775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dest->negNsSet == NULL)
134785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
134795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dest->negNsSet->value = source->negNsSet->value;
134805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
134815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dest->negNsSet = NULL;
134825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
134835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
134845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
134865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaUnionWildcards:
134875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
134885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @completeWild:  the first wildcard
134895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @curWild: the second wildcard
134905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
134915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unions the namespace constraints of the given wildcards.
134925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @completeWild will hold the resulting union.
134935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a positive error code on failure, -1 in case of an
134945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal error, 0 otherwise.
134955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
134965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
134975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
134985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaWildcardPtr completeWild,
134995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaWildcardPtr curWild)
135005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
135015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr cur, curB, tmp;
135025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
135045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 If O1 and O2 are the same value, then that value must be the
135055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * value.
135065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
135075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->any == curWild->any) &&
135085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
135095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
135105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((completeWild->negNsSet == NULL) ||
135125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
135135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
135155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int found = 0;
135165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
135185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Check equality of sets.
135195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
135205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = completeWild->nsSet;
135215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (cur != NULL) {
135225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    found = 0;
135235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    curB = curWild->nsSet;
135245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (curB != NULL) {
135255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (cur->value == curB->value) {
135265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    found = 1;
135275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
135285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
135295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			curB = curB->next;
135305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
135315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!found)
135325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
135335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = cur->next;
135345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
135355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (found)
135365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(0);
135375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
135385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
135395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
135405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
135415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
135425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2 If either O1 or O2 is any, then any must be the value
135435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
135445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (completeWild->any != curWild->any) {
135455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (completeWild->any == 0) {
135465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    completeWild->any = 1;
135475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
135485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
135495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->nsSet = NULL;
135505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
135515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->negNsSet != NULL) {
135525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(completeWild->negNsSet);
135535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->negNsSet = NULL;
135545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
135555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
135565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
135575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
135585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
135595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3 If both O1 and O2 are sets of (namespace names or �absent�),
135605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the union of those sets must be the value.
135615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
135625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
135635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int found;
135645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaWildcardNsPtr start;
135655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = curWild->nsSet;
135675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	start = completeWild->nsSet;
135685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
135695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 0;
135705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    curB = start;
135715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (curB != NULL) {
135725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->value == curB->value) {
135735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    found = 1;
135745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
135755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
135765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curB = curB->next;
135775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
135785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!found) {
135795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
135805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == NULL)
135815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
135825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp->value = cur->value;
135835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp->next = completeWild->nsSet;
135845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->nsSet = tmp;
135855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
135865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
135875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
135885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
135905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
135915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
135925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 4 If the two are negations of different values (namespace names
135935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * or �absent�), then a pair of not and �absent� must be the value.
135945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
135955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->negNsSet != NULL) &&
135965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->negNsSet != NULL) &&
135975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value != curWild->negNsSet->value)) {
135985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	completeWild->negNsSet->value = NULL;
135995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
136015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
136025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
136035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 5.
136045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
136055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((completeWild->negNsSet != NULL) &&
136065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value != NULL) &&
136075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->nsSet != NULL)) ||
136085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((curWild->negNsSet != NULL) &&
136095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->negNsSet->value != NULL) &&
136105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->nsSet != NULL))) {
136115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int nsFound, absentFound = 0;
136135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (completeWild->nsSet != NULL) {
136155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = completeWild->nsSet;
136165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    curB = curWild->negNsSet;
136175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
136185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = curWild->nsSet;
136195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    curB = completeWild->negNsSet;
136205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
136215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsFound = 0;
136225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
136235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->value == NULL)
136245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		absentFound = 1;
136255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (cur->value == curB->value)
136265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsFound = 1;
136275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsFound && absentFound)
136285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
136295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
136305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
136315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsFound && absentFound) {
136335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
136345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 5.1 If the set S includes both the negated namespace
136355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * name and �absent�, then any must be the value.
136365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
136375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    completeWild->any = 1;
136385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
136395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
136405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->nsSet = NULL;
136415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
136425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->negNsSet != NULL) {
136435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(completeWild->negNsSet);
136445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->negNsSet = NULL;
136455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
136465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (nsFound && (!absentFound)) {
136475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
136485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 5.2 If the set S includes the negated namespace name
136495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * but not �absent�, then a pair of not and �absent� must
136505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * be the value.
136515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
136525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
136535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
136545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->nsSet = NULL;
136555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
136565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->negNsSet == NULL) {
136575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
136585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (completeWild->negNsSet == NULL)
136595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
136605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
136615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    completeWild->negNsSet->value = NULL;
136625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!nsFound) && absentFound) {
136635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
136645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 5.3 If the set S includes �absent� but not the negated
136655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * namespace name, then the union is not expressible.
136665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
136675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(ctxt, completeWild->node,
136685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_UNION_NOT_EXPRESSIBLE,
136695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The union of the wilcard is not expressible.\n",
136705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
136715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE);
136725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!nsFound) && (!absentFound)) {
136735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
136745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 5.4 If the set S does not include either the negated namespace
136755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * name or �absent�, then whichever of O1 or O2 is a pair of not
136765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * and a namespace name must be the value.
136775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
136785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->negNsSet == NULL) {
136795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (completeWild->nsSet != NULL) {
136805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
136815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    completeWild->nsSet = NULL;
136825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
136835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
136845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (completeWild->negNsSet == NULL)
136855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
136865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->negNsSet->value = curWild->negNsSet->value;
136875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
136885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
136895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
136905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
136915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
136925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 6.
136935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
136945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((completeWild->negNsSet != NULL) &&
136955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value == NULL) &&
136965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->nsSet != NULL)) ||
136975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((curWild->negNsSet != NULL) &&
136985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->negNsSet->value == NULL) &&
136995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->nsSet != NULL))) {
137005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (completeWild->nsSet != NULL) {
137025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = completeWild->nsSet;
137035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
137045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = curWild->nsSet;
137055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
137065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
137075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->value == NULL) {
137085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
137095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 6.1 If the set S includes �absent�, then any must be the
137105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* value.
137115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
137125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->any = 1;
137135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (completeWild->nsSet != NULL) {
137145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
137155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    completeWild->nsSet = NULL;
137165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
137175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (completeWild->negNsSet != NULL) {
137185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(completeWild->negNsSet);
137195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    completeWild->negNsSet = NULL;
137205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
137215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
137225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
137235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
137245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
137255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (completeWild->negNsSet == NULL) {
137265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
137275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 6.2 If the set S does not include �absent�, then a pair of not
137285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * and �absent� must be the value.
137295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
137305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
137315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
137325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		completeWild->nsSet = NULL;
137335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
137345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
137355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->negNsSet == NULL)
137365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
137375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    completeWild->negNsSet->value = NULL;
137385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
137395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
137405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
137415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
137425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
137445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
137465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIntersectWildcards:
137475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
137485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @completeWild:  the first wildcard
137495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @curWild: the second wildcard
137505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
137515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Intersects the namespace constraints of the given wildcards.
137525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @completeWild will hold the resulting intersection.
137535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a positive error code on failure, -1 in case of an
137545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal error, 0 otherwise.
137555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
137565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
137575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
137585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaWildcardPtr completeWild,
137595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaWildcardPtr curWild)
137605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
137615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardNsPtr cur, curB, prev,  tmp;
137625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
137645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 If O1 and O2 are the same value, then that value must be the
137655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * value.
137665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
137675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->any == curWild->any) &&
137685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
137695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
137705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((completeWild->negNsSet == NULL) ||
137725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
137735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (completeWild->nsSet != NULL) {
137755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int found = 0;
137765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
137785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Check equality of sets.
137795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
137805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = completeWild->nsSet;
137815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (cur != NULL) {
137825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    found = 0;
137835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    curB = curWild->nsSet;
137845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (curB != NULL) {
137855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (cur->value == curB->value) {
137865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    found = 1;
137875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
137885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
137895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			curB = curB->next;
137905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
137915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!found)
137925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
137935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = cur->next;
137945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
137955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (found)
137965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(0);
137975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
137985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
137995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
138005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
138015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
138025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2 If either O1 or O2 is any, then the other must be the value.
138035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
138045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->any != curWild->any) && (completeWild->any)) {
138055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
138065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
138075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
138085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
138095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
138105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3 If either O1 or O2 is a pair of not and a value (a namespace
138115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * name or �absent�) and the other is a set of (namespace names or
138125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * �absent�), then that set, minus the negated value if it was in
138135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the set, minus �absent� if it was in the set, must be the value.
138145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
138155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) ||
138165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) {
138175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *neg;
138185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (completeWild->nsSet == NULL) {
138205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    neg = completeWild->negNsSet->value;
138215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
138225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
138235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
138245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    neg = curWild->negNsSet->value;
138255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
138265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Remove absent and negated.
138275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
138285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = NULL;
138295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = completeWild->nsSet;
138305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
138315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->value == NULL) {
138325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (prev == NULL)
138335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    completeWild->nsSet = cur->next;
138345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
138355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prev->next = cur->next;
138365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(cur);
138375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
138385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
138395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = cur;
138405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
138415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
138425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (neg != NULL) {
138435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = NULL;
138445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = completeWild->nsSet;
138455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
138465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->value == neg) {
138475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (prev == NULL)
138485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			completeWild->nsSet = cur->next;
138495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
138505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prev->next = cur->next;
138515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(cur);
138525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
138535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
138545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev = cur;
138555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
138565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
138575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
138585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
138605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
138615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
138625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 4 If both O1 and O2 are sets of (namespace names or �absent�),
138635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the intersection of those sets must be the value.
138645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
138655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
138665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int found;
138675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = completeWild->nsSet;
138695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = NULL;
138705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
138715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 0;
138725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    curB = curWild->nsSet;
138735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (curB != NULL) {
138745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->value == curB->value) {
138755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    found = 1;
138765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
138775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
138785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curB = curB->next;
138795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
138805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!found) {
138815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (prev == NULL)
138825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    completeWild->nsSet = cur->next;
138835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
138845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prev->next = cur->next;
138855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = cur->next;
138865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(cur);
138875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = tmp;
138885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
138895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
138905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = cur;
138915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
138925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
138935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
138955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
138965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* 5 If the two are negations of different namespace names,
138975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the intersection is not expressible
138985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
138995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->negNsSet != NULL) &&
139005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->negNsSet != NULL) &&
139015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
139025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value != NULL) &&
139035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(curWild->negNsSet->value != NULL)) {
139045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE,
139065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The intersection of the wilcard is not expressible.\n",
139075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, NULL);
139085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE);
139095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
139105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
139115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 6 If the one is a negation of a namespace name and the other
139125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is a negation of �absent�, then the one which is the negation
139135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of a namespace name must be the value.
139145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
139155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) &&
139165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
139175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(completeWild->negNsSet->value == NULL)) {
139185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	completeWild->negNsSet->value =  curWild->negNsSet->value;
139195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
139205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
139215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
139225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
139245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsWildcardNsConstraintSubset:
139255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
139265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sub:  the first wildcard
139275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @super: the second wildcard
139285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
139295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Wildcard Subset (cos-ns-subset)
139305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
139315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the namespace constraint of @sub is an intensional
139325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * subset of @super, 1 otherwise.
139335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
139345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
139355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
139365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaWildcardPtr super)
139375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
139385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
139395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 super must be any.
139405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
139415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (super->any)
139425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
139435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
139445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.1 sub must be a pair of not and a namespace name or �absent�.
139455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2 super must be a pair of not and the same value.
139465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
139475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((sub->negNsSet != NULL) &&
139485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(super->negNsSet != NULL) &&
139495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(sub->negNsSet->value == super->negNsSet->value))
139505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
139515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
139525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.1 sub must be a set whose members are either namespace names or �absent�.
139535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
139545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sub->nsSet != NULL) {
139555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
139565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.2.1 super must be the same set or a superset thereof.
139575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
139585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (super->nsSet != NULL) {
139595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaWildcardNsPtr cur, curB;
139605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int found = 0;
139615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = sub->nsSet;
139635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
139645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		found = 0;
139655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curB = super->nsSet;
139665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (curB != NULL) {
139675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->value == curB->value) {
139685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			found = 1;
139695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
139705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
139715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    curB = curB->next;
139725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
139735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!found)
139745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (1);
139755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
139765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
139775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (found)
139785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
139795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (super->negNsSet != NULL) {
139805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaWildcardNsPtr cur;
139815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
139825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.2.2 super must be a pair of not and a namespace name or
139835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �absent� and that value must not be in sub's set.
139845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
139855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = sub->nsSet;
139865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
139875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->value == super->negNsSet->value)
139885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (1);
139895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
139905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
139915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
139925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
139935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
139945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (1);
139955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
139965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
139985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
139995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     int *fixed,
140005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     const xmlChar **value,
140015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlSchemaValPtr *val)
140025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
140035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fixed = 0;
140045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = NULL;
140055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val != 0)
140065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*val = NULL;
140075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attruse->defValue != NULL) {
140095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*value = attruse->defValue;
140105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (val != NULL)
140115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *val = attruse->defVal;
140125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
140135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *fixed = 1;
140145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
140155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((attruse->attrDecl != NULL) &&
140165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(attruse->attrDecl->defValue != NULL)) {
140175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*value = attruse->attrDecl->defValue;
140185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (val != NULL)
140195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *val = attruse->attrDecl->defVal;
140205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
140215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *fixed = 1;
140225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
140235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
140245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
140255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
140265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
140275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCVCWildcardNamespace:
140285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @wild:  the wildcard
140295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the namespace
140305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
140315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validation Rule: Wildcard allows Namespace Name
140325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (cvc-wildcard-namespace)
140335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
140345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the given namespace matches the wildcard,
140355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1 otherwise and -1 on API errors.
140365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
140375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
140385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
140395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const xmlChar* ns)
140405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
140415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild == NULL)
140425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
140435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild->any)
140455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
140465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (wild->nsSet != NULL) {
140475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaWildcardNsPtr cur;
140485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = wild->nsSet;
140505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
140515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(cur->value, ns))
140525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
140535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
140545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
140555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((wild->negNsSet != NULL) && (ns != NULL) &&
140565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(!xmlStrEqual(wild->negNsSet->value, ns)))
140575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
140585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
140605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
140615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ACTION_DERIVE 0
140635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_ACTION_REDEFINE 1
140645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_ACTION_STR(a) \
140665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
140675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
140695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Schema Component Constraint:
140705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   Derivation Valid (Restriction, Complex)
140715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   derivation-ok-restriction (2) - (4)
140725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
140735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* ATTENTION:
140745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* In XML Schema 1.1 this will be:
140755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Validation Rule:
140765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*     Checking complex type subsumption (practicalSubsumption) (1, 2 and 3)
140775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
140785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
140795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
140805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
140815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       int action,
140825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaBasicItemPtr item,
140835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaBasicItemPtr baseItem,
140845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaItemListPtr uses,
140855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaItemListPtr baseUses,
140865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaWildcardPtr wild,
140875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaWildcardPtr baseWild)
140885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
140895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr cur = NULL, bcur;
140905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j, found; /* err = 0; */
140915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *bEffValue;
140925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int effFixed;
140935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uses != NULL) {
140955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < uses->nbItems; i++) {
140965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = uses->items[i];
140975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 0;
140985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (baseUses == NULL)
140995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto not_found;
141005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (j = 0; j < baseUses->nbItems; j++) {
141015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bcur = baseUses->items[j];
141025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_ATTRUSE_DECL_NAME(cur) ==
141035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_NAME(bcur)) &&
141045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTRUSE_DECL_TNS(cur) ==
141055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_TNS(bcur)))
141065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
141075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
141085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * (2.1) "If there is an attribute use in the {attribute
141095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * uses} of the {base type definition} (call this B) whose
141105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * {attribute declaration} has the same {name} and {target
141115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * namespace}, then  all of the following must be true:"
141125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
141135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    found = 1;
141145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
141165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
141175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
141185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
141195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
141205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (2.1.1) "one of the following must be true:"
141215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (2.1.1.1) "B's {required} is false."
141225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (2.1.1.2) "R's {required} is true."
141235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
141245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPAttrUseErr4(pctxt,
141255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1,
141265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ITEM_NODE(item), item, cur,
141275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The 'optional' attribute use is inconsistent "
141285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "with the corresponding 'required' attribute use of "
141295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "the %s %s",
141305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ACTION_STR(action),
141315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&str, baseItem),
141325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, NULL);
141335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
141345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* err = pctxt->err; */
141355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
141365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_TYPEDEF(cur),
141375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
141385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
141395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
141405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
141425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* SPEC (2.1.2) "R's {attribute declaration}'s
141435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* {type definition} must be validly derived from
141445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* B's {type definition} given the empty set as
141455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* defined in Type Derivation OK (Simple) (�3.14.6)."
141465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
141475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPAttrUseErr4(pctxt,
141485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2,
141495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ITEM_NODE(item), item, cur,
141505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The attribute declaration's %s "
141515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "is not validly derived from "
141525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "the corresponding %s of the "
141535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "attribute declaration in the %s %s",
141545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&strA,
141555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_TYPEDEF(cur)),
141565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&strB,
141575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_TYPEDEF(bcur)),
141585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ACTION_STR(action),
141595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&strC, baseItem));
141605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* xmlSchemaGetComponentDesignation(&str, baseItem), */
141615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(strA);
141625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(strB);
141635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(strC);
141645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* err = pctxt->err; */
141655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
141665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
141675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* 2.1.3 [Definition:]  Let the effective value
141685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* constraint of an attribute use be its {value
141695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* constraint}, if present, otherwise its {attribute
141705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* declaration}'s {value constraint} .
141715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
141725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetEffectiveValueConstraint(bcur,
141735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    &effFixed, &bEffValue, NULL);
141745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
141755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* 2.1.3 ... one of the following must be true
141765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*
141775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* 2.1.3.1 B's �effective value constraint� is
141785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* �absent� or default.
141795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
141805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((bEffValue != NULL) &&
141815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (effFixed == 1)) {
141825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const xmlChar *rEffValue = NULL;
141835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetEffectiveValueConstraint(bcur,
141855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				&effFixed, &rEffValue, NULL);
141865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
141875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * 2.1.3.2 R's �effective value constraint� is
141885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * fixed with the same string as B's.
141895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * MAYBE TODO: Compare the computed values.
141905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    *       Hmm, it says "same string" so
141915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    *       string-equality might really be sufficient.
141925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
141935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if ((effFixed == 0) ||
141945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				(! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
141955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
141965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlChar *str = NULL;
141975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaPAttrUseErr4(pctxt,
141995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3,
142005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    WXS_ITEM_NODE(item), item, cur,
142015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "The effective value constraint of the "
142025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "attribute use is inconsistent with "
142035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "its correspondent in the %s %s",
142045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    WXS_ACTION_STR(action),
142055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaGetComponentDesignation(&str,
142065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					baseItem),
142075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    NULL, NULL);
142085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				FREE_AND_NULL(str);
142095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/* err = pctxt->err; */
142105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
142115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
142125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
142135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
142145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
142155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
142165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)not_found:
142175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!found) {
142185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
142195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (2.2) "otherwise the {base type definition} must have an
142205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* {attribute wildcard} and the {target namespace} of the
142215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* R's {attribute declaration} must be �valid� with respect
142225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* to that wildcard, as defined in Wildcard allows Namespace
142235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Name (�3.10.4)."
142245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
142255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((baseWild == NULL) ||
142265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaCheckCVCWildcardNamespace(baseWild,
142275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0))
142285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
142295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
142305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPAttrUseErr4(pctxt,
142325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2,
142335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ITEM_NODE(item), item, cur,
142345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Neither a matching attribute use, "
142355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"nor a matching wildcard exists in the %s %s",
142365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ACTION_STR(action),
142375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentDesignation(&str, baseItem),
142385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
142395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str);
142405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* err = pctxt->err; */
142415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
142425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
142435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
142445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
142455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
142465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC derivation-ok-restriction (3):
142475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (3) "For each attribute use in the {attribute uses} of the {base type
142485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition} whose {required} is true, there must be an attribute
142495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * use with an {attribute declaration} with the same {name} and
142505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {target namespace} as its {attribute declaration} in the {attribute
142515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * uses} of the complex type definition itself whose {required} is true.
142525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
142535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseUses != NULL) {
142545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (j = 0; j < baseUses->nbItems; j++) {
142555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bcur = baseUses->items[j];
142565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
142575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
142585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 0;
142595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (uses != NULL) {
142605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (i = 0; i < uses->nbItems; i++) {
142615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = uses->items[i];
142625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_ATTRUSE_DECL_NAME(cur) ==
142635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_NAME(bcur)) &&
142645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_ATTRUSE_DECL_TNS(cur) ==
142655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_TNS(bcur))) {
142665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			found = 1;
142675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
142685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
142695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
142705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
142715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!found) {
142725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *strA = NULL, *strB = NULL;
142735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr4(ACTXT_CAST pctxt,
142755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3,
142765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, item,
142775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "A matching attribute use for the "
142785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "'required' %s of the %s %s is missing",
142795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&strA, bcur),
142805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ACTION_STR(action),
142815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&strB, baseItem),
142825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL);
142835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strA);
142845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strB);
142855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
142865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
142875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
142885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
142895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * derivation-ok-restriction (4)
142905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
142915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild != NULL) {
142925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
142935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (4) "If there is an {attribute wildcard}, all of the
142945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* following must be true:"
142955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
142965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (baseWild == NULL) {
142975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
142985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
143005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (4.1) "The {base type definition} must also have one."
143015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
143025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
143035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1,
143045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, item,
143055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The %s has an attribute wildcard, "
143065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"but the %s %s '%s' does not have one",
143075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(item),
143085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ACTION_STR(action),
143095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(baseItem),
143105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, baseItem));
143115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
143125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(pctxt->err);
143135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((baseWild->any == 0) &&
143145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckCOSNSSubset(wild, baseWild))
143155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
143165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
143175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
143185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (4.2) "The complex type definition's {attribute wildcard}'s
143195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {namespace constraint} must be a subset of the {base type
143205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition}'s {attribute wildcard}'s {namespace constraint},
143215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * as defined by Wildcard Subset (�3.10.6)."
143225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
143235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
143245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2,
143255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, item,
143265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The attribute wildcard is not a valid "
143275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"subset of the wildcard in the %s %s '%s'",
143285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ACTION_STR(action),
143295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(baseItem),
143305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, baseItem),
143315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
143325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
143335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(pctxt->err);
143345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
143355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* 4.3 Unless the {base type definition} is the �ur-type
143365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition�, the complex type definition's {attribute
143375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* wildcard}'s {process contents} must be identical to or
143385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* stronger than the {base type definition}'s {attribute
143395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* wildcard}'s {process contents}, where strict is stronger
143405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* than lax is stronger than skip.
143415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
143425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! WXS_IS_ANYTYPE(baseItem)) &&
143435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (wild->processContents < baseWild->processContents)) {
143445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
143455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
143465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3,
143475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, baseItem,
143485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The {process contents} of the attribute wildcard is "
143495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"weaker than the one in the %s %s '%s'",
143505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ACTION_STR(action),
143515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(baseItem),
143525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, baseItem),
143535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
143545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
143555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(pctxt->err);
143565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
143575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
143585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
143595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
143605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
143635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
143645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaBasicItemPtr item,
143655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaWildcardPtr *completeWild,
143665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaItemListPtr list,
143675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaItemListPtr prohibs);
143685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
143695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFixupTypeAttributeUses:
143705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
143715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
143725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
143735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
143745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Builds the wildcard and the attribute uses on the given complex type.
143755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 if an internal error occurs, 0 otherwise.
143765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
143775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ATTENTION TODO: Experimantally this uses pointer comparisons for
143785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * strings, so recheck this if we start to hardcode some schemata, since
143795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * they might not be in the same dict.
143805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: It is allowed to "extend" the xs:anyType type.
143815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
143825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
143835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
143845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaTypePtr type)
143855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
143865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr baseType = NULL;
143875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr use;
143885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr uses, baseUses, prohibs = NULL;
143895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->baseType == NULL) {
143915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaFixupTypeAttributeUses",
143925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no base type");
143935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
143945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
143955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    baseType = type->baseType;
143965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_TYPE_NOT_FIXED(baseType))
143975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
143985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
143995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uses = type->attrUses;
144015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    baseUses = baseType->attrUses;
144025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
144035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Expand attribute group references. And build the 'complete'
144045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * wildcard, i.e. intersect multiple wildcards.
144055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Move attribute prohibitions into a separate list.
144065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
144075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uses != NULL) {
144085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_RESTRICTION(type)) {
144095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
144105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This one will transfer all attr. prohibitions
144115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * into pctxt->attrProhibs.
144125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
144135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
144145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
144155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pctxt->attrProhibs) == -1)
144165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
144175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
144185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to expand attributes");
144195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
144205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (pctxt->attrProhibs->nbItems != 0)
144215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prohibs = pctxt->attrProhibs;
144225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
144235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
144245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
144255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL) == -1)
144265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
144275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
144285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to expand attributes");
144295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
144305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
144315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
144325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
144335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Inherit the attribute uses of the base type.
144345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
144355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseUses != NULL) {
144365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i, j;
144375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributeUseProhibPtr pro;
144385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_RESTRICTION(type)) {
144405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int usesCount;
144415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaAttributeUsePtr tmp;
144425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (uses != NULL)
144445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		usesCount = uses->nbItems;
144455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
144465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		usesCount = 0;
144475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Restriction. */
144495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < baseUses->nbItems; i++) {
144505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		use = baseUses->items[i];
144515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (prohibs) {
144525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
144535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Filter out prohibited uses.
144545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
144555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (j = 0; j < prohibs->nbItems; j++) {
144565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			pro = prohibs->items[j];
144575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
144585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (WXS_ATTRUSE_DECL_TNS(use) ==
144595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				pro->targetNamespace))
144605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
144615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto inherit_next;
144625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
144635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
144645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
144655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (usesCount) {
144665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
144675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Filter out existing uses.
144685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
144695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (j = 0; j < usesCount; j++) {
144705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmp = uses->items[j];
144715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((WXS_ATTRUSE_DECL_NAME(use) ==
144725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_DECL_NAME(tmp)) &&
144735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (WXS_ATTRUSE_DECL_TNS(use) ==
144745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_DECL_TNS(tmp)))
144755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
144765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto inherit_next;
144775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
144785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
144795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
144805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (uses == NULL) {
144815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->attrUses = xmlSchemaItemListCreate();
144825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (type->attrUses == NULL)
144835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
144845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    uses = type->attrUses;
144855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
144865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaItemListAddSize(uses, 2, use);
144875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inherit_next: {}
144885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
144895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
144905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Extension. */
144915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < baseUses->nbItems; i++) {
144925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		use = baseUses->items[i];
144935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (uses == NULL) {
144945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->attrUses = xmlSchemaItemListCreate();
144955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (type->attrUses == NULL)
144965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
144975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    uses = type->attrUses;
144985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
144995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
145005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
145015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
145025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
145035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
145045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Shrink attr. uses.
145055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
145065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uses) {
145075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (uses->nbItems == 0) {
145085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaItemListFree(uses);
145095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->attrUses = NULL;
145105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
145115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
145125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: We could shrink the size of the array
145135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to fit the actual number of items.
145145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
145155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
145165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
145175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Compute the complete wildcard.
145185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
145195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_EXTENSION(type)) {
145205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (baseType->attributeWildcard != NULL) {
145215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
145225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.2.2.1) "If the �base wildcard� is non-�absent�, then
145235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the appropriate case among the following:"
145245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
145255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->attributeWildcard != NULL) {
145265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
145275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Union the complete wildcard with the base wildcard.
145285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC {attribute wildcard}
145295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (3.2.2.1.2) "otherwise a wildcard whose {process contents}
145305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* and {annotation} are those of the �complete wildcard�,
145315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* and whose {namespace constraint} is the intensional union
145325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of the {namespace constraint} of the �complete wildcard�
145335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* and of the �base wildcard�, as defined in Attribute
145345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Wildcard Union (�3.10.6)."
145355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
145365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard,
145375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    baseType->attributeWildcard) == -1)
145385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit_failure;
145395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
145405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
145415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (3.2.2.1.1) "If the �complete wildcard� is �absent�,
145425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* then the �base wildcard�."
145435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
145445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->attributeWildcard = baseType->attributeWildcard;
145455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
145465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
145475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
145485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the
145495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �complete wildcard"
145505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOOP
145515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
145525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
145535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
145545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
145555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC {attribute wildcard}
145565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (3.1) "If the <restriction> alternative is chosen, then the
145575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �complete wildcard�;"
145585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOOP
145595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
145605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
145615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
145635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
145655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
145665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
145695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaTypeFinalContains:
145705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  the schema
145715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type definition
145725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @final: the final
145735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluates if a type definition contains the given "final".
145755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This does take "finalDefault" into account as well.
145765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the type does containt the given "final",
145785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 0 otherwise.
145795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
145815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final)
145825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
145835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
145845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
145855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->flags & final)
145865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
145875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
145885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
145895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
145925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetUnionSimpleTypeMemberTypes:
145935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the Union Simple Type
145945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a list of member types of @type if existing,
145965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns NULL otherwise.
145975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTypeLinkPtr
145995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type)
146005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
146015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) {
146025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->memberTypes != NULL)
146035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (type->memberTypes);
146045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
146055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type = type->baseType;
146065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
146075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
146085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
146095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
146115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetParticleTotalRangeMin:
146125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle: the particle
146135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
146145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Effective Total Range
146155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (all and sequence) + (choice)
146165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
146175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the minimun Effective Total Range.
146185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
146195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
146205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
146215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
146225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((particle->children == NULL) ||
146235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(particle->minOccurs == 0))
146245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
146255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
146265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int min = -1, cur;
146275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr part =
146285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaParticlePtr) particle->children->children;
146295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (part == NULL)
146315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
146325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (part != NULL) {
146335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
146345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(part->children->type == XML_SCHEMA_TYPE_ANY))
146355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = part->minOccurs;
146365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
146375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = xmlSchemaGetParticleTotalRangeMin(part);
146385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == 0)
146395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
146405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((min > cur) || (min == -1))
146415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		min = cur;
146425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    part = (xmlSchemaParticlePtr) part->next;
146435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
146445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (particle->minOccurs * min);
146455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
146465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* <all> and <sequence> */
146475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int sum = 0;
146485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr part =
146495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaParticlePtr) particle->children->children;
146505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (part == NULL)
146525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
146535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
146545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
146555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(part->children->type == XML_SCHEMA_TYPE_ANY))
146565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sum += part->minOccurs;
146575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
146585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sum += xmlSchemaGetParticleTotalRangeMin(part);
146595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    part = (xmlSchemaParticlePtr) part->next;
146605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (part != NULL);
146615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (particle->minOccurs * sum);
146625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
146635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
146645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
146665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
146675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetParticleTotalRangeMax:
146685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle: the particle
146695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
146705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Effective Total Range
146715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (all and sequence) + (choice)
146725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
146735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the maximum Effective Total Range.
146745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
146755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
146765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
146775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
146785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((particle->children == NULL) ||
146795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(particle->children->children == NULL))
146805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
146815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
146825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int max = -1, cur;
146835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr part =
146845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaParticlePtr) particle->children->children;
146855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
146875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (part->children == NULL)
146885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
146895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
146905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(part->children->type == XML_SCHEMA_TYPE_ANY))
146915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = part->maxOccurs;
146925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
146935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = xmlSchemaGetParticleTotalRangeMax(part);
146945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == UNBOUNDED)
146955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (UNBOUNDED);
146965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((max < cur) || (max == -1))
146975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		max = cur;
146985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
146995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Handle overflows? */
147005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (particle->maxOccurs * max);
147015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
147025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* <all> and <sequence> */
147035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int sum = 0, cur;
147045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr part =
147055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaParticlePtr) particle->children->children;
147065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
147085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (part->children == NULL)
147095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
147105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
147115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(part->children->type == XML_SCHEMA_TYPE_ANY))
147125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = part->maxOccurs;
147135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
147145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = xmlSchemaGetParticleTotalRangeMax(part);
147155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == UNBOUNDED)
147165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (UNBOUNDED);
147175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur > 0) && (particle->maxOccurs == UNBOUNDED))
147185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (UNBOUNDED);
147195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sum += cur;
147205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
147215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Handle overflows? */
147225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (particle->maxOccurs * sum);
147235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
147245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
147255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
147265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
147285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsParticleEmptiable:
147295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle: the particle
147305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
147315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Particle Emptiable
147325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks whether the given particle is emptiable.
147335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
147345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if emptiable, 0 otherwise.
147355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
147365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
147375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
147385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
147395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
147405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "Its {min occurs} is 0."
147415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
147425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((particle == NULL) || (particle->minOccurs == 0) ||
147435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(particle->children == NULL))
147445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
147455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
147465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2) "Its {term} is a group and the minimum part of the
147475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * effective total range of that group, [...] is 0."
147485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
147495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_MODEL_GROUP(particle->children)) {
147505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaGetParticleTotalRangeMin(particle) == 0)
147515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
147525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
147535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
147545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
147555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
147575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSSTDerivedOK:
147585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @actxt: a context
147595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the derived simple type definition
147605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @baseType:  the base type definition
147615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @subset: the subset of ('restriction', ect.)
147625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
147635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
147645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Type Derivation OK (Simple) (cos-st-derived-OK)
147655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
147665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks wheter @type can be validly
147675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * derived from @baseType.
147685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
147695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success, an positive error code otherwise.
147705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
147715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
147725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
147735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
147745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr baseType,
147755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int subset)
147765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
147775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
147785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 They are the same type definition.
147795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: The identy check might have to be more complex than this.
147805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
147815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == baseType)
147825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
147835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
147845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.1 restriction is not in the subset, or in the {final}
147855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of its own {base type definition};
147865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
147875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE that this will be used also via "xsi:type".
147885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
147895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Revise this, it looks strange. How can the "type"
147905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * not be fixed or *in* fixing?
147915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
147925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_TYPE_NOT_FIXED(type))
147935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaTypeFixup(type, actxt) == -1)
147945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
147955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_TYPE_NOT_FIXED(baseType))
147965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaTypeFixup(baseType, actxt) == -1)
147975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
147985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((subset & SUBSET_RESTRICTION) ||
147995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaTypeFinalContains(type->baseType,
148005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
148015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1);
148025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* 2.2 */
148045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->baseType == baseType) {
148055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
148065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2.2.1 D's �base type definition� is B.
148075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
148085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
148095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
148115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2.2 D's �base type definition� is not the �ur-type definition�
148125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * and is validly derived from B given the subset, as defined by this
148135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * constraint.
148145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
148155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! WXS_IS_ANYTYPE(type->baseType)) &&
148165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
148175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    baseType, subset) == 0)) {
148185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
148195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
148215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2.3 D's {variety} is list or union and B is the �simple ur-type
148225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition�.
148235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
148245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
148255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_IS_LIST(type) || WXS_IS_UNION(type))) {
148265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
148275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
148295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2.4 B's {variety} is union and D is validly derived from a type
148305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition in B's {member type definitions} given the subset, as
148315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * defined by this constraint.
148325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
148335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: This seems not to involve built-in types, since there is no
148345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * built-in Union Simple Type.
148355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
148365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_UNION(baseType)) {
148375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeLinkPtr cur;
148385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = baseType->memberTypes;
148405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
148415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_TYPE_NOT_FIXED(cur->type))
148425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaTypeFixup(cur->type, actxt) == -1)
148435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
148445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCheckCOSSTDerivedOK(actxt,
148455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type, cur->type, subset) == 0)
148465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
148475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
148485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* It just has to be validly derived from at least one
148495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* member-type.
148505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
148515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
148525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
148535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
148545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
148555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2);
148575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
148585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
148605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckTypeDefCircularInternal:
148615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  the schema parser context
148625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxtType:  the type definition
148635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ancestor: an ancestor of @ctxtType
148645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
148655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks st-props-correct (2) + ct-props-correct (3).
148665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Circular type definitions are not allowed.
148675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
148685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is
148695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * circular, 0 otherwise.
148705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
148715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
148725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
148735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr ctxtType,
148745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr ancestor)
148755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
148765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
148775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
148795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
148805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxtType == ancestor) {
148825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(pctxt,
148835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_2,
148845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
148855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The definition is circular", NULL);
148865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_2);
148875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
148895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
148905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Avoid inifinite recursion on circular types not yet checked.
148915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
148925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
148935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
148945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
148955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
148965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ancestor->baseType);
148975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
148985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
148995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
149005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
149025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckTypeDefCircular:
149035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  the complex/simple type definition
149045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
149055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name
149065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
149075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks for circular type definitions.
149085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
149095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
149105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item,
149115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaParserCtxtPtr ctxt)
149125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
149135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((item == NULL) ||
149145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(item->type == XML_SCHEMA_TYPE_BASIC) ||
149155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(item->baseType == NULL))
149165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
149175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaCheckTypeDefCircularInternal(ctxt, item,
149185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->baseType);
149195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
149205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
149225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Simple Type Definition Representation OK (src-simple-type) 4
149235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
149245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* "4 Circular union type definition is disallowed. That is, if the
149255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* <union> alternative is chosen, there must not be any entries in the
149265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* memberTypes [attribute] at any depth which resolve to the component
149275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* corresponding to the <simpleType>."
149285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
149295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Note that this should work on the *representation* of a component,
149305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* thus assumes any union types in the member types not being yet
149315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* substituted. At this stage we need the variety of the types
149325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* to be already computed.
149335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
149345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
149355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
149365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					xmlSchemaTypePtr ctxType,
149375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					xmlSchemaTypeLinkPtr members)
149385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
149395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeLinkPtr member;
149405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr memberType;
149415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    member = members;
149435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (member != NULL) {
149445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memberType = member->type;
149455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((memberType != NULL) &&
149465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
149475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (memberType == ctxType) {
149485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
149495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_SIMPLE_TYPE_4,
149505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST ctxType, NULL,
149515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The union type definition is circular", NULL);
149525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4);
149535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
149545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((WXS_IS_UNION(memberType)) &&
149555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
149565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
149575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int res;
149585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
149595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
149605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxType,
149615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
149625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
149635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (res != 0)
149645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(res);
149655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
149665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memberType = memberType->baseType;
149675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
149685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	member = member->next;
149695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
149705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
149715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
149725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
149745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
149755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaTypePtr type)
149765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
149775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_UNION(type))
149785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
149795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type,
149805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->memberTypes));
149815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
149825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
149845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveTypeReferences:
149855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  the complex/simple type definition
149865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
149875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name
149885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
149895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolvese type definition references
149905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
149915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
149925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
149935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaParserCtxtPtr ctxt)
149945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
149955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (typeDef == NULL)
149965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
149975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
149995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Resolve the base type.
150005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
150015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (typeDef->baseType == NULL) {
150025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	typeDef->baseType = xmlSchemaGetType(ctxt->schema,
150035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    typeDef->base, typeDef->baseNs);
150045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (typeDef->baseType == NULL) {
150055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt,
150065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE,
150075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST typeDef, typeDef->node,
150085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"base", typeDef->base, typeDef->baseNs,
150095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_SIMPLE, NULL);
150105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
150115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
150125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
150135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_SIMPLE(typeDef)) {
150145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_UNION(typeDef)) {
150155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
150165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Resolve the memberTypes.
150175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
150185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
150195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
150205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_IS_LIST(typeDef)) {
150215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
150225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Resolve the itemType.
150235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
150245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) {
150255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
150275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    typeDef->base, typeDef->baseNs);
150285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((typeDef->subtypes == NULL) ||
150305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (! WXS_IS_SIMPLE(typeDef->subtypes)))
150315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
150325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    typeDef->subtypes = NULL;
150335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPResCompAttrErr(ctxt,
150345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_RESOLVE,
150355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST typeDef, typeDef->node,
150365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"itemType", typeDef->base, typeDef->baseNs,
150375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMA_TYPE_SIMPLE, NULL);
150385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
150395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
150405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
150415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
150425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
150435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
150445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The ball of letters below means, that if we have a particle
150455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * which has a QName-helper component as its {term}, we want
150465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to resolve it...
150475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
150485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) &&
150495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((WXS_TYPE_CONTENTTYPE(typeDef))->type ==
150505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_PARTICLE) &&
150515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) &&
150525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((WXS_TYPE_PARTICLE_TERM(typeDef))->type ==
150535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_EXTRA_QNAMEREF))
150545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
150555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr ref =
150565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
150575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaModelGroupDefPtr groupDef;
150585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
150605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* URGENT TODO: Test this.
150615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
150625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_TYPE_PARTICLE_TERM(typeDef) = NULL;
150635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
150645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Resolve the MG definition reference.
150655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
150665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	groupDef =
150675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
150685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ref->itemType, ref->name, ref->targetNamespace);
150695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (groupDef == NULL) {
150705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
150715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
150725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"ref", ref->name, ref->targetNamespace, ref->itemType,
150735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
150745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Remove the particle. */
150755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
150765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL)
150775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Remove the particle. */
150785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
150795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
150805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
150815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Assign the MG definition's {model group} to the
150825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * particle's {term}.
150835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
150845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
150855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) {
150875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
150885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC cos-all-limited (1.2)
150895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "1.2 the {term} property of a particle with
150905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* {max occurs}=1 which is part of a pair which constitutes
150915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the {content type} of a complex type definition."
150925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
150935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
150945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
150955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* TODO: error code */
150965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ALL_LIMITED,
150975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL,
150985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The particle's {max occurs} must be 1, since the "
150995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"reference resolves to an 'all' model group",
151005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
151015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
151025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
151035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
151045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
151065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
151105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckSTPropsCorrect:
151115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
151125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simple type definition
151135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
151145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks st-props-correct.
151155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
151165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the properties are correct,
151175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not, a positive error code and -1 on internal
151185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors.
151195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
151205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
151215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
151225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type)
151235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
151245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr baseType = type->baseType;
151255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
151265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* STATE: error funcs converted. */
151285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
151295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Simple Type Definition Properties Correct
151305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
151315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: This is somehow redundant, since we actually built a simple type
151325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to have all the needed information; this acts as an self test.
151335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
151345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Base type: If the datatype has been �derived� by �restriction�
151355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then the Simple Type Definition component from which it is �derived�,
151365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * otherwise the Simple Type Definition for anySimpleType (�4.1.6).
151375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
151385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseType == NULL) {
151395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
151405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Think about: "modulo the impact of Missing
151415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Sub-components (�5.3)."
151425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
151435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
151445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
151455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
151465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No base type existent", NULL);
151475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
151485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_SIMPLE(baseType)) {
151515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
151525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
151535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
151545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The base type '%s' is not a simple type",
151555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetComponentQName(&str, baseType));
151565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
151575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
151585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( (WXS_IS_LIST(type) || WXS_IS_UNION(type)) &&
151605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (WXS_IS_RESTRICTION(type) == 0) &&
151615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (! WXS_IS_ANY_SIMPLE_TYPE(baseType))) {
151625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
151635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
151645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
151655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "A type, derived by list or union, must have "
151665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "the simple ur-type definition as base type, not '%s'",
151675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetComponentQName(&str, baseType));
151685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
151695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
151705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
151725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Variety: One of {atomic, list, union}.
151735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
151745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) &&
151755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(! WXS_IS_LIST(type))) {
151765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
151775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
151785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
151795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The variety is absent", NULL);
151805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
151815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Finish this. Hmm, is this finished? */
151835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
151855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3 The {final} of the {base type definition} must not contain restriction.
151865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
151875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaTypeFinalContains(baseType,
151885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
151895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
151905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_ST_PROPS_CORRECT_3,
151915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
151925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The 'final' of its base type '%s' must not contain "
151935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "'restriction'",
151945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetComponentQName(&str, baseType));
151955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
151965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_ST_PROPS_CORRECT_3);
151975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
151985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
152005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2 All simple type definitions must be derived ultimately from the �simple
152015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * ur-type definition (so� circular definitions are disallowed). That is, it
152025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be possible to reach a built-in primitive datatype or the �simple
152035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * ur-type definition� by repeatedly following the {base type definition}.
152045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
152055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: this is done in xmlSchemaCheckTypeDefCircular().
152065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
152075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
152085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
152095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
152115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSSTRestricts:
152125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
152135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simple type definition
152145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
152155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
152165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Derivation Valid (Restriction, Simple) (cos-st-restricts)
152175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks if the given @type (simpleType) is derived validly by restriction.
152195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
152205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
152215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 on internal errors, 0 if the type is validly derived,
152225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a positive error code otherwise.
152235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
152245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
152255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
152265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type)
152275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
152285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *str = NULL;
152295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type != XML_SCHEMA_TYPE_SIMPLE) {
152315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaCheckCOSSTRestricts",
152325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "given type is not a user-derived simpleType");
152335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
152345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
152355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_ATOMIC(type)) {
152375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr primitive;
152385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
152395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1.1 The {base type definition} must be an atomic simple
152405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type definition or a built-in primitive datatype.
152415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
152425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! WXS_IS_ATOMIC(type->baseType)) {
152435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
152445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_ST_RESTRICTS_1_1,
152455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
152465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The base type '%s' is not an atomic simple type",
152475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, type->baseType));
152485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
152495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1);
152505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
152515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* 1.2 The {final} of the {base type definition} must not contain
152525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* restriction.
152535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
152545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */
152555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaTypeFinalContains(type->baseType,
152565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
152575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
152585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_ST_RESTRICTS_1_2,
152595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
152605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The final of its base type '%s' must not contain 'restriction'",
152615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, type->baseType));
152625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
152635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2);
152645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
152655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
152675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1.3.1 DF must be an allowed constraining facet for the {primitive
152685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type definition}, as specified in the appropriate subsection of 3.2
152695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Primitive datatypes.
152705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
152715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->facets != NULL) {
152725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFacetPtr facet;
152735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int ok = 1;
152745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    primitive = xmlSchemaGetPrimitiveType(type);
152765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (primitive == NULL) {
152775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaCheckCOSSTRestricts",
152785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "failed to get primitive type");
152795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
152805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
152815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    facet = type->facets;
152825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
152835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
152845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ok = 0;
152855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPIllegalFacetAtomicErr(pctxt,
152865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1,
152875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type, primitive, facet);
152885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
152895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet = facet->next;
152905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (facet != NULL);
152915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ok == 0)
152925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1);
152935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
152945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
152955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.3.2) "If there is a facet of the same kind in the {facets}
152965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the {base type definition} (call this BF),then the DF's {value}
152975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be a valid restriction of BF's {value} as defined in
152985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* [XML Schemas: Datatypes]."
152995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
153005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE (1.3.2) Facet derivation constraints are currently handled in
153015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* xmlSchemaDeriveAndValidateFacets()
153025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
153035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_LIST(type)) {
153045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr itemType = NULL;
153055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	itemType = type->subtypes;
153075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) {
153085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
153095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to evaluate the item type");
153105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
153115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
153125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_TYPE_NOT_FIXED(itemType))
153135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
153145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
153155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2.1 The {item type definition} must have a {variety} of atomic or
153165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* union (in which case all the {member type definitions}
153175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be atomic).
153185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
153195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! WXS_IS_ATOMIC(itemType)) &&
153205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (! WXS_IS_UNION(itemType))) {
153215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
153225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
153235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
153245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The item type '%s' does not have a variety of atomic or union",
153255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, itemType));
153265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
153275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
153285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_IS_UNION(itemType)) {
153295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypeLinkPtr member;
153305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = itemType->memberTypes;
153325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (member != NULL) {
153335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! WXS_IS_ATOMIC(member->type)) {
153345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(pctxt,
153355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
153365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
153375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The item type is a union type, but the "
153385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"member type '%s' of this item type is not atomic",
153395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&str, member->type));
153405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
153415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
153425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
153435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		member = member->next;
153445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
153455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
153465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) {
153485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFacetPtr facet;
153495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This is the case if we have: <simpleType><list ..
153515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
153525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.1
153545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.1.1 The {final} of the {item type definition} must not
153555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * contain list.
153565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
153575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaTypeFinalContains(itemType,
153585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_TYPE_FINAL_LIST)) {
153595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
153605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1,
153615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
153625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The final of its item type '%s' must not contain 'list'",
153635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, itemType));
153645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
153655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1);
153665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
153675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.1.2 The {facets} must only contain the whiteSpace
153695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * facet component.
153705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * OPTIMIZE TODO: the S4S already disallows any facet
153715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to be specified.
153725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
153735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->facets != NULL) {
153745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet = type->facets;
153755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
153765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
153775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalFacetListUnionErr(pctxt,
153785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2,
153795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    type, facet);
153805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2);
153815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
153825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet = facet->next;
153835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (facet != NULL);
153845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
153855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * MAYBE TODO: (Hmm, not really) Datatypes states:
153875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * A �list� datatype can be �derived� from an �atomic� datatype
153885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * whose �lexical space� allows space (such as string or anyURI)or
153895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * a �union� datatype any of whose {member type definitions}'s
153905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �lexical space� allows space.
153915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
153925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
153935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This is the case if we have: <simpleType><restriction ...
153955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * I.e. the variety of "list" is inherited.
153965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
153975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
153985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.2
153995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.2.1 The {base type definition} must have a {variety} of list.
154005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
154015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! WXS_IS_LIST(type->baseType)) {
154025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
154035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1,
154045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
154055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The base type '%s' must be a list type",
154065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, type->baseType));
154075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
154085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1);
154095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
154105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
154115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.2.2 The {final} of the {base type definition} must not
154125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * contain restriction.
154135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
154145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaTypeFinalContains(type->baseType,
154155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
154165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
154175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2,
154185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
154195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The 'final' of the base type '%s' must not contain 'restriction'",
154205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, type->baseType));
154215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
154225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2);
154235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
154245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
154255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 2.3.2.3 The {item type definition} must be validly derived
154265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * from the {base type definition}'s {item type definition} given
154275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6).
154285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
154295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
154305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypePtr baseItemType;
154315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		baseItemType = type->baseType->subtypes;
154335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
154345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
154355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"failed to eval the item type of a base type");
154365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
154375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
154385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((itemType != baseItemType) &&
154395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
154405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			baseItemType, 0) != 0)) {
154415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *strBIT = NULL, *strBT = NULL;
154425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErrExt(pctxt,
154435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3,
154445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
154455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The item type '%s' is not validly derived from "
154465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"the item type '%s' of the base type '%s'",
154475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&str, itemType),
154485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&strBIT, baseItemType),
154495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&strBT, type->baseType));
154505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
154525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(strBIT)
154535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(strBT)
154545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3);
154555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
154565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
154575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->facets != NULL) {
154595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetPtr facet;
154605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int ok = 1;
154615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
154625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern
154635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* and enumeration facet components are allowed among the {facets}.
154645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
154655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet = type->facets;
154665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
154675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    switch (facet->type) {
154685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_LENGTH:
154695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_MINLENGTH:
154705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_MAXLENGTH:
154715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_WHITESPACE:
154725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
154735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * TODO: 2.5.1.2 List datatypes
154745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * The value of �whiteSpace� is fixed to the value collapse.
154755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
154765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_PATTERN:
154775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_SCHEMA_FACET_ENUMERATION:
154785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
154795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			default: {
154805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaPIllegalFacetListUnionErr(pctxt,
154815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4,
154825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				type, facet);
154835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
154845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * We could return, but it's nicer to report all
154855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * invalid facets.
154865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
154875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ok = 0;
154885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
154895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
154905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet = facet->next;
154915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (facet != NULL);
154925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ok == 0)
154935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4);
154945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
154955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (2.3.2.5) (same as 1.3.2)
154965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
154975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE (2.3.2.5) This is currently done in
154985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* xmlSchemaDeriveAndValidateFacets()
154995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
155005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
155025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type)) {
155035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
155045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.1 The {member type definitions} must all have {variety} of
155055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* atomic or list.
155065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
155075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeLinkPtr member;
155085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	member = type->memberTypes;
155105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (member != NULL) {
155115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_TYPE_NOT_FIXED(member->type))
155125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt);
155135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((! WXS_IS_ATOMIC(member->type)) &&
155155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(! WXS_IS_LIST(member->type))) {
155165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
155175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_3_1,
155185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
155195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The member type '%s' is neither an atomic, nor a list type",
155205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, member->type));
155215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
155225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1);
155235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = member->next;
155255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
155265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
155275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 3.3.1 If the {base type definition} is the �simple ur-type
155285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition�
155295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
155305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
155315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
155325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.1.1 All of the {member type definitions} must have a
155335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {final} which does not contain union.
155345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
155355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    member = type->memberTypes;
155365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (member != NULL) {
155375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaTypeFinalContains(member->type,
155385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_TYPE_FINAL_UNION)) {
155395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(pctxt,
155405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1,
155415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
155425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The 'final' of member type '%s' contains 'union'",
155435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&str, member->type));
155445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
155455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1);
155465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
155475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		member = member->next;
155485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
155505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.1.2 The {facets} must be empty.
155515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
155525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->facetSet != NULL) {
155535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
155545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2,
155555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
155565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "No facets allowed", NULL);
155575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2);
155585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
155605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
155615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.2.1 The {base type definition} must have a {variety} of union.
155625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * I.e. the variety of "list" is inherited.
155635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
155645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! WXS_IS_UNION(type->baseType)) {
155655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
155665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1,
155675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
155685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The base type '%s' is not a union type",
155695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, type->baseType));
155705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
155715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1);
155725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
155745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.2.2 The {final} of the {base type definition} must not contain restriction.
155755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
155765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaTypeFinalContains(type->baseType,
155775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
155785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
155795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2,
155805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
155815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The 'final' of its base type '%s' must not contain 'restriction'",
155825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&str, type->baseType));
155835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
155845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2);
155855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
155865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
155875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.2.3 The {member type definitions}, in order, must be validly
155885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * derived from the corresponding type definitions in the {base
155895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * type definition}'s {member type definitions} given the empty set,
155905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * as defined in Type Derivation OK (Simple) (�3.14.6).
155915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
155925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
155935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypeLinkPtr baseMember;
155945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
155965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* OPTIMIZE: if the type is restricting, it has no local defined
155975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* member types and inherits the member types of the base type;
155985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* thus a check for equality can be skipped.
155995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
156005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
156015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Even worse: I cannot see a scenario where a restricting
156025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* union simple type can have other member types as the member
156035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* types of it's base type. This check seems not necessary with
156045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* respect to the derivation process in libxml2.
156055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* But necessary if constructing types with an API.
156065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
156075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->memberTypes != NULL) {
156085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    member = type->memberTypes;
156095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType);
156105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((member == NULL) && (baseMember != NULL)) {
156115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			PERROR_INT("xmlSchemaCheckCOSSTRestricts",
156125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "different number of member types in base");
156135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
156145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (member != NULL) {
156155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (baseMember == NULL) {
156165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
156175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "different number of member types in base");
156185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if ((member->type != baseMember->type) &&
156195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
156205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				member->type, baseMember->type, 0) != 0)) {
156215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlChar *strBMT = NULL, *strBT = NULL;
156225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaPCustomErrExt(pctxt,
156245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3,
156255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_BASIC_CAST type, NULL,
156265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"The member type %s is not validly "
156275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"derived from its corresponding member "
156285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"type %s of the base type %s",
156295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaGetComponentQName(&str, member->type),
156305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaGetComponentQName(&strBMT, baseMember->type),
156315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaGetComponentQName(&strBT, type->baseType));
156325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(str)
156335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(strBMT)
156345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FREE_AND_NULL(strBT)
156355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3);
156365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
156375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			member = member->next;
156385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (baseMember != NULL)
156395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            baseMember = baseMember->next;
156405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
156415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
156425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
156435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
156445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 3.3.2.4 Only pattern and enumeration facet components are
156455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * allowed among the {facets}.
156465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
156475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->facets != NULL) {
156485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetPtr facet;
156495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int ok = 1;
156505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facet = type->facets;
156525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
156535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
156545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
156555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaPIllegalFacetListUnionErr(pctxt,
156565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4,
156575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				type, facet);
156585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ok = 0;
156595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
156605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet = facet->next;
156615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (facet != NULL);
156625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ok == 0)
156635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4);
156645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
156665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
156675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (3.3.2.5) (same as 1.3.2)
156685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
156695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE (3.3.2.5) This is currently done in
156705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * xmlSchemaDeriveAndValidateFacets()
156715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
156725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
156735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
156745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
156765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
156775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
156795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckSRCSimpleType:
156805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
156815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simple type definition
156825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
156835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks crc-simple-type constraints.
156845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
156855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied,
156865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not a positive error code and -1 on internal
156875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors.
156885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
156895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
156905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
156915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
156925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaTypePtr type)
156935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
156945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
156955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * src-simple-type.1 The corresponding simple type definition, if any,
156965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must satisfy the conditions set out in Constraints on Simple Type
156975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Definition Schema Components (�3.14.6).
156985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
156995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_RESTRICTION(type)) {
157005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
157015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* src-simple-type.2 "If the <restriction> alternative is chosen,
157025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* either it must have a base [attribute] or a <simpleType> among its
157035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* [children], but not both."
157045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: This is checked in the parse function of <restriction>.
157055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
157065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
157075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
157085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
157095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_LIST(type)) {
157105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* src-simple-type.3 "If the <list> alternative is chosen, either it must have
157115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* an itemType [attribute] or a <simpleType> among its [children],
157125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* but not both."
157135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
157145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: This is checked in the parse function of <list>.
157155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
157165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type)) {
157175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
157185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular().
157195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
157205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
157215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
157225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
157235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
157245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
157265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
157275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
157285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctxt->vctxt == NULL) {
157295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->vctxt = xmlSchemaNewValidCtxt(NULL);
157305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->vctxt == NULL) {
157315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(ctxt, NULL,
157325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_INTERNAL,
157335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
157345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to create a temp. validation context.\n",
157355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
157365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
157375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
157385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Pass user data. */
157395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidErrors(ctxt->vctxt,
157405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->error, ctxt->warning, ctxt->errCtxt);
157415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
157425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->serror, ctxt->errCtxt);
157435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
157445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
157455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
157465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
157485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
157495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNodePtr node,
157505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
157515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     const xmlChar *value,
157525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaValPtr *retVal,
157535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int fireErrors,
157545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int normalize,
157555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int isNormalized);
157565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
157585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParseCheckCOSValidDefault:
157595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  the schema parser context
157605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the simple type definition
157615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the default value
157625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: an optional node (the holder of the value)
157635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
157645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Element Default Valid (Immediate)
157655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (cos-valid-default)
157665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will be used by the parser only. For the validator there's
157675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an other version.
157685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
157695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied,
157705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not, a positive error code and -1 on internal
157715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errors.
157725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
157735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
157745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
157755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNodePtr node,
157765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaTypePtr type,
157775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const xmlChar *value,
157785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaValPtr *val)
157795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
157805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
157815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
157835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cos-valid-default:
157845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Element Default Valid (Immediate)
157855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For a string to be a valid default with respect to a type
157865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition the appropriate case among the following must be true:
157875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
157885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if WXS_IS_COMPLEX(type) {
157895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
157905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Complex type.
157915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
157925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.1) "its {content type} must be a simple type definition
157935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* or mixed."
157945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
157955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type}'s particle must be �emptiable� as defined by
157965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Particle Emptiable (�3.9.6)."
157975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
157985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! WXS_HAS_SIMPLE_CONTENT(type)) &&
157995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) {
158005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* NOTE that this covers (2.2.2) as well. */
158015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
158025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_VALID_DEFAULT_2_1,
158035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, type->node,
158045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"For a string to be a valid default, the type definition "
158055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"must be a simple type or a complex type with mixed content "
158065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"and a particle emptiable", NULL);
158075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1);
158085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
158095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
158105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
158115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 If the type definition is a simple type definition, then the string
158125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be �valid� with respect to that definition as defined by String
158135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Valid (�3.14.4).
158145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
158155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * AND
158165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
158175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2.1 If the {content type} is a simple type definition, then the
158185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * string must be �valid� with respect to that simple type definition
158195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * as defined by String Valid (�3.14.4).
158205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
158215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_SIMPLE(type))
158225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
158235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type, value, val, 1, 1, 0);
158245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (WXS_HAS_SIMPLE_CONTENT(type))
158255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
158265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentTypeDef, value, val, 1, 1, 0);
158275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
158285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ret);
158295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) {
158315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaParseCheckCOSValidDefault",
158325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaVCheckCVCSimpleType()");
158335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
158345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
158365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
158375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
158395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCTPropsCorrect:
158405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
158415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
158425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
158435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *.(4.6) Constraints on Complex Type Definition Schema Components
158445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
158455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Complex Type Definition Properties Correct (ct-props-correct)
158465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: (seems) complete
158475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
158485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
158495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
158505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
158515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
158525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
158535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type)
158545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
158555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
158565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily.
158575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
158585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "The values of the properties of a complex type definition must
158595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * be as described in the property tableau in The Complex Type Definition
158605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component (�3.4.1), modulo the impact of Missing
158615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Sub-components (�5.3)."
158625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
158635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->baseType != NULL) &&
158645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_IS_SIMPLE(type->baseType)) &&
158655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_IS_EXTENSION(type) == 0)) {
158665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
158675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2) "If the {base type definition} is a simple type definition,
158685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the {derivation method} must be extension."
158695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
158705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomErr(ACTXT_CAST pctxt,
158715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_CT_1,
158725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, WXS_BASIC_CAST type,
158735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "If the base type is a simple type, the derivation method must be "
158745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "'extension'", NULL, NULL);
158755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMAP_SRC_CT_1);
158765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
158775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
158785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3) "Circular definitions are disallowed, except for the �ur-type
158795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition�. That is, it must be possible to reach the �ur-type
158805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition by repeatedly following the {base type definition}."
158815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
158825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE (3) is done in xmlSchemaCheckTypeDefCircular().
158835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
158845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
158855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE that (4) and (5) need the following:
158865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - attribute uses need to be already inherited (apply attr. prohibitions)
158875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - attribute group references need to be expanded already
158885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - simple types need to be typefixed already
158895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
158905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->attrUses &&
158915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1))
158925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
158935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses;
158945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributeUsePtr use, tmp;
158955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i, j, hasId = 0;
158965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = uses->nbItems -1; i >= 0; i--) {
158985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use = uses->items[i];
158995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
159015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC ct-props-correct
159025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (4) "Two distinct attribute declarations in the
159035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {attribute uses} must not have identical {name}s and
159045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {target namespace}s."
159055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
159065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (i > 0) {
159075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (j = i -1; j >= 0; j--) {
159085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = uses->items[j];
159095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
159105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_NAME(tmp)) &&
159115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_ATTRUSE_DECL_TNS(use) ==
159125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_TNS(tmp)))
159135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
159145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
159155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
159175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_AG_PROPS_CORRECT,
159185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, WXS_BASIC_CAST type,
159195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Duplicate %s",
159205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&str, use),
159215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
159225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
159235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
159245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Remove the duplicate.
159255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
159265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaItemListRemove(uses, i) == -1)
159275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto exit_failure;
159285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto next_use;
159295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
159305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
159315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
159325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
159335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC ct-props-correct
159345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (5) "Two distinct attribute declarations in the
159355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {attribute uses} must not have {type definition}s which
159365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * are or are derived from ID."
159375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
159385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
159395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIsDerivedFromBuiltInType(
159405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
159415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
159425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (hasId) {
159435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
159445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
159465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_AG_PROPS_CORRECT,
159475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, WXS_BASIC_CAST type,
159485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "There must not exist more than one attribute "
159495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "declaration of type 'xs:ID' "
159505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "(or derived from 'xs:ID'). The %s violates this "
159515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "constraint",
159525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&str, use),
159535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
159545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
159555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaItemListRemove(uses, i) == -1)
159565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto exit_failure;
159575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
159585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasId = 1;
159605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
159615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
159625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_use: {}
159635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
159645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
159655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
159665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
159675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
159685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
159695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
159715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
159725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaTypePtr typeB)
159735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
159745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
159755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: This should implement component-identity
159765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * in the future.
159775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
159785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((typeA == NULL) || (typeB == NULL))
159795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
159805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (typeA == typeB);
159815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
159825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
159845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSCTDerivedOK:
159855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
159865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the to-be derived complex type definition
159875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @baseType:  the base complex type definition
159885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @set: the given set
159895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
159905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
159915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Type Derivation OK (Complex) (cos-ct-derived-ok)
159925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
159935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: completed
159945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
159955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, or 1
159965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not.
159975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
159985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
159995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
160005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
160015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr baseType,
160025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int set)
160035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
160045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int equal = xmlSchemaAreEqualTypes(type, baseType);
160055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes. */
160065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
160075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "For a complex type definition (call it D, for derived)
160085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to be validly derived from a type definition (call this
160095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * B, for base) given a subset of {extension, restriction}
160105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * all of the following must be true:"
160115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
160125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! equal) {
160135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
160145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1) "If B and D are not the same type definition, then the
160155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {derivation method} of D must not be in the subset."
160165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
160175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) ||
160185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type))))
160195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
160205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
160215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
160225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.1) "B and D must be the same type definition."
160235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
160245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
160255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
160265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
160275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2.2) "B must be D's {base type definition}."
160285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
160295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->baseType == baseType)
160305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
160315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
160325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type
160335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition�."
160345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
160355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_ANYTYPE(type->baseType))
160365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
160375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(type->baseType)) {
160395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
160405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.3.2.1) "If D's {base type definition} is complex, then it
160415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be validly derived from B given the subset as defined by this
160425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* constraint."
160435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
160445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType,
160455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    baseType, set));
160465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
160475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
160485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.3.2.2) "If D's {base type definition} is simple, then it
160495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be validly derived from B given the subset as defined in Type
160505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Derivation OK (Simple) (�3.14.6).
160515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
160525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
160535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    baseType, set));
160545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
160555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
160565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
160585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSDerivedOK:
160595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the derived simple type definition
160605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @baseType:  the base type definition
160615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Calls:
160635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Type Derivation OK (Simple) AND Type Derivation OK (Complex)
160645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks wheter @type can be validly derived from @baseType.
160665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success, an positive error code otherwise.
160685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
160695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
160705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
160715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr type,
160725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr baseType,
160735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   int set)
160745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
160755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_SIMPLE(type))
160765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set));
160775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
160785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set));
160795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
160805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
160825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSCTExtends:
160835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
160845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
160855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.4.6) Constraints on Complex Type Definition Schema Components
160875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
160885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Derivation Valid (Extension) (cos-ct-extends)
160895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
160915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   missing:
160925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     (1.5)
160935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     (1.4.3.2.2.2) "Particle Valid (Extension)"
160945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
160955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
160965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
160975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
160985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
160995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
161005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaTypePtr type)
161015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
161025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr base = type->baseType;
161035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
161045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used
161055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * temporarily only.
161065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
161075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
161085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "If the {base type definition} is a complex type definition,
161095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then all of the following must be true:"
161105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
161115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(base)) {
161125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
161135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.1) "The {final} of the {base type definition} must not
161145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* contain extension."
161155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
161165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
161175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
161185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
161195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
161205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The 'final' of the base type definition "
161215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"contains 'extension'", NULL);
161225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
161235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
161245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
161265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* ATTENTION: The constrains (1.2) and (1.3) are not applied,
161275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* since they are automatically satisfied through the
161285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* inheriting mechanism.
161295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that even if redefining components, the inheriting mechanism
161305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* is used.
161315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
161325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
161335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
161345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute
161355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* uses}
161365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the complex type definition itself, that is, for every attribute
161375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* use in the {attribute uses} of the {base type definition}, there
161385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be an attribute use in the {attribute uses} of the complex
161395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type definition itself whose {attribute declaration} has the same
161405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {name}, {target namespace} and {type definition} as its attribute
161415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* declaration"
161425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
161435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base->attrUses != NULL) {
161445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i, j, found;
161455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaAttributeUsePtr use, buse;
161465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) {
161485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buse = (WXS_LIST_CAST base->attrUses)->items[i];
161495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		found = 0;
161505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->attrUses != NULL) {
161515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    use = (WXS_LIST_CAST type->attrUses)->items[j];
161525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++)
161535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
161545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((WXS_ATTRUSE_DECL_NAME(use) ==
161555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_DECL_NAME(buse)) &&
161565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (WXS_ATTRUSE_DECL_TNS(use) ==
161575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_DECL_TNS(buse)) &&
161585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (WXS_ATTRUSE_TYPEDEF(use) ==
161595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_ATTRUSE_TYPEDEF(buse))
161605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
161615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    found = 1;
161625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
161635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
161645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
161655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
161665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! found) {
161675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
161685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
161705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_CT_EXTENDS_1_2,
161715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, WXS_BASIC_CAST type,
161725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
161735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* TODO: The report does not indicate that also the
161745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* type needs to be the same.
161755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
161765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"This type is missing a matching correspondent "
161775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"for its {base type}'s %s in its {attribute uses}",
161785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentDesignation(&str,
161795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    buse->children),
161805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
161815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
161825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
161835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
161845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
161855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
161865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.3) "If it has an {attribute wildcard}, the complex type
161875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition must also have one, and the base type definition's
161885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {attribute  wildcard}'s {namespace constraint} must be a subset
161895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the complex  type definition's {attribute wildcard}'s {namespace
161905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* constraint}, as defined by Wildcard Subset (�3.10.6)."
161915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
161925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
161945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* MAYBE TODO: Enable if ever needed. But this will be needed only
161955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* if created the type via a schema construction API.
161965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
161975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base->attributeWildcard != NULL) {
161985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->attributeWilcard == NULL) {
161995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
162005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt,
162025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
162035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, type,
162045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The base %s has an attribute wildcard, "
162055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "but this type is missing an attribute wildcard",
162065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&str, base));
162075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
162085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlSchemaCheckCOSNSSubset(
162105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		base->attributeWildcard, type->attributeWildcard))
162115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
162125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
162135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt,
162155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
162165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, type,
162175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The attribute wildcard is not a valid "
162185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "superset of the one in the base %s",
162195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&str, base));
162205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
162215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
162225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
162235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
162245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
162255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.4) "One of the following must be true:"
162265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
162275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->contentTypeDef != NULL) &&
162285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (type->contentTypeDef == base->contentTypeDef)) {
162295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
162305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (1.4.1) "The {content type} of the {base type definition}
162315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * and the {content type} of the complex type definition itself
162325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * must be the same simple type definition"
162335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PASS
162345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
162355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
162365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
162375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
162385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (1.4.2) "The {content type} of both the {base type
162395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition} and the complex type definition itself must
162405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * be empty."
162415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PASS
162425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
162435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
162445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
162455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (1.4.3) "All of the following must be true:"
162465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
162475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->subtypes == NULL) {
162485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
162495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC 1.4.3.1 The {content type} of the complex type
162505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* definition itself must specify a particle.
162515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
162525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(ctxt,
162535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_CT_EXTENDS_1_1,
162545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
162555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The content type must specify a particle", NULL);
162565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
162575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
162585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
162595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (1.4.3.2) "One of the following must be true:"
162605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
162615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
162625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
162635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (1.4.3.2.1) "The {content type} of the {base type
162645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* definition} must be empty.
162655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* PASS
162665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
162675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
162685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
162695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (1.4.3.2.2) "All of the following must be true:"
162705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
162715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((type->contentType != base->contentType) ||
162725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
162735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
162745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
162755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed
162765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * or both must be element-only."
162775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
162785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt,
162795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_CT_EXTENDS_1_1,
162805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
162815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The content type of both, the type and its base "
162825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"type, must either 'mixed' or 'element-only'", NULL);
162835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
162845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
162855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
162865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the
162875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* complex type definition must be a �valid extension�
162885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of the {base type definition}'s particle, as defined
162895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* in Particle Valid (Extension) (�3.9.6)."
162905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
162915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE that we won't check "Particle Valid (Extension)",
162925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* since it is ensured by the derivation process in
162935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* xmlSchemaTypeFixup(). We need to implement this when heading
162945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* for a construction API
162955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: !! This is needed to be checked if redefining a type !!
162965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
162975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
162985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
162995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * URGENT TODO (1.5)
163005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
163015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
163025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
163035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
163045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2) "If the {base type definition} is a simple type definition,
163055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* then all of the following must be true:"
163065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
163075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->contentTypeDef != base) {
163085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
163095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2.1) "The {content type} must be the same simple type
163105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition."
163115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
163125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
163135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
163145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
163155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The content type must be the simple base type", NULL);
163165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
163175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
163185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
163195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
163205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2.2) "The {final} of the {base type definition} must not
163215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * contain extension"
163225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE that this is the same as (1.1).
163235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
163245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
163255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
163265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
163275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The 'final' of the base type definition "
163285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"contains 'extension'", NULL);
163295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
163305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
163315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
163325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
163335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
163345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
163365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckDerivationOKRestriction:
163375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
163385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
163395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
163405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.4.6) Constraints on Complex Type Definition Schema Components
163415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
163425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Derivation Valid (Restriction, Complex) (derivation-ok-restriction)
163435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
163445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
163455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   missing:
163465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     (5.4.2) ???
163475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
163485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ATTENTION:
163495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In XML Schema 1.1 this will be:
163505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validation Rule: Checking complex type subsumption
163515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
163525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
163535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
163545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
163555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
163565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
163575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      xmlSchemaTypePtr type)
163585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
163595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr base;
163605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
163625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used
163635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * temporarily only.
163645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
163655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = type->baseType;
163665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_COMPLEX(base)) {
163675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomErr(ACTXT_CAST ctxt,
163685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
163695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->node, WXS_BASIC_CAST type,
163705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The base type must be a complex type", NULL, NULL);
163715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->err);
163725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
163735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
163745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
163755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1) "The {base type definition} must be a complex type
163765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition whose {final} does not contain restriction."
163775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
163785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomErr(ACTXT_CAST ctxt,
163795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
163805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->node, WXS_BASIC_CAST type,
163815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The 'final' of the base type definition "
163825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "contains 'restriction'", NULL, NULL);
163835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->err);
163845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
163855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
163865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2), (3) and (4)
163875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Those are handled in a separate function, since the
163885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * same constraints are needed for redefinition of
163895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * attribute groups as well.
163905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
163915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
163925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_ACTION_DERIVE,
163935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST type, WXS_BASIC_CAST base,
163945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->attrUses, base->attrUses,
163955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->attributeWildcard,
163965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base->attributeWildcard) == -1)
163975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
163985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
163995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
164005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
164015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (5) "One of the following must be true:"
164025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
164035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base->builtInType == XML_SCHEMAS_ANYTYPE) {
164045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
164055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.1) "The {base type definition} must be the
164065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �ur-type definition�."
164075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* PASS
164085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
164095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
164105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
164115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
164125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.2.1) "The {content type} of the complex type definition
164135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be a simple type definition"
164145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
164155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.2.2) "One of the following must be true:"
164165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
164175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
164185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (base->contentType == XML_SCHEMA_CONTENT_BASIC))
164195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
164205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int err;
164215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
164225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (5.2.2.1) "The {content type} of the {base type
164235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition} must be a simple type definition from which
164245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the {content type} is validly derived given the empty
164255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * set as defined in Type Derivation OK (Simple) (�3.14.6)."
164265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
164275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * ATTENTION TODO: This seems not needed if the type implicitely
164285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * derived from the base type.
164295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
164305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
164315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
164325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentTypeDef, base->contentTypeDef, 0);
164335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (err != 0) {
164345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *strA = NULL, *strB = NULL;
164355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (err == -1)
164375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
164385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST ctxt,
164395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
164405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, WXS_BASIC_CAST type,
164415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The {content type} %s is not validly derived from the "
164425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "base type's {content type} %s",
164435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&strA,
164445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->contentTypeDef),
164455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentDesignation(&strB,
164465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			base->contentTypeDef));
164475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strA);
164485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strB);
164495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ctxt->err);
164505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
164515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
164525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaIsParticleEmptiable(
164535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaParticlePtr) base->subtypes))) {
164545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
164555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (5.2.2.2) "The {base type definition} must be mixed
164565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * and have a particle which is �emptiable� as defined in
164575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Particle Emptiable (�3.9.6)."
164585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PASS
164595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
164605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
164615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
164625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
164635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
164645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The content type of the base type must be either "
164655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"a simple type or 'mixed' and an emptiable particle", NULL);
164665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ctxt->err);
164675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
164685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
164695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
164705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.3.1) "The {content type} of the complex type itself must
164715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* be empty"
164725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
164735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
164745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
164755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (5.3.2.1) "The {content type} of the {base type
164765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition} must also be empty."
164775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PASS
164785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
164795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
164805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
164815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIsParticleEmptiable(
164825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaParticlePtr) base->subtypes)) {
164835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
164845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (5.3.2.2) "The {content type} of the {base type
164855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition} must be elementOnly or mixed and have a particle
164865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * which is �emptiable� as defined in Particle Emptiable (�3.9.6)."
164875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PASS
164885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
164895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
164905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
164915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
164925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
164935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The content type of the base type must be either "
164945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"empty or 'mixed' (or 'elements-only') and an emptiable "
164955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"particle", NULL);
164965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ctxt->err);
164975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
164985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
164995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_HAS_MIXED_CONTENT(type)) {
165005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
165015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.4.1.1) "The {content type} of the complex type definition
165025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* itself must be element-only"
165035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
165045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) {
165055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
165065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (5.4.1.2) "The {content type} of the complex type
165075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition itself and of the {base type definition} must be
165085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * mixed"
165095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
165105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
165115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
165125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
165135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"If the content type is 'mixed', then the content type of the "
165145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"base type must also be 'mixed'", NULL);
165155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ctxt->err);
165165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
165175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
165185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (5.4.2) "The particle of the complex type definition itself
165195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be a �valid restriction� of the particle of the {content
165205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type} of the {base type definition} as defined in Particle Valid
165215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (Restriction) (�3.9.6).
165225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
165235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* URGENT TODO: (5.4.2)
165245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
165255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
165265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
165275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
165285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST type, NULL,
165295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The type is not a valid restriction of its base type", NULL);
165305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->err);
165315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
165325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
165335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
165365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCTComponent:
165375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
165385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
165395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.4.6) Constraints on Complex Type Definition Schema Components
165415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
165435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
165445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
165465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
165475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr type)
165485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
165495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
165505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
165515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Complex Type Definition Properties Correct
165525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
165535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaCheckCTPropsCorrect(ctxt, type);
165545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
165555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ret);
165565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_EXTENSION(type))
165575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaCheckCOSCTExtends(ctxt, type);
165585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
165595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type);
165605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
165615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
165645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckSRCCT:
165655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
165665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
165675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.4.3) Constraints on XML Representations of Complex Type Definitions:
165695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Representation Constraint:
165705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Complex Type Definition Representation OK (src-ct)
165715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
165735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
165745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
165765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
165775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaTypePtr type)
165785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
165795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr base;
165805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
165815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
165835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Adjust the error codes here, as I used
165845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * XML_SCHEMAP_SRC_CT_1 only yet.
165855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
165865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = type->baseType;
165875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_HAS_SIMPLE_CONTENT(type)) {
165885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
165895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1 If the <complexContent> alternative is chosen, the type definition
165905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �resolved� to by the �actual value� of the base [attribute]
165915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must be a complex type definition;
165925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
165935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! WXS_IS_COMPLEX(base)) {
165945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
165955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
165965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_CT_1,
165975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, type->node,
165985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"If using <complexContent>, the base type is expected to be "
165995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"a complex type. The base type '%s' is a simple type",
166005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str, base->targetNamespace,
166015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		base->name));
166025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
166035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMAP_SRC_CT_1);
166045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
166055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
166065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
166075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC
166085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2 If the <simpleContent> alternative is chosen, all of the
166095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* following must be true:
166105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2.1 The type definition �resolved� to by the �actual value� of the
166115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* base [attribute] must be one of the following:
166125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
166135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_SIMPLE(base)) {
166145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_EXTENSION(type) == 0) {
166155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
166165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
166175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 2.1.3 only if the <extension> alternative is also
166185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* chosen, a simple type definition.
166195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
166205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: Change error code to ..._SRC_CT_2_1_3. */
166215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(ctxt,
166225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_CT_1,
166235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
166245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "If using <simpleContent> and <restriction>, the base "
166255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "type must be a complex type. The base type '%s' is "
166265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "a simple type",
166275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str, base->targetNamespace,
166285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			base->name));
166295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
166305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (XML_SCHEMAP_SRC_CT_1);
166315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
166325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
166335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Base type is a complex type. */
166345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
166355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
166365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
166375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 2.1.1 a complex type definition whose {content type} is a
166385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* simple type definition;
166395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* PASS
166405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
166415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (base->contentTypeDef == NULL) {
166425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL,
166435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
166445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Internal error: xmlSchemaCheckSRCCT, "
166455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"'%s', base type has no content type",
166465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->name);
166475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
166485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
166495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
166505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_IS_RESTRICTION(type))) {
166515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
166535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 2.1.2 only if the <restriction> alternative is also
166545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* chosen, a complex type definition whose {content type}
166555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* is mixed and a particle emptiable.
166565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
166575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! xmlSchemaIsParticleEmptiable(
166585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaParticlePtr) base->subtypes)) {
166595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = XML_SCHEMAP_SRC_CT_1;
166605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
166615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
166625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Attention: at this point the <simpleType> child is in
166635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * ->contentTypeDef (put there during parsing).
166645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
166655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (type->contentTypeDef == NULL) {
166665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
166675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
166685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 2.2 If clause 2.1.2 above is satisfied, then there
166695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * must be a <simpleType> among the [children] of
166705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * <restriction>.
166715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
166725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* TODO: Change error code to ..._SRC_CT_2_2. */
166735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaPCustomErr(ctxt,
166745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_SRC_CT_1,
166755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST type, NULL,
166765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"A <simpleType> is expected among the children "
166775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"of <restriction>, if <simpleContent> is used and "
166785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"the base type '%s' is a complex type",
166795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatQName(&str, base->targetNamespace,
166805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			base->name));
166815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
166825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (XML_SCHEMAP_SRC_CT_1);
166835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
166845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
166855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_SRC_CT_1;
166865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
166875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
166885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret > 0) {
166895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
166905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_RESTRICTION(type)) {
166915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(ctxt,
166925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_CT_1,
166935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
166945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "If <simpleContent> and <restriction> is used, the "
166955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "base type must be a simple type or a complex type with "
166965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "mixed content and particle emptiable. The base type "
166975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "'%s' is none of those",
166985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str, base->targetNamespace,
166995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    base->name));
167005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
167015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(ctxt,
167025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_SRC_CT_1,
167035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
167045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "If <simpleContent> and <extension> is used, the "
167055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "base type must be a simple type. The base type '%s' "
167065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "is a complex type",
167075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str, base->targetNamespace,
167085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    base->name));
167095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
167105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
167115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
167125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
167135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
167145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3) "The corresponding complex type definition component must
167155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * satisfy the conditions set out in Constraints on Complex Type
167165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Definition Schema Components (�3.4.6);"
167175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE (3) will be done in xmlSchemaTypeFixup().
167185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
167195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
167205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification
167215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * above for {attribute wildcard} is satisfied, the intensional
167225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * intersection must be expressible, as defined in Attribute Wildcard
167235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Intersection (�3.10.6).
167245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses().
167255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
167265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
167275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
167285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_PARTICLE_RESTRICTION
167305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
167315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckParticleRangeOK:
167325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
167335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
167345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
167365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
167375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Occurrence Range OK (range-ok)
167385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: complete
167405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
167425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
167435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
167445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
167455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckParticleRangeOK(int rmin, int rmax,
167465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int bmin, int bmax)
167475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
167485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rmin < bmin)
167495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
167505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bmax != UNBOUNDED) &&
167515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(rmax > bmax))
167525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
167535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
167545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
167555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
167575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseNameAndTypeOK:
167585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
167595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the restricting element declaration particle
167605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base element declaration particle
167615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
167635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
167645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Restriction OK (Elt:Elt -- NameAndTypeOK)
167655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-NameAndTypeOK)
167665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
167685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   MISSING (3.2.3)
167695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   CLARIFY: (3.2.2)
167705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
167715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
167725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
167735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
167745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
167755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
167765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaParticlePtr r,
167775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaParticlePtr b)
167785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
167795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr elemR, elemB;
167805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes (rcase-NameAndTypeOK). */
167825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elemR = (xmlSchemaElementPtr) r->children;
167835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elemB = (xmlSchemaElementPtr) b->children;
167845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
167855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "The declarations' {name}s and {target namespace}s are
167865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the same."
167875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
167885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemR != elemB) &&
167895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((! xmlStrEqual(elemR->name, elemB->name)) ||
167905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
167915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
167925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
167935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2) "R's occurrence range is a valid restriction of B's
167945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
167955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
167965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
167975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    b->minOccurs, b->maxOccurs) != 0)
167985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
167995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's
168015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {scope} are global."
168025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemR == elemB)
168045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
168055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false."
168075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
168095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
168105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return (1);
168115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3.2.2) "either B's declaration's {value constraint} is absent,
168135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * or is not fixed, or R's declaration's {value constraint} is fixed
168145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * with the same value."
168155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
168175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((elemR->value == NULL) ||
168185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
168195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /* TODO: Equality of the initial value or normalized or canonical? */
168205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (! xmlStrEqual(elemR->value, elemB->value))))
168215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return (1);
168225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint
168245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definitions} is a subset of B's declaration's {identity-constraint
168255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definitions}, if any."
168265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemB->idcs != NULL) {
168285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO */
168295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
168305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a
168325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * superset of B's declaration's {disallowed substitutions}."
168335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
168355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
168365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
168375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
168385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
168395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
168405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return (1);
168415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3.2.5) "R's {type definition} is validly derived given
168435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {extension, list, union} from B's {type definition}"
168445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
168455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * BADSPEC TODO: What's the point of adding "list" and "union" to the
168465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * set, if the corresponding constraints handle "restriction" and
168475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "extension" only?
168485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
168495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
168515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int set = 0;
168525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	set |= SUBSET_EXTENSION;
168545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	set |= SUBSET_LIST;
168555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	set |= SUBSET_UNION;
168565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
168575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemB->subtypes, set) != 0)
168585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
168595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
168605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
168615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
168625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
168645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseNSCompat:
168655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
168665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the restricting element declaration particle
168675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base wildcard particle
168685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
168695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
168705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
168715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Derivation OK (Elt:Any -- NSCompat)
168725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-NSCompat)
168735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
168745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: complete
168755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
168765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
168775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
168785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
168795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
168805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
168815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaParticlePtr r,
168825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaParticlePtr b)
168835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
168845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO:Error codes (rcase-NSCompat). */
168855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "For an element declaration particle to be a �valid restriction�
168875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of a wildcard particle all of the following must be true:"
168885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
168895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "The element declaration's {target namespace} is �valid�
168905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * with respect to the wildcard's {namespace constraint} as defined by
168915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Wildcard allows Namespace Name (�3.10.4)."
168925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
168935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children,
168945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((xmlSchemaElementPtr) r->children)->targetNamespace) != 0)
168955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
168965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
168975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2) "R's occurrence range is a valid restriction of B's
168985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
168995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
169005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
169015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    b->minOccurs, b->maxOccurs) != 0)
169025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
169035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
169055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
169065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
169085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseRecurseAsIfGroup:
169095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
169105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the restricting element declaration particle
169115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base model group particle
169125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
169145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
169155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)
169165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-RecurseAsIfGroup)
169175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: TODO
169195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
169215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
169225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
169235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
169245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
169255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr r,
169265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr b)
169275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
169285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes (rcase-RecurseAsIfGroup). */
169295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TODO
169305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
169315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
169325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
169345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseNSSubset:
169355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
169365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the restricting wildcard particle
169375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base wildcard particle
169385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
169405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
169415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Derivation OK (Any:Any -- NSSubset)
169425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-NSSubset)
169435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: complete
169455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
169475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
169485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
169495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
169505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
169515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr r,
169525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr b,
169535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    int isAnyTypeBase)
169545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
169555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes (rcase-NSSubset). */
169565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
169575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "R's occurrence range is a valid restriction of B's
169585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
169595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
169605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
169615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    b->minOccurs, b->maxOccurs))
169625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
169635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
169645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2) "R's {namespace constraint} must be an intensional subset
169655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)."
169665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
169675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children,
169685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaWildcardPtr) b->children))
169695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
169705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
169715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (3) "Unless B is the content model wildcard of the �ur-type
169725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition�, R's {process contents} must be identical to or stronger
169735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * than B's {process contents}, where strict is stronger than lax is
169745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * stronger than skip."
169755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
169765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! isAnyTypeBase) {
169775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( ((xmlSchemaWildcardPtr) r->children)->processContents <
169785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((xmlSchemaWildcardPtr) b->children)->processContents)
169795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
169805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
169815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
169835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
169845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
169865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCOSParticleRestrict:
169875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
169885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the complex type definition
169895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
169915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
169925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Valid (Restriction) (cos-particle-restrict)
169935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: TODO
169955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
169965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
169975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
169985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
169995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
170005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
170015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaParticlePtr r,
170025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaParticlePtr b)
170035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
170045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
170055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*part = WXS_TYPE_PARTICLE(type);
170075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    basePart = WXS_TYPE_PARTICLE(base);
170085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
170095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TODO
170115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
170135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "They are the same particle."
170145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
170155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (r == b)
170165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
170175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
170205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
170215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
170235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
170245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseNSRecurseCheckCardinality:
170255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
170265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the model group particle
170275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base wildcard particle
170285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
170305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
170315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Derivation OK (All/Choice/Sequence:Any --
170325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                         NSRecurseCheckCardinality)
170335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-NSRecurseCheckCardinality)
170345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS: TODO: subst-groups
170365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
170385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
170395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
170405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
170415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
170425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					     xmlSchemaParticlePtr r,
170435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					     xmlSchemaParticlePtr b)
170445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
170455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr part;
170465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */
170475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((r->children == NULL) || (r->children->children == NULL))
170485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
170495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
170505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "For a group particle to be a �valid restriction� of a
170515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * wildcard particle..."
170525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
170535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "Every member of the {particles} of the group is a �valid
170545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * restriction� of the wildcard as defined by
170555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Particle Valid (Restriction) (�3.9.6)."
170565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
170575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    part = (xmlSchemaParticlePtr) r->children->children;
170585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
170595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b))
170605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
170615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	part = (xmlSchemaParticlePtr) part->next;
170625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (part != NULL);
170635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
170645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2) "The effective total range of the group [...] is a
170655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * valid restriction of B's occurrence range as defined by
170665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Occurrence Range OK (�3.9.6)."
170675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
170685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckParticleRangeOK(
170695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetParticleTotalRangeMin(r),
170705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetParticleTotalRangeMax(r),
170715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    b->minOccurs, b->maxOccurs) != 0)
170725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
170735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
170745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
170755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
170765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
170785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckRCaseRecurse:
170795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
170805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @r: the <all> or <sequence> model group particle
170815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @b: the base <all> or <sequence> model group particle
170825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (3.9.6) Constraints on Particle Schema Components
170845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
170855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Particle Derivation OK (All:All,Sequence:Sequence --
170865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Recurse)
170875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (rcase-Recurse)
170885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:  ?
170905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: subst-groups
170915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
170925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the constraints are satisfied, a positive
170935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error code if not and -1 if an internal error occured.
170945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
170955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
170965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
170975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaParticlePtr r,
170985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaParticlePtr b)
170995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
171005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlSchemaParticlePtr part; */
171015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Error codes (rcase-Recurse). */
171025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((r->children == NULL) || (b->children == NULL) ||
171035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(r->children->type != b->children->type))
171045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
171055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
171065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC "For an all or sequence group particle to be a �valid
171075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * restriction� of another group particle with the same {compositor}..."
171085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
171095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "R's occurrence range is a valid restriction of B's
171105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
171115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
171125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
171135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    b->minOccurs, b->maxOccurs))
171145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
171155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
171185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
171195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
171215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
171235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCustomErrExt(pctxt,      \
171245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAP_INVALID_FACET_VALUE, \
171255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST fac1, fac1->node, \
171265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"It is an error for both '%s' and '%s' to be specified on the "\
171275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"same type definition", \
171285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
171295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
171305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FACET_RESTR_ERR(fac1, msg) \
171325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCustomErr(pctxt,      \
171335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAP_INVALID_FACET_VALUE, \
171345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST fac1, fac1->node, \
171355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg, NULL);
171365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FACET_RESTR_FIXED_ERR(fac) \
171385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCustomErr(pctxt, \
171395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAP_INVALID_FACET_VALUE, \
171405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST fac, fac->node, \
171415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"The base type's facet is 'fixed', thus the value must not " \
171425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"differ", NULL);
171435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
171455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
171465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFacetPtr facet1,
171475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFacetPtr facet2,
171485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int lessGreater,
171495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int orEqual,
171505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int ofBase)
171515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
171525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *msg = NULL;
171535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrdup(BAD_CAST "'");
171555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type));
171565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST "' has to be");
171575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (lessGreater == 0)
171585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST " equal to");
171595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (lessGreater == 1)
171605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST " greater than");
171615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
171625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST " less than");
171635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (orEqual)
171655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST " or equal to");
171665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, BAD_CAST " '");
171675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type));
171685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ofBase)
171695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "' of the base type");
171705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
171715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg = xmlStrcat(msg, BAD_CAST "'");
171725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPCustomErr(pctxt,
171745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMAP_INVALID_FACET_VALUE,
171755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_BASIC_CAST facet1, NULL,
171765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(const char *) msg, NULL);
171775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg != NULL)
171795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(msg);
171805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
171815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
171835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSchemaDeriveAndValidateFacets:
171845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
171855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Schema Component Constraint: Simple Type Restriction (Facets)
171865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* (st-restrict-facets)
171875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
171885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
171895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
171905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaTypePtr type)
171915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
171925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr base = type->baseType;
171935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetLinkPtr link, cur, last = NULL;
171945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetPtr facet, bfacet,
171955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	flength = NULL, ftotdig = NULL, ffracdig = NULL,
171965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fmaxlen = NULL, fminlen = NULL, /* facets of the current type */
171975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fmininc = NULL, fmaxinc = NULL,
171985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fminexc = NULL, fmaxexc = NULL,
171995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bflength = NULL, bftotdig = NULL, bffracdig = NULL,
172005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */
172015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bfmininc = NULL, bfmaxinc = NULL,
172025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bfminexc = NULL, bfmaxexc = NULL;
172035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res; /* err = 0, fixedErr; */
172045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
172065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC st-restrict-facets 1:
172075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The {variety} of R is the same as that of B."
172085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
172095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
172105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC st-restrict-facets 2:
172115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "If {variety} is atomic, the {primitive type definition}
172125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of R is the same as that of B."
172135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
172145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: we leave 1 & 2 out for now, since this will be
172155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * satisfied by the derivation process.
172165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * CONSTRUCTION TODO: Maybe needed if using a construction API.
172175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
172185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
172195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC st-restrict-facets 3:
172205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The {facets} of R are the union of S and the {facets}
172215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of B, eliminating duplicates. To eliminate duplicates,
172225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * when a facet of the same kind occurs in both S and the
172235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {facets} of B, the one in the {facets} of B is not
172245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * included, with the exception of enumeration and pattern
172255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * facets, for which multiple occurrences with distinct values
172265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * are allowed."
172275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
172285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->facetSet == NULL) && (base->facetSet == NULL))
172305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
172315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last = type->facetSet;
172335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (last != NULL)
172345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (last->next != NULL)
172355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    last = last->next;
172365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (cur = type->facetSet; cur != NULL; cur = cur->next) {
172385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facet = cur->facet;
172395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (facet->type) {
172405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_LENGTH:
172415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flength = facet; break;
172425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINLENGTH:
172435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fminlen = facet; break;
172445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MININCLUSIVE:
172455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fmininc = facet; break;
172465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
172475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fminexc = facet; break;
172485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXLENGTH:
172495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fmaxlen = facet; break;
172505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
172515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fmaxinc = facet; break;
172525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
172535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fmaxexc = facet; break;
172545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_TOTALDIGITS:
172555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ftotdig = facet; break;
172565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
172575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ffracdig = facet; break;
172585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
172595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
172605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
172615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
172625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
172635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facet = cur->facet;
172645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (facet->type) {
172655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_LENGTH:
172665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bflength = facet; break;
172675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINLENGTH:
172685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfminlen = facet; break;
172695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MININCLUSIVE:
172705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfmininc = facet; break;
172715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
172725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfminexc = facet; break;
172735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXLENGTH:
172745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfmaxlen = facet; break;
172755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
172765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfmaxinc = facet; break;
172775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
172785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bfmaxexc = facet; break;
172795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_TOTALDIGITS:
172805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bftotdig = facet; break;
172815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
172825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bffracdig = facet; break;
172835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
172845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
172855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
172865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
172875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
172885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * length and minLength or maxLength (2.2) + (3.2)
172895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
172905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (flength && (fminlen || fmaxlen)) {
172915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FACET_RESTR_ERR(flength, "It is an error for both 'length' and "
172925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "either of 'minLength' or 'maxLength' to be specified on "
172935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "the same type definition")
172945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
172955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
172965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Mutual exclusions in the same derivation step.
172975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
172985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((fmaxinc) && (fmaxexc)) {
172995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "maxInclusive and maxExclusive"
173015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
173035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((fmininc) && (fminexc)) {
173055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "minInclusive and minExclusive"
173075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
173095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (flength && bflength) {
173125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "length valid restriction"
173145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The values have to be equal.
173155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(flength->val, bflength->val);
173175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
173185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
173195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0)
173205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
173215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((res != 0) && (bflength->fixed)) {
173225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FACET_RESTR_FIXED_ERR(flength)
173235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fminlen && bfminlen) {
173275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "minLength valid restriction"
173295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* minLength >= BASE minLength
173305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
173325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
173335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
173345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -1)
173355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
173365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((res != 0) && (bfminlen->fixed)) {
173375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FACET_RESTR_FIXED_ERR(fminlen)
173385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fmaxlen && bfmaxlen) {
173415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "maxLength valid restriction"
173435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* maxLength <= BASE minLength
173445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
173465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
173475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
173485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 1)
173495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
173505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((res != 0) && (bfmaxlen->fixed)) {
173515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FACET_RESTR_FIXED_ERR(fmaxlen)
173525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
173555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SCC "length and minLength or maxLength"
173565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
173575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! flength)
173585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	flength = bflength;
173595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (flength) {
173605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! fminlen)
173615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fminlen = bfminlen;
173625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fminlen) {
173635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* (1.1) length >= minLength */
173645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(flength->val, fminlen->val);
173655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
173665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
173675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1)
173685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
173695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! fmaxlen)
173715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fmaxlen = bfmaxlen;
173725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fmaxlen) {
173735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* (2.1) length <= maxLength */
173745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
173755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
173765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
173775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1)
173785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
173795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
173815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fmaxinc) {
173825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "maxInclusive"
173845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fmininc) {
173865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* SCC "maxInclusive >= minInclusive" */
173875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
173885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
173895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
173905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
173915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
173925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
173935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
173945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
173955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC "maxInclusive valid restriction"
173965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
173975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxinc) {
173985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxInclusive <= BASE maxInclusive */
173995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
174005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1)
174035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
174045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((res != 0) && (bfmaxinc->fixed)) {
174055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FACET_RESTR_FIXED_ERR(fmaxinc)
174065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxexc) {
174095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxInclusive < BASE maxExclusive */
174105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
174115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != -1) {
174145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
174155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmininc) {
174185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxInclusive >= BASE minInclusive */
174195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
174205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
174235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
174245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfminexc) {
174275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxInclusive > BASE minExclusive */
174285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
174295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != 1) {
174325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
174335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
174365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fmaxexc) {
174375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
174385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "maxExclusive >= minExclusive"
174395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
174405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fminexc) {
174415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
174425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
174455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
174465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
174495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "maxExclusive valid restriction"
174505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
174515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxexc) {
174525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxExclusive <= BASE maxExclusive */
174535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
174545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1) {
174575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
174585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((res != 0) && (bfmaxexc->fixed)) {
174605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FACET_RESTR_FIXED_ERR(fmaxexc)
174615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxinc) {
174645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxExclusive <= BASE maxInclusive */
174655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
174665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1) {
174695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
174705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmininc) {
174735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxExclusive > BASE minInclusive */
174745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
174755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != 1) {
174785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
174795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfminexc) {
174825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* maxExclusive > BASE minExclusive */
174835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
174845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != 1) {
174875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
174885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
174895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
174905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
174915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fminexc) {
174925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
174935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "minExclusive < maxInclusive"
174945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
174955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fmaxinc) {
174965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
174975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
174985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
174995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != -1) {
175005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
175015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
175045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "minExclusive valid restriction"
175055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
175065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfminexc) {
175075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minExclusive >= BASE minExclusive */
175085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
175095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
175125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
175135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((res != 0) && (bfminexc->fixed)) {
175155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FACET_RESTR_FIXED_ERR(fminexc)
175165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxinc) {
175195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minExclusive <= BASE maxInclusive */
175205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
175215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1) {
175245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
175255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmininc) {
175285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minExclusive >= BASE minInclusive */
175295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
175305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
175335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
175345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxexc) {
175375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minExclusive < BASE maxExclusive */
175385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
175395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != -1) {
175425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
175435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
175465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fmininc) {
175475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
175485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "minInclusive < maxExclusive"
175495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
175505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fmaxexc) {
175515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
175525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != -1) {
175555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
175565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
175595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "minExclusive valid restriction"
175605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
175615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmininc) {
175625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minInclusive >= BASE minInclusive */
175635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
175645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
175675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
175685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((res != 0) && (bfmininc->fixed)) {
175705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FACET_RESTR_FIXED_ERR(fmininc)
175715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxinc) {
175745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minInclusive <= BASE maxInclusive */
175755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
175765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == 1) {
175795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
175805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
175815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfminexc) {
175835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minInclusive > BASE minExclusive */
175845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
175855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != 1)
175885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
175895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bfmaxexc) {
175915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* minInclusive < BASE maxExclusive */
175925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
175935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -2)
175945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
175955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res != -1)
175965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
175975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
175985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
175995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ftotdig && bftotdig) {
176005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
176015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC " totalDigits valid restriction"
176025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* totalDigits <= BASE totalDigits
176035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
176045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
176055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
176065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
176075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 1)
176085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
176095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    -1, 1, 1);
176105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((res != 0) && (bftotdig->fixed)) {
176115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FACET_RESTR_FIXED_ERR(ftotdig)
176125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
176135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
176145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ffracdig && bffracdig) {
176155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
176165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SCC  "fractionDigits valid restriction"
176175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* fractionDigits <= BASE fractionDigits
176185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
176195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
176205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
176215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
176225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 1)
176235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
176245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    -1, 1, 1);
176255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((res != 0) && (bffracdig->fixed)) {
176265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FACET_RESTR_FIXED_ERR(ffracdig)
176275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
176285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
176295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
176305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SCC "fractionDigits less than or equal to totalDigits"
176315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
176325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! ftotdig)
176335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ftotdig = bftotdig;
176345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! ffracdig)
176355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ffracdig = bffracdig;
176365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ftotdig && ffracdig) {
176375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
176385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -2)
176395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
176405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 1)
176415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
176425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		-1, 1, 0);
176435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
176445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
176455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * *Enumerations* won' be added here, since only the first set
176465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of enumerations in the ancestor-or-self axis is used
176475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * for validation, plus we need to use the base type of those
176485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * enumerations for whitespace.
176495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
176505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * *Patterns*: won't be add here, since they are ORed at
176515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * type level and ANDed at ancestor level. This will
176525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * happed during validation by walking the base axis
176535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of the type.
176545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
176555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
176565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bfacet = cur->facet;
176575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
176585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Special handling of enumerations and patterns.
176595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: hmm, they should not appear in the set, so remove this.
176605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
176615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
176625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
176635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
176645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
176655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Search for a duplicate facet in the current type.
176665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
176675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link = type->facetSet;
176685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* err = 0; */
176695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* fixedErr = 0; */
176705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (link != NULL) {
176715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    facet = link->facet;
176725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (facet->type == bfacet->type) {
176735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		switch (facet->type) {
176745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    case XML_SCHEMA_FACET_WHITESPACE:
176755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
176765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* The whitespace must be stronger.
176775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
176785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (facet->whitespace < bfacet->whitespace) {
176795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FACET_RESTR_ERR(facet,
176805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"The 'whitespace' value has to be equal to "
176815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"or stronger than the 'whitespace' value of "
176825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"the base type")
176835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
176845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((bfacet->fixed) &&
176855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (facet->whitespace != bfacet->whitespace)) {
176865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    FACET_RESTR_FIXED_ERR(facet)
176875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
176885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
176895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    default:
176905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
176915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
176925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Duplicate found. */
176935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
176945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
176955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link = link->next;
176965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
176975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
176985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If no duplicate was found: add the base types's facet
176995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to the set.
177005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
177015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (link == NULL) {
177025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link = (xmlSchemaFacetLinkPtr)
177035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlMalloc(sizeof(xmlSchemaFacetLink));
177045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (link == NULL) {
177055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPErrMemory(pctxt,
177065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "deriving facets, creating a facet link", NULL);
177075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
177085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
177095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link->facet = cur->facet;
177105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    link->next = NULL;
177115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (last == NULL)
177125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->facetSet = link;
177135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
177145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last->next = link;
177155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    last = link;
177165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
177175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
177195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
177215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
177225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PERROR_INT("xmlSchemaDeriveAndValidateFacets",
177235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"an error occured");
177245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
177255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
177265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
177285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
177295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					     xmlSchemaTypePtr type)
177305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
177315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink;
177325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
177335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The actual value is then formed by replacing any union type
177345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition in the �explicit members� with the members of their
177355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {member type definitions}, in order.
177365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
177375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: There's a bug entry at
177385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html"
177395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * which indicates that we'll keep the union types the future.
177405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
177415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    link = type->memberTypes;
177425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (link != NULL) {
177435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_TYPE_NOT_FIXED(link->type))
177455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt);
177465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_UNION(link->type)) {
177485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type);
177495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (subLink != NULL) {
177505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		link->type = subLink->type;
177515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (subLink->next != NULL) {
177525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lastLink = link->next;
177535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    subLink = subLink->next;
177545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prevLink = link;
177555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (subLink != NULL) {
177565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			newLink = (xmlSchemaTypeLinkPtr)
177575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlMalloc(sizeof(xmlSchemaTypeLink));
177585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (newLink == NULL) {
177595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaPErrMemory(pctxt, "allocating a type link",
177605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				NULL);
177615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return (-1);
177625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
177635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			newLink->type = subLink->type;
177645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevLink->next = newLink;
177655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevLink = newLink;
177665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			newLink->next = lastLink;
177675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			subLink = subLink->next;
177695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
177705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
177715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
177725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
177735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	link = link->next;
177745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
177755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
177765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
177775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
177795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type)
177805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
177815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int has = 0, needVal = 0, normVal = 0;
177825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has	= (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
177845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (has) {
177855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	needVal = (type->baseType->flags &
177865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
177875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	normVal = (type->baseType->flags &
177885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
177895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
177905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->facets != NULL) {
177915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFacetPtr fac;
177925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (fac = type->facets; fac != NULL; fac = fac->next) {
177945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (fac->type) {
177955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_FACET_WHITESPACE:
177965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
177975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_FACET_PATTERN:
177985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    normVal = 1;
177995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    has = 1;
178005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_FACET_ENUMERATION:
178025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    needVal = 1;
178035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    normVal = 1;
178045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    has = 1;
178055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
178075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    has = 1;
178085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
178105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
178115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
178125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normVal)
178135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
178145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needVal)
178155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
178165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (has)
178175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
178185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (has && (! needVal) && WXS_IS_ATOMIC(type)) {
178205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type);
178215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
178225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* OPTIMIZE VAL TODO: Some facets need a computed value.
178235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
178245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
178255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (prim->builtInType != XML_SCHEMAS_STRING)) {
178265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
178275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
178285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
178295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
178305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
178325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type)
178335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
178345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
178375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Evaluate the whitespace-facet value.
178385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
178395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_LIST(type)) {
178405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
178415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
178425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type))
178435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
178445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->facetSet != NULL) {
178465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFacetLinkPtr lin;
178475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (lin = type->facetSet; lin != NULL; lin = lin->next) {
178495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
178505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		switch (lin->facet->whitespace) {
178515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_FACET_PRESERVE:
178525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
178535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_FACET_REPLACE:
178555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
178565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_FACET_COLLAPSE:
178585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
178595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
178605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
178615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
178625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
178635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
178645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
178655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
178665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
178675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
178685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For all �atomic� datatypes other than string (and types �derived�
178695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * by �restriction� from it) the value of whiteSpace is fixed to
178705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * collapse
178715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
178725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
178735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr anc;
178745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (anc = type->baseType; anc != NULL &&
178765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		anc->builtInType != XML_SCHEMAS_ANYTYPE;
178775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		anc = anc->baseType) {
178785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (anc->type == XML_SCHEMA_TYPE_BASIC) {
178805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
178815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
178825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
178845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
178855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
178865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
178885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
178895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
178905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
178915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
178925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
178935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
178945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
178955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
178975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
178985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr type)
178995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
179005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
179015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
179025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_TYPE_NOT_FIXED_1(type))
179035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
179045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
179055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_LIST(type)) {
179075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
179085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <simpleType><list>...
179095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
179105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->subtypes == NULL) {
179115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
179125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This one is really needed, so get out.
179135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
179145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
179155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"list type has no item-type assigned");
179165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
179175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
179185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type)) {
179195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
179205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <simpleType><union>...
179215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
179225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->memberTypes == NULL) {
179235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
179245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This one is really needed, so get out.
179255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
179265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
179275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"union type has no member-types assigned");
179285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
179295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
179305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
179315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
179325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <simpleType><restriction>...
179335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
179345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->baseType == NULL) {
179355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
179365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"type has no base-type assigned");
179375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
179385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
179395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType))
179405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1)
179415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
179425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
179435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Variety
179445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If the <restriction> alternative is chosen, then the
179455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {variety} of the {base type definition}.
179465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
179475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_ATOMIC(type->baseType))
179485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
179495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (WXS_IS_LIST(type->baseType)) {
179505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
179515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
179525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Inherit the itemType.
179535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
179545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->subtypes = type->baseType->subtypes;
179555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_IS_UNION(type->baseType)) {
179565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
179575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
179585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE that we won't assign the memberTypes of the base,
179595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * since this will make trouble when freeing them; we will
179605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * use a lookup function to access them instead.
179615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
179625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
179635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
179645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
179655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
179665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
179685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
179695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt,
179705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaTypePtr type)
179715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
179725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->node != NULL) {
179735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
179745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Type of %s : %s:%d :", name,
179755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        type->node->doc->URL,
179765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlGetLineNo(type->node));
179775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
179785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext, "Type of %s :", name);
179795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
179805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) {
179815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (type->contentType) {
179825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_SIMPLE:
179835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "simple\n");
179845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
179855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_ELEMENTS:
179865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "elements\n");
179875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
179885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_UNKNOWN:
179895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "unknown !!!\n");
179905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
179915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_EMPTY:
179925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "empty\n");
179935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
179945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_MIXED:
179955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr)
179965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->subtypes))
179975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
179985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"mixed as emptiable particle\n");
179995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
180005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext, "mixed\n");
180015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
180025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Removed, since not used. */
180035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
180045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
180055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "mixed or elems\n");
180065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
180075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
180085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_CONTENT_BASIC:
180095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "basic\n");
180105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
180115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
180125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
180135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "not registered !!!\n");
180145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
180155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
180165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
180175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
180185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
180195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
180215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 3.14.6 Constraints on Simple Type Definition Schema Components
180225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
180235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
180245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
180255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaTypePtr type)
180265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
180275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, olderrs = pctxt->nberrors;
180285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
180305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
180315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_TYPE_NOT_FIXED(type))
180335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
180345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
180365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
180375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->baseType == NULL) {
180395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo",
180405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "missing baseType");
180415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
180425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
180435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_TYPE_NOT_FIXED(type->baseType))
180445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt);
180455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If a member type of a union is a union itself, we need to substitute
180475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * that member type for its member types.
180485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE that this might change in WXS 1.1; i.e. we will keep the union
180495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * types in WXS 1.1.
180505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->memberTypes != NULL) &&
180525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1))
180535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
180545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC src-simple-type 1
180565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The corresponding simple type definition, if any, must satisfy
180575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the conditions set out in Constraints on Simple Type Definition
180585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Components (�3.14.6)."
180595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Simple Type Definition Properties Correct
180625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (st-props-correct)
180635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaCheckSTPropsCorrect(pctxt, type);
180655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
180665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Derivation Valid (Restriction, Simple)
180685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (cos-st-restricts)
180695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaCheckCOSSTRestricts(pctxt, type);
180715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
180725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Removed the error report, since it got annoying to get an
180745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * extra error report, if anything failed until now.
180755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Enable this if needed.
180765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
180775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * xmlSchemaPErr(ctxt, type->node,
180785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
180795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *    "Simple type '%s' does not satisfy the constraints "
180805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *    "on simple type definitions.\n",
180815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *    type->name, NULL);
180825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Simple Type Restriction (Facets)
180855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (st-restrict-facets)
180865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaCheckFacetValues(type, pctxt);
180885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
180895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((type->facetSet != NULL) ||
180905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(type->baseType->facetSet != NULL)) {
180915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaDeriveAndValidateFacets(pctxt, type);
180925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	HFAILURE HERROR
180935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
180945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
180955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Whitespace value.
180965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
180975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaTypeFixupWhitespace(type);
180985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
180995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypeFixupOptimFacets(type);
181005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
181025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
181035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaDebugFixedType(pctxt, type);
181045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
181055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (olderrs != pctxt->nberrors)
181065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(pctxt->err);
181075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
181085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
181105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
181115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaDebugFixedType(pctxt, type);
181125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
181135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
181145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
181155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
181175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
181185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaTypePtr type)
181195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
181205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0, olderrs = pctxt->nberrors;
181215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr baseType = type->baseType;
181225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_TYPE_NOT_FIXED(type))
181245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
181255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
181265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseType == NULL) {
181275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaFixupComplexType",
181285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "missing baseType");
181295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
181305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
181315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
181325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Fixup the base type.
181335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
181345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_TYPE_NOT_FIXED(baseType))
181355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
181365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
181375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
181385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Skip fixup if the base type is invalid.
181395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Generate a warning!
181405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
181415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
181425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
181435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
181445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * This basically checks if the base type can be derived.
181455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
181465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaCheckSRCCT(pctxt, type);
181475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
181485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
181495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Fixup the content type.
181505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
181515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
181525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
181535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><simpleContent>...
181545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
181555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((WXS_IS_COMPLEX(baseType)) &&
181565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (baseType->contentTypeDef != NULL) &&
181575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (WXS_IS_RESTRICTION(type))) {
181585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypePtr contentBase, content;
181595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
181605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char buf[30];
181615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *tmpname;
181625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
181635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
181645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (1) If <restriction> + base type is <complexType>,
181655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "whose own {content type} is a simple type..."
181665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
181675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->contentTypeDef != NULL) {
181685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
181695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (1.1) "the simple type definition corresponding to the
181705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* <simpleType> among the [children] of <restriction> if there
181715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* is one;"
181725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Note that this "<simpleType> among the [children]" was put
181735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* into ->contentTypeDef during parsing.
181745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
181755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		contentBase = type->contentTypeDef;
181765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentTypeDef = NULL;
181775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
181785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
181795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (1.2) "...otherwise (<restriction> has no <simpleType>
181805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* among its [children]), the simple type definition which
181815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* is the {content type} of the ... base type."
181825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
181835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		contentBase = baseType->contentTypeDef;
181845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
181855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
181865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC
181875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "... a simple type definition which restricts the simple
181885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * type definition identified in clause 1.1 or clause 1.2
181895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * with a set of facet components"
181905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
181915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Create the anonymous simple type, which will be the content
181925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * type of the complex type.
181935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
181945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_NAMED_LOCALS
181955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(buf, 29, "#scST%d", ++(pctxt->counter));
181965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1);
181975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content = xmlSchemaAddType(pctxt, pctxt->schema,
181985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace,
181995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->node, 0);
182005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
182015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content = xmlSchemaAddType(pctxt, pctxt->schema,
182025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace,
182035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->node, 0);
182045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
182055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (content == NULL)
182065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_failure;
182075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We will use the same node as for the <complexType>
182095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to have it somehow anchored in the schema doc.
182105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content->type = XML_SCHEMA_TYPE_SIMPLE;
182125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content->baseType = contentBase;
182135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Move the facets, previously anchored on the
182155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * complexType during parsing.
182165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content->facets = type->facets;
182185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->facets = NULL;
182195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    content->facetSet = type->facetSet;
182205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->facetSet = NULL;
182215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentTypeDef = content;
182235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_TYPE_NOT_FIXED(contentBase))
182245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
182255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Fixup the newly created type. We don't need to check
182275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * for circularity here.
182285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content);
182305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE HERROR
182315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content);
182325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE HERROR
182335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((WXS_IS_COMPLEX(baseType)) &&
182355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
182365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (WXS_IS_RESTRICTION(type))) {
182375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2) If <restriction> + base is a mixed <complexType> with
182395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * an emptiable particle, then a simple type definition which
182405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * restricts the <restriction>'s <simpleType> child.
182415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((type->contentTypeDef == NULL) ||
182435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(type->contentTypeDef->baseType == NULL)) {
182445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
182455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Check if this ever happens.
182465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
182475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
182485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_INTERNAL,
182495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
182505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Internal error: xmlSchemaTypeFixup, "
182515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "complex type '%s': the <simpleContent><restriction> "
182525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "is missing a <simpleType> child, but was not catched "
182535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "by xmlSchemaCheckSRCCT()", type->name);
182545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_failure;
182555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
182565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) {
182575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (3) If <extension> + base is <complexType> with
182595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * <simpleType> content, "...then the {content type} of that
182605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * complex type definition"
182615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (baseType->contentTypeDef == NULL) {
182635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
182645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Check if this ever happens. xmlSchemaCheckSRCCT
182655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* should have catched this already.
182665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
182675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErr(pctxt,
182685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_INTERNAL,
182695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST type, NULL,
182705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Internal error: xmlSchemaTypeFixup, "
182715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "complex type '%s': the <extension>ed base type is "
182725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "a complex type with no simple content type",
182735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->name);
182745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit_failure;
182755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
182765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentTypeDef = baseType->contentTypeDef;
182775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) {
182785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (4) <extension> + base is <simpleType>
182805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "... then that simple type definition"
182815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentTypeDef = baseType;
182835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
182845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
182855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Check if this ever happens.
182865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
182875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
182885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_INTERNAL,
182895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST type, NULL,
182905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Internal error: xmlSchemaTypeFixup, "
182915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"complex type '%s' with <simpleContent>: unhandled "
182925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"derivation case", type->name);
182935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit_failure;
182945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
182955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
182965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int dummySequence = 0;
182975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParticlePtr particle =
182985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaParticlePtr) type->subtypes;
182995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
183005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Corresponds to <complexType><complexContent>...
183015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
183025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE that the effective mixed was already set during parsing of
183035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* <complexType> and <complexContent>; its flag value is
183045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* XML_SCHEMAS_TYPE_MIXED.
183055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
183065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Compute the "effective content":
183075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (2.1.1) + (2.1.2) + (2.1.3)
183085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
183095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((particle == NULL) ||
183105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
183115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
183125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
183135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
183145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (particle->minOccurs == 0))) &&
183155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) {
183165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->flags & XML_SCHEMAS_TYPE_MIXED) {
183175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (2.1.4) "If the �effective mixed� is true, then
183195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* a particle whose properties are as follows:..."
183205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
183215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Empty sequence model group with
183225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* minOccurs/maxOccurs = 1 (i.e. a "particle emptiable").
183235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE that we sill assign it the <complexType> node to
183245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* somehow anchor it in the doc.
183255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((particle == NULL) ||
183275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
183285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
183295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Create the particle.
183305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
183315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle = xmlSchemaAddParticle(pctxt,
183325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->node, 1, 1);
183335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (particle == NULL)
183345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
183355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
183365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Create the model group.
183375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */ /* URGENT TODO: avoid adding to pending items. */
183385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->children = (xmlSchemaTreeItemPtr)
183395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
183405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMA_TYPE_SEQUENCE, type->node);
183415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (particle->children == NULL)
183425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
183435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->subtypes = (xmlSchemaTypePtr) particle;
183455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
183465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		dummySequence = 1;
183475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
183485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
183495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (2.1.5) "otherwise empty"
183515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentType = XML_SCHEMA_CONTENT_EMPTY;
183535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
183545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
183555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
183565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2.2) "otherwise the particle corresponding to the
183575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * <all>, <choice>, <group> or <sequence> among the
183585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * [children]."
183595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
183605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
183615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
183625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
183635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Compute the "content type".
183645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
183655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_RESTRICTION(type)) {
183665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
183675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (3.1) "If <restriction>..."
183685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.1.1) + (3.1.2) */
183695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
183705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
183715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
183725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
183735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
183745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
183755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (3.2) "If <extension>..."
183765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
183775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
183785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (3.2.1)
183805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "If the �effective content� is empty, then the
183815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*  {content type} of the [...] base ..."
183825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentType = baseType->contentType;
183845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->subtypes = baseType->subtypes;
183855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Fixes bug #347316:
183875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* This is the case when the base type has a simple
183885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* type definition as content.
183895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type->contentTypeDef = baseType->contentTypeDef;
183915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE that the effective mixed is ignored here.
183935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
183955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
183965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (3.2.2)
183975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
183985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
183995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
184005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
184015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
184025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (3.2.3)
184035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
184045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
184055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
184065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * "A model group whose {compositor} is sequence and whose
184085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * {particles} are..."
184095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_TYPE_PARTICLE(type) != NULL) &&
184115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_TYPE_PARTICLE_TERM(type) != NULL) &&
184125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((WXS_TYPE_PARTICLE_TERM(type))->type ==
184135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMA_TYPE_ALL))
184145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
184155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC cos-all-limited (1)
184175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
184195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* TODO: error code */
184205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ALL_LIMITED,
184215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ITEM_NODE(type), NULL,
184225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The type has an 'all' model group in its "
184235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"{content type} and thus cannot be derived from "
184245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"a non-empty type, since this would produce a "
184255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"'sequence' model group containing the 'all' "
184265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"model group; 'all' model groups are not "
184275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"allowed to appear inside other model groups",
184285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
184295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if ((WXS_TYPE_PARTICLE(baseType) != NULL) &&
184315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) &&
184325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((WXS_TYPE_PARTICLE_TERM(baseType))->type ==
184335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMA_TYPE_ALL))
184345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
184355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC cos-all-limited (1)
184375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
184395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* TODO: error code */
184405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_COS_ALL_LIMITED,
184415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ITEM_NODE(type), NULL,
184425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"A type cannot be derived by extension from a type "
184435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"which has an 'all' model group in its "
184445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"{content type}, since this would produce a "
184455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"'sequence' model group containing the 'all' "
184465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"model group; 'all' model groups are not "
184475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"allowed to appear inside other model groups",
184485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
184495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (! dummySequence) {
184515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaTreeItemPtr effectiveContent =
184525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTreeItemPtr) type->subtypes;
184535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Create the particle.
184555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle = xmlSchemaAddParticle(pctxt,
184575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->node, 1, 1);
184585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (particle == NULL)
184595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
184605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Create the "sequence" model group.
184625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->children = (xmlSchemaTreeItemPtr)
184645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
184655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMA_TYPE_SEQUENCE, type->node);
184665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (particle->children == NULL)
184675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
184685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle;
184695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC "the particle of the {content type} of
184715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * the ... base ..."
184725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Create a duplicate of the base type's particle
184735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * and assign its "term" to it.
184745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->children->children =
184765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
184775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type->node,
184785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaParticlePtr) type->subtypes)->minOccurs,
184795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaParticlePtr) type->subtypes)->maxOccurs);
184805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (particle->children->children == NULL)
184815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit_failure;
184825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle = (xmlSchemaParticlePtr)
184835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			particle->children->children;
184845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->children =
184855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaParticlePtr) baseType->subtypes)->children;
184865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC "followed by the �effective content�."
184885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
184895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->next = effectiveContent;
184905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
184915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * This all will result in:
184925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * new-particle
184935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *   --> new-sequence(
184945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *         new-particle
184955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *           --> base-model,
184965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *         this-particle
184975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *	        --> this-model
184985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *	    )
184995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
185005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
185015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
185025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * This is the case when there is already an empty
185035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * <sequence> with minOccurs==maxOccurs==1.
185045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Just add the base types's content type.
185055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * NOTE that, although we miss to add an intermediate
185065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * <sequence>, this should produce no difference to
185075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * neither the regex compilation of the content model,
185085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * nor to the complex type contraints.
185095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
185105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    particle->children->children =
185115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTreeItemPtr) baseType->subtypes;
185125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
185135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
185145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
185155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
185165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
185175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Now fixup attribute uses:
185185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - expand attr. group references
185195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *     - intersect attribute wildcards
185205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - inherit attribute uses of the base type
185215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - inherit or union attr. wildcards if extending
185225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - apply attr. use prohibitions if restricting
185235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
185245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaFixupTypeAttributeUses(pctxt, type);
185255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
185265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
185275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply the complex type component constraints; this will not
185285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * check attributes, since this is done in
185295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * xmlSchemaFixupTypeAttributeUses().
185305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
185315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaCheckCTComponent(pctxt, type);
185325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFAILURE HERROR
185335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
185355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaDebugFixedType(pctxt, type);
185365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (olderrs != pctxt->nberrors)
185385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(pctxt->err);
185395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
185405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
185415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
185435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
185445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
185455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaDebugFixedType(pctxt, type);
185465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(pctxt->err);
185485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
185505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
185515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TYPE
185525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaDebugFixedType(pctxt, type);
185535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
185555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
185595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaTypeFixup:
185605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @typeDecl:  the schema type definition
185615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
185625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fixes the content model of the type.
185645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URGENT TODO: We need an int result!
185655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
185665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
185675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaTypeFixup(xmlSchemaTypePtr type,
185685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   xmlSchemaAbstractCtxtPtr actxt)
185695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
185705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NULL)
185715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
185725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
185735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	AERROR_INT("xmlSchemaTypeFixup",
185745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "this function needs a parser context");
185755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
185765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
185775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_TYPE_NOT_FIXED(type))
185785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
185795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_COMPLEX)
185805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type));
185815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (type->type == XML_SCHEMA_TYPE_SIMPLE)
185825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type));
185835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
185845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
185875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckFacet:
185885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @facet:  the facet
185895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @typeDecl:  the schema type definition
185905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  the schema parser context or NULL
185915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the optional name of the type
185925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks and computes the values of facets.
185945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if valid, a positive error code if not valid and
185965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         -1 in case of an internal or API error.
185975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
185985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
185995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
186005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlSchemaTypePtr typeDecl,
186015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlSchemaParserCtxtPtr pctxt,
186025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar * name ATTRIBUTE_UNUSED)
186035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
186045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, ctxtGiven;
186055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((facet == NULL) || (typeDecl == NULL))
186075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
186085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
186095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: will the parser context be given if used from
186105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the relaxNG module?
186115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
186125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt == NULL)
186135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxtGiven = 0;
186145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
186155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxtGiven = 1;
186165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (facet->type) {
186185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MININCLUSIVE:
186195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MINEXCLUSIVE:
186205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXINCLUSIVE:
186215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
186225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_FACET_ENUMERATION: {
186235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /*
186245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * Okay we need to validate the value
186255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * at that point.
186265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 */
186275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTypePtr base;
186285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* 4.3.5.5 Constraints on enumeration Schema Components
186305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Schema Component Constraint: enumeration valid restriction
186315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* It is an �error� if any member of {value} is not in the
186325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* �value space� of {base type definition}.
186335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
186345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* minInclusive, maxInclusive, minExclusive, maxExclusive:
186355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* The value �must� be in the
186365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* �value space� of the �base type�.
186375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
186385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
186395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* This function is intended to deliver a compiled value
186405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* on the facet. In this implementation of XML Schemata the
186415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* type holding a facet, won't be a built-in type.
186425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Thus to ensure that other API
186435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* calls (relaxng) do work, if the given type is a built-in
186445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* type, we will assume that the given built-in type *is
186455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* already* the base type.
186465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
186475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
186485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    base = typeDecl->baseType;
186495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (base == NULL) {
186505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			PERROR_INT("xmlSchemaCheckFacet",
186515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "a type user derived type has no base type");
186525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
186535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
186545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
186555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    base = typeDecl;
186565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! ctxtGiven) {
186585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
186595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * A context is needed if called from RelaxNG.
186605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
186615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pctxt = xmlSchemaNewParserCtxt("*");
186625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (pctxt == NULL)
186635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
186645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
186655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
186665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE: This call does not check the content nodes,
186675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* since they are not available:
186685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* facet->node is just the node holding the facet
186695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* definition, *not* the attribute holding the *value*
186705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of the facet.
186715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
186725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaVCheckCVCSimpleType(
186735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ACTXT_CAST pctxt, facet->node, base,
186745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet->value, &(facet->val), 1, 1, 0);
186755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ret != 0) {
186765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
186775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* No error message for RelaxNG. */
186785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ctxtGiven) {
186795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaCustomErr(ACTXT_CAST pctxt,
186805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMAP_INTERNAL, facet->node, NULL,
186815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"Internal error: xmlSchemaCheckFacet, "
186825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"failed to validate the value '%s' of the "
186835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"facet '%s' against the base type",
186845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				facet->value, xmlSchemaFacetTypeToString(facet->type));
186855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
186865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
186875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
186885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
186895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* No error message for RelaxNG. */
186905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ctxtGiven) {
186915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
186925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
186945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret, facet->node, WXS_BASIC_CAST facet,
186955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The value '%s' of the facet does not validate "
186965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "against the base type '%s'",
186975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    facet->value,
186985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaFormatQName(&str,
186995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				base->targetNamespace, base->name));
187005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
187015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
187025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit;
187035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if (facet->val == NULL) {
187045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ctxtGiven) {
187055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			PERROR_INT("xmlSchemaCheckFacet",
187065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "value was not computed");
187075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
187085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TODO
187095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
187105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
187115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
187125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_PATTERN:
187135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            facet->regexp = xmlRegexpCompile(facet->value);
187145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (facet->regexp == NULL) {
187155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_REGEXP_INVALID;
187165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No error message for RelaxNG. */
187175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxtGiven) {
187185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
187195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret, facet->node, WXS_BASIC_CAST typeDecl,
187205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The value '%s' of the facet 'pattern' is not a "
187215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"valid regular expression",
187225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			facet->value, NULL);
187235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
187245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
187255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
187265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_TOTALDIGITS:
187275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_FRACTIONDIGITS:
187285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_LENGTH:
187295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXLENGTH:
187305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MINLENGTH:
187315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
187335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaValidatePredefinedType(
187345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
187355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet->value, &(facet->val));
187365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
187375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaValidatePredefinedType(
187385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
187395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet->value, &(facet->val));
187405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
187415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
187425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
187435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* No error message for RelaxNG. */
187445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ctxtGiven) {
187455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			PERROR_INT("xmlSchemaCheckFacet",
187465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "validating facet value");
187475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
187485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
187495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
187505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_INVALID_FACET_VALUE;
187515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No error message for RelaxNG. */
187525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxtGiven) {
187535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* error code */
187545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
187555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret, facet->node, WXS_BASIC_CAST typeDecl,
187565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The value '%s' of the facet '%s' is not a valid '%s'",
187575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			facet->value,
187585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFacetTypeToString(facet->type),
187595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
187605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    BAD_CAST "nonNegativeInteger" :
187615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    BAD_CAST "positiveInteger",
187625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
187635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
187645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
187655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
187665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_WHITESPACE:{
187685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (xmlStrEqual(facet->value, BAD_CAST "preserve")) {
187695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
187705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) {
187715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
187725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) {
187735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
187745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
187755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
187765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    /* No error message for RelaxNG. */
187775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ctxtGiven) {
187785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */
187795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
187805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret, facet->node, WXS_BASIC_CAST typeDecl,
187815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The value '%s' of the facet 'whitespace' is not "
187825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "valid", facet->value, NULL);
187835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
187845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
187855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
187865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
187875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
187885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
187895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
187905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! ctxtGiven) && (pctxt != NULL))
187915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(pctxt);
187925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
187935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
187945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! ctxtGiven) && (pctxt != NULL))
187955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(pctxt);
187965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
187975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
187985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
188005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckFacetValues:
188015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @typeDecl:  the schema type definition
188025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
188035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
188045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks the default values types, especially for facets
188055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
188065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
188075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
188085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaParserCtxtPtr pctxt)
188095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
188105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, olderrs = pctxt->nberrors;
188115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name = typeDecl->name;
188125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
188135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: It is intended to use the facets list, instead
188145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of facetSet.
188155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
188165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (typeDecl->facets != NULL) {
188175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFacetPtr facet = typeDecl->facets;
188185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
188205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Temporarily assign the "schema" to the validation context
188215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the parser context. This is needed for NOTATION validation.
188225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
188235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (pctxt->vctxt == NULL) {
188245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
188255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
188265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
188275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->vctxt->schema = pctxt->schema;
188285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (facet != NULL) {
188295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name);
188305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    HFAILURE
188315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    facet = facet->next;
188325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
188335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->vctxt->schema = NULL;
188345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
188355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (olderrs != pctxt->nberrors)
188365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(pctxt->err);
188375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
188385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
188395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
188405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
188415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
188435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetCircModelGrDefRef:
188445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxtMGroup: the searched model group
188455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @selfMGroup: the second searched model group
188465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle: the first particle
188475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
188485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used by
188495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckGroupDefCircular only.
188505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
188515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the particle with the circular model group definition reference,
188525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * otherwise NULL.
188535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
188545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaTreeItemPtr
188555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
188565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaTreeItemPtr particle)
188575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
188585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr circ = NULL;
188595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr term;
188605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupDefPtr gdef;
188615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; particle != NULL; particle = particle->next) {
188635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	term = particle->children;
188645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (term == NULL)
188655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
188665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (term->type) {
188675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
188685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		gdef = (xmlSchemaModelGroupDefPtr) term;
188695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (gdef == groupDef)
188705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (particle);
188715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
188725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Mark this model group definition to avoid infinite
188735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* recursion on circular references not yet examined.
188745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
188755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
188765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
188775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (gdef->children != NULL) {
188785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
188795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    circ = xmlSchemaGetCircModelGrDefRef(groupDef,
188805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			gdef->children->children);
188815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
188825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (circ != NULL)
188835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (circ);
188845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
188855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
188865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SEQUENCE:
188875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_CHOICE:
188885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ALL:
188895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
188905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (circ != NULL)
188915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (circ);
188925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
188935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
188945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
188955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
188965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
188975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
188985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
188995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
189015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckGroupDefCircular:
189025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  the model group definition
189035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
189045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name
189055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
189065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks for circular references to model group definitions.
189075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
189085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
189095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item,
189105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaParserCtxtPtr ctxt)
189115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
189125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
189135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Model Group Correct
189145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2 Circular groups are disallowed. That is, within the {particles}
189155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * of a group there must not be at any depth a particle whose {term}
189165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is the group itself.
189175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
189185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((item == NULL) ||
189195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(item->type != XML_SCHEMA_TYPE_GROUP) ||
189205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(item->children == NULL))
189215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
189225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
189235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTreeItemPtr circ;
189245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children);
189265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (circ != NULL) {
189275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
189285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
189295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: The error report is not adequate: this constraint
189305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * is defined for model groups but not definitions, but since
189315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * there cannot be any circular model groups without a model group
189325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition (if not using a construction API), we check those
189335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * defintions only.
189345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
189355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
189365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_MG_PROPS_CORRECT_2,
189375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_ITEM_NODE(circ),
189385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Circular reference to the model group definition '%s' "
189395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"defined", xmlSchemaFormatQName(&str,
189405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item->targetNamespace, item->name));
189415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
189425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
189435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: We will cut the reference to avoid further
189445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * confusion of the processor. This is a fatal error.
189455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
189465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    circ->children = NULL;
189475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
189485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
189495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
189505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
189525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaModelGroupToModelGroupDefFixup:
189535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
189545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mg:  the model group
189555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
189565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Assigns the model group of model group definitions to the "term"
189575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the referencing particle.
189585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In xmlSchemaResolveModelGroupParticleReferences the model group
189595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * definitions were assigned to the "term", since needed for the
189605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * circularity check.
189615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
189625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
189635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     All Group Limited (cos-all-limited) (1.2)
189645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
189655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
189665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaModelGroupToModelGroupDefFixup(
189675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
189685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupPtr mg)
189695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
189705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
189715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (particle != NULL) {
189735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
189745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((WXS_PARTICLE_TERM(particle))->type !=
189755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_GROUP))
189765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
189775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    particle = WXS_PTC_CAST particle->next;
189785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
189795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
189805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) {
189815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
189825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Remove the particle.
189835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
189845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_PARTICLE_TERM(particle) = NULL;
189855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    particle = WXS_PTC_CAST particle->next;
189865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
189875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
189885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
189895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Assign the model group to the {term} of the particle.
189905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
189915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_PARTICLE_TERM(particle) =
189925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
189935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle = WXS_PTC_CAST particle->next;
189955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
189965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
189975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
189995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckAttrGroupCircularRecur:
190005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxtGr: the searched attribute group
190015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the current attribute list to be processed
190025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
190035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This one is intended to be used by
190045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckAttrGroupCircular only.
190055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
190065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the circular attribute grou reference, otherwise NULL.
190075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
190085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaQNameRefPtr
190095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
190105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     xmlSchemaItemListPtr list)
190115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
190125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr gr;
190135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ref, circ;
190145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
190155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
190165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We will search for an attribute group reference which
190175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * references the context attribute group.
190185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
190195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < list->nbItems; i++) {
190205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ref = list->items[i];
190215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
190225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
190235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ref->item != NULL))
190245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
190255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    gr = WXS_ATTR_GROUP_CAST ref->item;
190265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (gr == ctxtGr)
190275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ref);
190285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
190295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
190305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
190315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Mark as visited to avoid infinite recursion on
190325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * circular references not yet examined.
190335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
190345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((gr->attrUses) &&
190355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
190365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
190375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
190385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
190395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaItemListPtr) gr->attrUses);
190405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
190415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (circ != NULL)
190425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (circ);
190435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
190445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
190465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
190475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
190485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
190495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
190515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckAttrGroupCircular:
190525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attrGr:  the attribute group definition
190535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the parser context
190545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name
190555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
190565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks for circular references of attribute groups.
190575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
190585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
190595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
190605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaParserCtxtPtr ctxt)
190615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
190625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
190635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Representation Constraint:
190645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute Group Definition Representation OK
190655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3 Circular group reference is disallowed outside <redefine>.
190665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * That is, unless this element information item's parent is
190675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * <redefine>, then among the [children], if any, there must
190685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * not be an <attributeGroup> with ref [attribute] which resolves
190695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to the component corresponding to this <attributeGroup>. Indirect
190705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * circularity is also ruled out. That is, when QName resolution
190715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (Schema Document) (�3.15.3) is applied to a �QName� arising from
190725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * any <attributeGroup>s with a ref [attribute] among the [children],
190735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * it must not be the case that a �QName� is encountered at any depth
190745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * which resolves to the component corresponding to this <attributeGroup>.
190755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
190765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrGr->attrUses == NULL)
190775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
190785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
190795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
190805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
190815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr circ;
190825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
190845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlSchemaItemListPtr) attrGr->attrUses);
190855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (circ != NULL) {
190865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
190875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
190885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Report the referenced attr group as QName.
190895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
190905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
190915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3,
190925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
190935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Circular reference to the attribute group '%s' "
190945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"defined", xmlSchemaGetComponentQName(&str, attrGr));
190955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
190965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
190975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: We will cut the reference to avoid further
190985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * confusion of the processor.
190995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * BADSPEC TODO: The spec should define how to process in this case.
191005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    circ->item = NULL;
191025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ctxt->err);
191035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
191045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
191055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
191065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
191075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
191095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
191105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaAttributeGroupPtr attrGr);
191115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
191135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaExpandAttributeGroupRefs:
191145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt: the parser context
191155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node of the component holding the attribute uses
191165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @completeWild: the intersected wildcard to be returned
191175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: the attribute uses
191185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
191195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Substitutes contained attribute group references
191205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for their attribute uses. Wilcards are intersected.
191215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Attribute use prohibitions are removed from the list
191225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and returned via the @prohibs list.
191235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pointlessness of attr. prohibs, if a matching attr. decl
191245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is existent a well, are checked.
191255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
191265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
191275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
191285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaBasicItemPtr item,
191295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaWildcardPtr *completeWild,
191305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaItemListPtr list,
191315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaItemListPtr prohibs)
191325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
191335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr gr;
191345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr use;
191355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr sublist;
191365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j;
191375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int created = (*completeWild == NULL) ? 0 : 1;
191385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prohibs)
191405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohibs->nbItems = 0;
191415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < list->nbItems; i++) {
191435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = list->items[i];
191445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
191465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (prohibs == NULL) {
191475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaExpandAttributeGroupRefs",
191485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "unexpected attr prohibition found");
191495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
191505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
191515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
191525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Remove from attribute uses.
191535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaItemListRemove(list, i) == -1)
191555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
191565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i--;
191575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
191585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that duplicate prohibitions were already
191595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * handled at parsing time.
191605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
191625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Add to list of prohibitions.
191635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaItemListAddSize(prohibs, 2, use);
191655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
191665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
191675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
191685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
191695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
191705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((WXS_QNAME_CAST use)->item == NULL)
191715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
191725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
191735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
191745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Expand the referenced attr. group.
191755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: remove this, this is done in a previous step, so
191765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * already done here.
191775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
191795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
191805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
191815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
191825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
191835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Build the 'complete' wildcard; i.e. intersect multiple
191845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * wildcards.
191855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
191865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (gr->attributeWildcard != NULL) {
191875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*completeWild == NULL) {
191885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *completeWild = gr->attributeWildcard;
191895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
191905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (! created) {
191915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaWildcardPtr tmpWild;
191925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 /*
191945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Copy the first encountered wildcard as context,
191955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* except for the annotation.
191965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*
191975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Although the complete wildcard might not correspond
191985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* to any node in the schema, we will anchor it on
191995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* the node of the owner component.
192005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
192015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmpWild =  xmlSchemaAddWildcard(pctxt, pctxt->schema,
192025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
192035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ITEM_NODE(item));
192045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (tmpWild == NULL)
192055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
192065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaCloneWildcardNsConstraints(pctxt,
192075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    tmpWild, *completeWild) == -1)
192085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return (-1);
192095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmpWild->processContents = (*completeWild)->processContents;
192105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*completeWild = tmpWild;
192115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			created = 1;
192125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
192135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
192155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			gr->attributeWildcard) == -1)
192165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(-1);
192175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
192185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
192195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
192205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Just remove the reference if the referenced group does not
192215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * contain any attribute uses.
192225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
192235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sublist = ((xmlSchemaItemListPtr) gr->attrUses);
192245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((sublist == NULL) || sublist->nbItems == 0) {
192255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaItemListRemove(list, i) == -1)
192265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
192275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i--;
192285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
192295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
192305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
192315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Add the attribute uses.
192325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
192335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list->items[i] = sublist->items[0];
192345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sublist->nbItems != 1) {
192355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (j = 1; j < sublist->nbItems; j++) {
192365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    i++;
192375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaItemListInsert(list,
192385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    sublist->items[j], i) == -1)
192395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(-1);
192405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
192415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
192425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
192435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
192455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
192465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle pointless prohibitions of declared attributes.
192475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
192485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) {
192495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributeUseProhibPtr prohib;
192505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = prohibs->nbItems -1; i >= 0; i--) {
192525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prohib = prohibs->items[i];
192535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (j = 0; j < list->nbItems; j++) {
192545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		use = list->items[j];
192555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
192575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
192585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
192595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
192605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
192625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
192635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prohib->node, NULL,
192645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Skipping pointless attribute use prohibition "
192655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"'%s', since a corresponding attribute use "
192665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"exists already in the type definition",
192675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatQName(&str,
192685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    prohib->targetNamespace, prohib->name),
192695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL);
192705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str);
192715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
192725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Remove the prohibition.
192735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
192745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaItemListRemove(prohibs, i) == -1)
192755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(-1);
192765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
192775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
192785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
192795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
192805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
192815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
192825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
192835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
192855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAttributeGroupExpandRefs:
192865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  the parser context
192875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attrGr:  the attribute group definition
192885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
192895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Computation of:
192905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {attribute uses} property
192915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {attribute wildcard} property
192925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
192935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Substitutes contained attribute group references
192945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for their attribute uses. Wilcards are intersected.
192955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
192965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
192975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
192985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaAttributeGroupPtr attrGr)
192995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
193005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((attrGr->attrUses == NULL) ||
193015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
193025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
193035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
193055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
193065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1)
193075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
193085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
193095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
193105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
193125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAttributeGroupExpandRefs:
193135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  the parser context
193145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attrGr:  the attribute group definition
193155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
193165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Substitutes contained attribute group references
193175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for their attribute uses. Wilcards are intersected.
193185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
193195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
193205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Attribute Group Definition Properties Correct (ag-props-correct)
193215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
193225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
193235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
193245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaAttributeGroupPtr attrGr)
193255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
193265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
193275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC ag-props-correct
193285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (1) "The values of the properties of an attribute group definition
193295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be as described in the property tableau in The Attribute
193305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Group Definition Schema Component (�3.6.1), modulo the impact of
193315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Missing Sub-components (�5.3);"
193325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
193335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((attrGr->attrUses != NULL) &&
193355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
193365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
193375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
193385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttributeUsePtr use, tmp;
193395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i, j, hasId = 0;
193405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = uses->nbItems -1; i >= 0; i--) {
193425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use = uses->items[i];
193435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
193445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC ag-props-correct
193455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (2) "Two distinct members of the {attribute uses} must not have
193465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {attribute declaration}s both of whose {name}s match and whose
193475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {target namespace}s are identical."
193485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
193495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (i > 0) {
193505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (j = i -1; j >= 0; j--) {
193515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = uses->items[j];
193525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
193535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_NAME(tmp)) &&
193545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(WXS_ATTRUSE_DECL_TNS(use) ==
193555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTRUSE_DECL_TNS(tmp)))
193565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
193575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
193585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
193605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_AG_PROPS_CORRECT,
193615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attrGr->node, WXS_BASIC_CAST attrGr,
193625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Duplicate %s",
193635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&str, use),
193645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
193655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
193665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
193675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Remove the duplicate.
193685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
193695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaItemListRemove(uses, i) == -1)
193705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
193715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto next_use;
193725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
193735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
193745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
193755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
193765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC ag-props-correct
193775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3) "Two distinct members of the {attribute uses} must not have
193785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {attribute declaration}s both of whose {type definition}s are or
193795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * are derived from ID."
193805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Does 'derived' include member-types of unions?
193815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
193825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
193835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIsDerivedFromBuiltInType(
193845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
193855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
193865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (hasId) {
193875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *str = NULL;
193885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
193905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_AG_PROPS_CORRECT,
193915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attrGr->node, WXS_BASIC_CAST attrGr,
193925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "There must not exist more than one attribute "
193935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "declaration of type 'xs:ID' "
193945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "(or derived from 'xs:ID'). The %s violates this "
193955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "constraint",
193965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&str, use),
193975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
193985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(str);
193995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaItemListRemove(uses, i) == -1)
194005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
194015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
194025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hasId = 1;
194035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
194045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
194055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_use: {}
194065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
194075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
194085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
194095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
194105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
194125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveAttrGroupReferences:
194135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attrgrpDecl:  the schema attribute definition
194145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
194155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
194165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
194175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves references to attribute group definitions.
194185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
194195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
194205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref,
194215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParserCtxtPtr ctxt)
194225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
194235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeGroupPtr group;
194245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ref->item != NULL)
194265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
194275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group = xmlSchemaGetAttributeGroup(ctxt->schema,
194285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ref->name,
194295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ref->targetNamespace);
194305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group == NULL) {
194315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPResCompAttrErr(ctxt,
194325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_RESOLVE,
194335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, ref->node,
194345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "ref", ref->name, ref->targetNamespace,
194355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ref->itemType, NULL);
194365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->err);
194375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
194385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ref->item = WXS_BASIC_CAST group;
194395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
194405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
194415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
194435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckAttrPropsCorrect:
194445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  an schema attribute declaration/use
194455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
194465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
194475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
194485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
194495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
194505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Attribute Declaration Properties Correct (a-props-correct)
194515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
194525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validates the value constraints of an attribute declaration/use.
194535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that this needs the simle type definitions to be already
194545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   builded and checked.
194555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
194565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
194575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
194585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaAttributePtr attr)
194595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
194605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
194625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC a-props-correct (1)
194635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The values of the properties of an attribute declaration must
194645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * be as described in the property tableau in The Attribute
194655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Declaration Schema Component (�3.2.1), modulo the impact of
194665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Missing Sub-components (�5.3)."
194675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
194685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_ATTR_TYPEDEF(attr) == NULL)
194705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
194715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->defValue != NULL) {
194735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
194745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
194765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC a-props-correct (3)
194775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "If the {type definition} is or is derived from ID then there
194785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* must not be a {value constraint}."
194795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
194805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaIsDerivedFromBuiltInType(
194815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID))
194825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
194835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
194845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_A_PROPS_CORRECT_3,
194855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_BASIC_CAST attr,
194865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Value constraints are not allowed if the type definition "
194875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"is or is derived from xs:ID",
194885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
194895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(pctxt->err);
194905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
194915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
194925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC a-props-correct (2)
194935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "if there is a {value constraint}, the canonical lexical
194945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* representation of its value must be �valid� with respect
194955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to the {type definition} as defined in String Valid (�3.14.4)."
194965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Don't care about the *cononical* stuff here, this requirement
194975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* will be removed in WXS 1.1 anyway.
194985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
194995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
195005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr->node, WXS_ATTR_TYPEDEF(attr),
195015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr->defValue, &(attr->defVal),
195025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    1, 1, 0);
195035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
195045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
195055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaCheckAttrPropsCorrect",
195065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVCheckCVCSimpleType()");
195075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
195085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
195095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
195105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_A_PROPS_CORRECT_2,
195115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_BASIC_CAST attr,
195125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value of the value constraint is not valid",
195135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
195145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(pctxt->err);
195155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
195165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
195175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
195195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaElementPtr
195225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
195235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 xmlSchemaElementPtr ancestor)
195245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
195255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr ret;
195265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_HEAD(ancestor) == NULL)
195285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
195295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_HEAD(ancestor) == elemDecl)
195305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ancestor);
195315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR)
195335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
195345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
195355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
195365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_SUBST_HEAD(ancestor));
195375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
195385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
195405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
195435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckElemPropsCorrect:
195445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
195455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @decl: the element declaration
195465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
195475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
195485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
195495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Element Declaration Properties Correct (e-props-correct)
195505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
195515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
195525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   missing: (6)
195535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
195545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
195555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
195565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaElementPtr elemDecl)
195575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
195585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
195595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
195605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
195615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (1) "The values of the properties of an element declaration
195625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be as described in the property tableau in The Element
195635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Declaration Schema Component (�3.3.1), modulo the impact of Missing
195645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Sub-components (�5.3)."
195655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
195665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_SUBST_HEAD(elemDecl) != NULL) {
195675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ;
195685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCheckElementDeclComponent(head, pctxt);
195705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
195715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (3) "If there is a non-�absent� {substitution group
195725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* affiliation}, then {scope} must be global."
195735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
195745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
195755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(pctxt,
195765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_E_PROPS_CORRECT_3,
195775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST elemDecl, NULL,
195785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Only global element declarations can have a "
195795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"substitution group affiliation", NULL);
195805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAP_E_PROPS_CORRECT_3;
195815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
195825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
195835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: SPEC (6) "Circular substitution groups are disallowed.
195845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* That is, it must not be possible to return to an element declaration
195855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* by repeatedly following the {substitution group affiliation}
195865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* property."
195875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
195885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (head == elemDecl)
195895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    circ = head;
195905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (WXS_SUBST_HEAD(head) != NULL)
195915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    circ = xmlSchemaCheckSubstGroupCircular(head, head);
195925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
195935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    circ = NULL;
195945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (circ != NULL) {
195955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *strA = NULL, *strB = NULL;
195965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErrExt(pctxt,
195985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_E_PROPS_CORRECT_6,
195995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST circ, NULL,
196005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The element declaration '%s' defines a circular "
196015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"substitution group to element declaration '%s'",
196025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&strA, circ),
196035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&strB, head),
196045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
196055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(strA)
196065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(strB)
196075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAP_E_PROPS_CORRECT_6;
196085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
196095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
196105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (4) "If there is a {substitution group affiliation},
196115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the {type definition}
196125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the element declaration must be validly derived from the {type
196135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* definition} of the {substitution group affiliation}, given the value
196145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the {substitution group exclusions} of the {substitution group
196155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6)
196165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (if the {type definition} is complex) or as defined in
196175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is
196185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* simple)."
196195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
196205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: {substitution group exclusions} means the values of the
196215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* attribute "final".
196225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
196235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
196255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int set = 0;
196265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
196285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= SUBSET_EXTENSION;
196295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
196305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= SUBSET_RESTRICTION;
196315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
196335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ELEM_TYPEDEF(head), set) != 0) {
196345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
196355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAP_E_PROPS_CORRECT_4;
196375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPCustomErrExt(pctxt,
196385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_E_PROPS_CORRECT_4,
196395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST elemDecl, NULL,
196405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The type definition '%s' was "
196415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "either rejected by the substitution group "
196425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "affiliation '%s', or not validly derived from its type "
196435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "definition '%s'",
196445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&strA, typeDef),
196455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&strB, head),
196465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head)));
196475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strA)
196485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strB)
196495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(strC)
196505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
196515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
196525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
196535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
196545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (5) "If the {type definition} or {type definition}'s
196555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {content type}
196565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is or is derived from ID then there must not be a {value constraint}.
196575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note: The use of ID as a type definition for elements goes beyond
196585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * XML 1.0, and should be avoided if backwards compatibility is desired"
196595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
196605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemDecl->value != NULL) &&
196615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((WXS_IS_SIMPLE(typeDef) &&
196625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
196635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (WXS_IS_COMPLEX(typeDef) &&
196645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  WXS_HAS_SIMPLE_CONTENT(typeDef) &&
196655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
196665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAS_ID)))) {
196675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAP_E_PROPS_CORRECT_5;
196695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(pctxt,
196705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_E_PROPS_CORRECT_5,
196715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST elemDecl, NULL,
196725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The type definition (or type definition's content type) is or "
196735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "is derived from ID; value constraints are not allowed in "
196745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "conjunction with such a type definition", NULL);
196755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (elemDecl->value != NULL) {
196765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int vcret;
196775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr node = NULL;
196785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
196805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2) "If there is a {value constraint}, the canonical lexical
196815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* representation of its value must be �valid� with respect to the
196825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {type definition} as defined in Element Default Valid (Immediate)
196835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (�3.3.6)."
196845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
196855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (typeDef == NULL) {
196865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPErr(pctxt, elemDecl->node,
196875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_INTERNAL,
196885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Internal error: xmlSchemaCheckElemPropsCorrect, "
196895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"type is missing... skipping validation of "
196905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"the value constraint", NULL, NULL);
196915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
196925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
196935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elemDecl->node != NULL) {
196945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
196955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
196965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    BAD_CAST "fixed");
196975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
196985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
196995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    BAD_CAST "default");
197005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
197015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node,
197025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    typeDef, elemDecl->value, &(elemDecl->defVal));
197035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vcret != 0) {
197045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vcret < 0) {
197055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaElemCheckValConstr",
197065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "failed to validate the value constraint of an "
197075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "element declaration");
197085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
197095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
197105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (vcret);
197115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
197125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
197135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
197155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
197165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
197185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckElemSubstGroup:
197195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
197205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @decl: the element declaration
197215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
197225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
197235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
197245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Substitution Group (cos-equiv-class)
197255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
197265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In Libxml2 the subst. groups will be precomputed, in terms of that
197275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a list will be built for each subst. group head, holding all direct
197285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * referents to this head.
197295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that this function needs:
197305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   1. circular subst. groups to be checked beforehand
197315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   2. the declaration's type to be derived from the head's type
197325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
197335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STATUS:
197345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
197355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
197365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
197375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
197385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaElementPtr elemDecl)
197395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
197405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((WXS_SUBST_HEAD(elemDecl) == NULL) ||
197415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* SPEC (1) "Its {abstract} is false." */
197425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
197435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
197445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
197455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaElementPtr head;
197465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr headType, type;
197475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int set, methSet;
197485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
197495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2) "It is validly substitutable for HEAD subject to HEAD's
197505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {disallowed substitutions} as the blocking constraint, as defined in
197515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Substitution Group OK (Transitive) (�3.3.6)."
197525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
197535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (head = WXS_SUBST_HEAD(elemDecl); head != NULL;
197545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    head = WXS_SUBST_HEAD(head)) {
197555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    set = 0;
197565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    methSet = 0;
197575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
197585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The blocking constraints.
197595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
197605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
197615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
197625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    headType = head->subtypes;
197635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type = elemDecl->subtypes;
197645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (headType == type)
197655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto add_member;
197665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
197675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
197685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
197695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
197705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
197715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC: Substitution Group OK (Transitive) (2.3)
197725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "The set of all {derivation method}s involved in the
197735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * derivation of D's {type definition} from C's {type definition}
197745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * does not intersect with the union of the blocking constraint,
197755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * C's {prohibited substitutions} (if C is complex, otherwise the
197765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * empty set) and the {prohibited substitutions} (respectively the
197775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * empty set) of any intermediate {type definition}s in the
197785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * derivation of D's {type definition} from C's {type definition}."
197795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
197805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
197815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * OPTIMIZE TODO: Optimize this a bit, since, if traversing the
197825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * subst.head axis, the methSet does not need to be computed for
197835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the full depth over and over.
197845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
197855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
197865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The set of all {derivation method}s involved in the derivation
197875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
197885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((type != NULL) && (type != headType)) {
197895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_IS_EXTENSION(type)) &&
197905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
197915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
197925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_RESTRICTION(type) &&
197945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
197955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
197965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type = type->baseType;
197985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
197995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
198005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The {prohibited substitutions} of all intermediate types +
198015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the head's type.
198025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
198035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type = elemDecl->subtypes->baseType;
198045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (type != NULL) {
198055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_COMPLEX(type)) {
198065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((type->flags &
198075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
198085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
198095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
198105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((type->flags &
198115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
198125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
198135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
198145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
198155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
198165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type == headType)
198175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
198185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type = type->baseType;
198195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
198205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((set != 0) &&
198215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
198225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
198235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
198245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
198255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
198265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
198275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)add_member:
198285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl);
198295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
198305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
198315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
198325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
198335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
198345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */
198365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
198375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckElementDeclComponent
198385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt: the schema parser context
198395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxtComponent: the context component (an element declaration)
198405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxtParticle: the first particle of the context component
198415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @searchParticle: the element declaration particle to be analysed
198425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
198435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint: Element Declarations Consistent
198445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
198455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
198465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
198475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaBasicItemPtr ctxtComponent,
198485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr ctxtParticle,
198495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr searchParticle,
198505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaParticlePtr curParticle,
198515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    int search)
198525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
198535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
198545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
198565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr cur = curParticle;
198575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (curParticle == NULL) {
198585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
198595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
198605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_PARTICLE_TERM(curParticle) == NULL) {
198615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
198625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Just return in this case. A missing "term" of the particle
198635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* might arise due to an invalid "term" component.
198645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
198655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
198665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
198675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
198685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (WXS_PARTICLE_TERM(cur)->type) {
198695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ANY:
198705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
198715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ELEMENT:
198725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (search == 0) {
198735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaCheckElementDeclConsistent(pctxt,
198745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ctxtComponent, ctxtParticle, cur, ctxtParticle, 1);
198755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != 0)
198765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
198775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
198785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaElementPtr elem =
198795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur));
198805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
198815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC Element Declarations Consistent:
198825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * "If the {particles} contains, either directly,
198835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * indirectly (that is, within the {particles} of a
198845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * contained model group, recursively) or �implicitly�
198855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * two or more element declaration particles with
198865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * the same {name} and {target namespace}, then
198875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * all their type definitions must be the same
198885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * top-level definition [...]"
198895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
198905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name,
198915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) &&
198925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
198935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
198945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
198955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *strA = NULL, *strB = NULL;
198965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST pctxt,
198985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* TODO: error code */
198995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_SCHEMAP_COS_NONAMBIG,
199005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    WXS_ITEM_NODE(cur), NULL,
199015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "In the content model of %s, there are multiple "
199025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "element declarations for '%s' with different "
199035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "type definitions",
199045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaGetComponentDesignation(&strA,
199055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ctxtComponent),
199065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaFormatQName(&strB,
199075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
199085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				WXS_PARTICLE_TERM_AS_ELEM(cur)->name));
199095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(strA);
199105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			FREE_AND_NULL(strB);
199115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(XML_SCHEMAP_COS_NONAMBIG);
199125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
199135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
199145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
199155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SEQUENCE: {
199165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
199175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
199185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_CHOICE:{
199195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
199205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaTreeItemPtr sub;
199215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sub = WXS_PARTICLE_TERM(particle)->children;  (xmlSchemaParticlePtr)
199235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (sub != NULL) {
199245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent,
199255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ctxtParticle, ctxtElem);
199265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != 0)
199275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
199285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sub = sub->next;
199295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
199305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
199315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
199325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
199335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ALL:
199345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
199355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
199365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
199375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
199385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaInternalErr2(ACTXT_CAST pctxt,
199395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "xmlSchemaCheckElementDeclConsistent",
199405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "found unexpected term of type '%s' in content model",
199415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL);
199425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
199435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
199445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = (xmlSchemaParticlePtr) cur->next;
199455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
199465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
199485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
199495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
199505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
199515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
199535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckElementDeclComponent
199545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  an schema element declaration/particle
199555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
199565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
199575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
199585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validates the value constraints of an element declaration.
199595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds substitution group members.
199605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
199615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
199625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
199635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaParserCtxtPtr ctxt)
199645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
199655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemDecl == NULL)
199665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
199675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
199685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
199695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
199705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
199715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
199725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Adds substitution group members.
199735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
199745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
199755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
199765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
199775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
199795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveModelGroupParticleReferences:
199805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @particle:  a particle component
199815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a parser context
199825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
199835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves references of a model group's {particles} to
199845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * model group definitions and to element declarations.
199855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
199865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
199875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveModelGroupParticleReferences(
199885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr ctxt,
199895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaModelGroupPtr mg)
199905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
199915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
199925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaQNameRefPtr ref;
199935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr refItem;
199945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
199965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * URGENT TODO: Test this.
199975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
199985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (particle != NULL) {
199995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
200005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((WXS_PARTICLE_TERM(particle))->type !=
200015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_EXTRA_QNAMEREF))
200025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
200035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_particle;
200045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
200055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
200065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
200075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Resolve the reference.
200085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NULL the {term} by default.
200095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
200105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle->children = NULL;
200115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	refItem = xmlSchemaGetNamedComponent(ctxt->schema,
200135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ref->itemType, ref->name, ref->targetNamespace);
200145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (refItem == NULL) {
200155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
200165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_ITEM_NODE(particle), "ref", ref->name,
200175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ref->targetNamespace, ref->itemType, NULL);
200185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: remove the particle. */
200195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_particle;
200205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
200215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
200225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL)
200235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: remove the particle. */
200245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto next_particle;
200255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
200265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE that we will assign the model group definition
200275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * itself to the "term" of the particle. This will ease
200285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the check for circular model group definitions. After
200295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * that the "term" will be assigned the model group of the
200305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * model group definition.
200315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
200325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((WXS_MODELGROUPDEF_MODEL(refItem))->type ==
200335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_ALL) {
200345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
200355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC cos-all-limited (1)
200365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC cos-all-limited (1.2)
200375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "It appears only as the value of one or both of the
200385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* following properties:"
200395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (1.1) "the {model group} property of a model group
200405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*        definition."
200415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (1.2) "the {term} property of a particle [... of] the "
200425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* {content type} of a complex type definition."
200435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
200445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST ctxt,
200455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* TODO: error code */
200465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_COS_ALL_LIMITED,
200475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ITEM_NODE(particle), NULL,
200485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "A model group definition is referenced, but "
200495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "it contains an 'all' model group, which "
200505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "cannot be contained by model groups",
200515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL);
200525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: remove the particle. */
200535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto next_particle;
200545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
200555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    particle->children = (xmlSchemaTreeItemPtr) refItem;
200565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
200575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
200585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Are referenced element declarations the only
200595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * other components we expect here?
200605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
200615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    particle->children = (xmlSchemaTreeItemPtr) refItem;
200625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
200635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_particle:
200645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	particle = WXS_PTC_CAST particle->next;
200655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
200665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
200675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
200695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAreValuesEqual(xmlSchemaValPtr x,
200705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaValPtr y)
200715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
200725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr tx, ty, ptx, pty;
200735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
200745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (x != NULL) {
200765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Same types. */
200775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x));
200785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y));
200795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ptx = xmlSchemaGetPrimitiveType(tx);
200805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pty = xmlSchemaGetPrimitiveType(ty);
200815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
200825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (1) if a datatype T' is �derived� by �restriction� from an
200835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* atomic datatype T then the �value space� of T' is a subset of
200845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the �value space� of T. */
200855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
200865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (2) if datatypes T' and T'' are �derived� by �restriction�
200875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* from a common atomic ancestor T then the �value space�s of T'
200885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* and T'' may overlap.
200895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
200905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ptx != pty)
200915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
200925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
200935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We assume computed values to be normalized, so do a fast
200945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* string comparison for string based types.
200955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
200965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
200975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
200985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! xmlStrEqual(
200995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaValueGetAsString(x),
201005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaValueGetAsString(y)))
201015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
201025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
201035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaCompareValuesWhtsp(
201045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		x, XML_SCHEMA_WHITESPACE_PRESERVE,
201055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		y, XML_SCHEMA_WHITESPACE_PRESERVE);
201065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -2)
201075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
201085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0)
201095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
201105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
201115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
201125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Lists.
201135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
201145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	x = xmlSchemaValueGetNext(x);
201155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (x != NULL) {
201165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    y = xmlSchemaValueGetNext(y);
201175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (y == NULL)
201185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
201195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlSchemaValueGetNext(y) != NULL)
201205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
201215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
201225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
201235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
201245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
201255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
201265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
201285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveAttrUseReferences:
201295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  an attribute use
201305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a parser context
201315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
201325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves the referenced attribute declaration.
201335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
201345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
201355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
201365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlSchemaParserCtxtPtr ctxt)
201375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
201385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (ause == NULL))
201395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
201405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ause->attrDecl == NULL) ||
201415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
201425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
201435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
201455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl;
201465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
201485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Evaluate, what errors could occur if the declaration is not
201495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* found.
201505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
201515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
201525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ref->name, ref->targetNamespace);
201535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ause->attrDecl == NULL) {
201545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt,
201555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    	XML_SCHEMAP_SRC_RESOLVE,
201565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST ause, ause->node,
201575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"ref", ref->name, ref->targetNamespace,
201585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
201595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(ctxt->err);;
201605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
201615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
201625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
201635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
201645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
201665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckAttrUsePropsCorrect:
201675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a parser context
201685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @use:  an attribute use
201695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
201705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
201715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Attribute Use Correct (au-props-correct)
201725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
201735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
201745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
201755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
201765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaAttributeUsePtr use)
201775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
201785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (use == NULL))
201795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
201805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) ||
201815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE))
201825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
201835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
201855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC au-props-correct (1)
201865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The values of the properties of an attribute use must be as
201875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * described in the property tableau in The Attribute Use Schema
201885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Component (�3.5.1), modulo the impact of Missing
201895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Sub-components (�5.3)."
201905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
201915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) &&
201935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) &&
201945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
201955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
201965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPCustomErr(ctxt,
201975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_AU_PROPS_CORRECT_2,
201985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_BASIC_CAST use, NULL,
201995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The attribute declaration has a 'fixed' value constraint "
202005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ", thus the attribute use must also have a 'fixed' value "
202015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "constraint",
202025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL);
202035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->err);
202045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
202055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
202065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Compute and check the value constraint's value.
202075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
202085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) {
202095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
202105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
202115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: The spec seems to be missing a check of the
202125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* value constraint of the attribute use. We will do it here.
202135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
202145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
202155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC a-props-correct (3)
202165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
202175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaIsDerivedFromBuiltInType(
202185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
202195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
202205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
202215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_AU_PROPS_CORRECT,
202225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_BASIC_CAST use,
202235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Value constraints are not allowed if the type definition "
202245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"is or is derived from xs:ID",
202255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
202265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ctxt->err);
202275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
202285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
202305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use->node, WXS_ATTRUSE_TYPEDEF(use),
202315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    use->defValue, &(use->defVal),
202325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    1, 1, 0);
202335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
202345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
202355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect",
202365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVCheckCVCSimpleType()");
202375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
202385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
202395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
202405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_AU_PROPS_CORRECT,
202415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_BASIC_CAST use,
202425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The value of the value constraint is not valid",
202435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
202445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ctxt->err);
202455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
202465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
202475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
202485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC au-props-correct (2)
202495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "If the {attribute declaration} has a fixed
202505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {value constraint}, then if the attribute use itself has a
202515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * {value constraint}, it must also be fixed and its value must match
202525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * that of the {attribute declaration}'s {value constraint}."
202535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
202545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) &&
202555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
202565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
202575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! xmlSchemaAreValuesEqual(use->defVal,
202585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_ATTRUSE_DECL(use))->defVal))
202595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
202605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPCustomErr(ctxt,
202615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_AU_PROPS_CORRECT_2,
202625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST use, NULL,
202635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The 'fixed' value constraint of the attribute use "
202645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"must match the attribute declaration's value "
202655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"constraint '%s'",
202665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_ATTRUSE_DECL(use))->defValue);
202675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
202685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->err);
202695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
202705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
202715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
202725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
202775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveAttrTypeReferences:
202785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item:  an attribute declaration
202795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a parser context
202805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
202815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves the referenced type definition component.
202825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
202835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
202845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item,
202855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlSchemaParserCtxtPtr ctxt)
202865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
202875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
202885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The simple type definition corresponding to the <simpleType> element
202895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * information item in the [children], if present, otherwise the simple
202905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * type definition �resolved� to by the �actual value� of the type
202915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * [attribute], if present, otherwise the �simple ur-type definition�.
202925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
202935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
202945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
202955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
202965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->subtypes != NULL)
202975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
202985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->typeName != NULL) {
202995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaTypePtr type;
203005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = xmlSchemaGetType(ctxt->schema, item->typeName,
203025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item->typeNs);
203035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type == NULL) || (! WXS_IS_SIMPLE(type))) {
203045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(ctxt,
203055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE,
203065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST item, item->node,
203075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"type", item->typeName, item->typeNs,
203085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_SIMPLE, NULL);
203095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ctxt->err);
203105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
203115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item->subtypes = type;
203125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
203145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
203155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The type defaults to the xs:anySimpleType.
203165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
203175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
203185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
203195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
203205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
203215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
203235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaResolveIDCKeyReferences:
203245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @idc:  the identity-constraint definition
203255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema parser context
203265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
203275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
203285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolve keyRef references to key/unique IDCs.
203295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schema Component Constraint:
203305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Identity-constraint Definition Properties Correct (c-props-correct)
203315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
203325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
203335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
203345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaParserCtxtPtr pctxt)
203355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
203365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
203375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
203385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idc->ref->name != NULL) {
203395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	idc->ref->item = (xmlSchemaBasicItemPtr)
203405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
203415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		idc->ref->targetNamespace);
203425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (idc->ref->item == NULL) {
203435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
203445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: It is actually not an error to fail to resolve
203455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * at this stage. BUT we need to be that strict!
203465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
203475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPResCompAttrErr(pctxt,
203485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_RESOLVE,
203495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST idc, idc->node,
203505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"refer", idc->ref->name,
203515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		idc->ref->targetNamespace,
203525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_TYPE_IDC_KEY, NULL);
203535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(pctxt->err);
203545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
203555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
203565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC c-props-correct (1)
203575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
203585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
203595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_C_PROPS_CORRECT,
203605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, WXS_BASIC_CAST idc,
203615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The keyref references a keyref",
203625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL);
203635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    idc->ref->item = NULL;
203645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(pctxt->err);
203655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
203665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (idc->nbFields !=
203675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
203685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
203695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaIDCPtr refer;
203705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		refer = (xmlSchemaIDCPtr) idc->ref->item;
203725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
203735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC c-props-correct(2)
203745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "If the {identity-constraint category} is keyref,
203755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the cardinality of the {fields} must equal that of
203765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the {fields} of the {referenced key}.
203775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
203785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST pctxt,
203795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAP_C_PROPS_CORRECT,
203805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, WXS_BASIC_CAST idc,
203815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The cardinality of the keyref differs from the "
203825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "cardinality of the referenced key/unique '%s'",
203835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str, refer->targetNamespace,
203845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			refer->name),
203855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL);
203865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str)
203875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(pctxt->err);
203885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
203895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
203905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
203915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
203925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
203935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
203955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
203965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       xmlSchemaParserCtxtPtr pctxt)
203975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
203985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
203995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prohib->targetNamespace) == NULL) {
204005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPResCompAttrErr(pctxt,
204025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAP_SRC_RESOLVE,
204035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, prohib->node,
204045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "ref", prohib->name, prohib->targetNamespace,
204055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
204065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(XML_SCHEMAP_SRC_RESOLVE);
204075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
204085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
204095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
204105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_REDEFINED_TYPE(c) \
204125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
204135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
204155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
204165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_REDEFINED_ATTR_GROUP(c) \
204185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
204195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
204215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
204225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
204235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err = 0;
204245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
204255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr prev, item;
204265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int wasRedefined;
204275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (redef == NULL)
204295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
204305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
204325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = redef->item;
204335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
204345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* First try to locate the redefined component in the
204355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* schema graph starting with the redefined schema.
204365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: According to this schema bug entry:
204375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html
204385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   it's not clear if the referenced component needs to originate
204395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   from the <redefine>d schema _document_ or the schema; the latter
204405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   would include all imported and included sub-schemas of the
204415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   <redefine>d schema. Currenlty we latter approach is used.
204425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   SUPPLEMENT: It seems that the WG moves towards the latter
204435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   approach, so we are doing it right.
204445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
204455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
204465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = xmlSchemaFindRedefCompInGraph(
204475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    redef->targetBucket, item->type,
204485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    redef->refName, redef->refTargetNs);
204495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prev == NULL) {
204505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
204515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr node;
204525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
204545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC src-redefine:
204555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (6.2.1) "The �actual value� of its own name attribute plus
204565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * target namespace must successfully �resolve� to a model
204575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * group definition in I."
204585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (7.2.1) "The �actual value� of its own name attribute plus
204595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * target namespace must successfully �resolve� to an attribute
204605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * group definition in I."
204615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
204635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that, if we are redefining with the use of references
204645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to components, the spec assumes the src-resolve to be used;
204655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * but this won't assure that we search only *inside* the
204665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * redefined schema.
204675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
204685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (redef->reference)
204695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = WXS_ITEM_NODE(redef->reference);
204705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
204715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = WXS_ITEM_NODE(item);
204725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
204735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
204745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: error code.
204755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the
204765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* reference kind.
204775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
204785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
204795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The %s '%s' to be redefined could not be found in "
204805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"the redefined schema",
204815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(item),
204825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str, redef->refTargetNs,
204835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    redef->refName));
204845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
204855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = pctxt->err;
204865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    redef = redef->next;
204875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
204885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
204895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
204905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Obtaining and setting the redefinition state is really
204915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* clumsy.
204925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
204935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wasRedefined = 0;
204945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
204955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
204965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SIMPLE:
204975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_TYPE_CAST prev)->flags &
204985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_TYPE_REDEFINED)
204995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
205005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    wasRedefined = 1;
205015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
205025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
205035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Mark it as redefined. */
205045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED;
205055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
205065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Assign the redefined type to the
205075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* base type of the redefining type.
205085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: How
205095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
205105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((xmlSchemaTypePtr) item)->baseType =
205115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaTypePtr) prev;
205125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
205135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
205145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
205155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
205165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
205175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    wasRedefined = 1;
205185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
205195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
205205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Mark it as redefined. */
205215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_MODEL_GROUPDEF_CAST prev)->flags |=
205225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
205235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (redef->reference != NULL) {
205245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
205255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Overwrite the QName-reference with the
205265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * referenced model group def.
205275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
205285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_PTC_CAST redef->reference)->children =
205295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_TREE_CAST prev;
205305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
205315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		redef->target = prev;
205325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
205335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
205345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_ATTR_GROUP_CAST prev)->flags &
205355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ATTRGROUP_REDEFINED)
205365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
205375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    wasRedefined = 1;
205385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
205395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
205405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_ATTR_GROUP_CAST prev)->flags |=
205415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ATTRGROUP_REDEFINED;
205425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (redef->reference != NULL) {
205435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
205445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Assign the redefined attribute group to the
205455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * QName-reference component.
205465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * This is the easy case, since we will just
205475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * expand the redefined group.
205485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
205495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_QNAME_CAST redef->reference)->item = prev;
205505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    redef->target = NULL;
205515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
205525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
205535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * This is the complicated case: we need
205545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * to apply src-redefine (7.2.2) at a later
205555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * stage, i.e. when attribute group references
205565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * have beed expanded and simple types have
205575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * beed fixed.
205585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
205595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    redef->target = prev;
205605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
205615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
205625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
205635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaResolveRedefReferences",
205645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Unexpected redefined component type");
205655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
205665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
205675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (wasRedefined) {
205685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
205695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr node;
205705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (redef->reference)
205725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = WXS_ITEM_NODE(redef->reference);
205735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
205745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = WXS_ITEM_NODE(redef->item);
205755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
205775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: error code. */
205785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_SRC_REDEFINE,
205795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node, NULL,
205805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The referenced %s was already redefined. Multiple "
205815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"redefinition of the same component is not supported",
205825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentDesignation(&str, prev),
205835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL);
205845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str)
205855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    err = pctxt->err;
205865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    redef = redef->next;
205875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
205885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
205895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	redef = redef->next;
205905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (redef != NULL);
205915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(err);
205935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
205965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
205975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
205985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err = 0;
205995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
206005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr item;
206015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (redef == NULL)
206035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
206045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
206065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (redef->target == NULL) {
206075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    redef = redef->next;
206085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
206095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
206105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = redef->item;
206115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
206135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SIMPLE:
206145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
206155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
206165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Since the spec wants the {name} of the redefined
206175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* type to be 'absent', we'll NULL it.
206185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
206195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(WXS_TYPE_CAST redef->target)->name = NULL;
206205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
206225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Seems like there's nothing more to do. The normal
206235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* inheritance mechanism is used. But not 100% sure.
206245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
206255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
206265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
206275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
206285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* URGENT TODO:
206295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC src-redefine:
206305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (6.2.2) "The {model group} of the model group definition
206315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* which corresponds to it per XML Representation of Model
206325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Group Definition Schema Components (�3.7.2) must be a
206335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* �valid restriction� of the {model group} of that model
206345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* group definition in I, as defined in Particle Valid
206355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (Restriction) (�3.9.6)."
206365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
206375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
206385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
206395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
206405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC src-redefine:
206415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (7.2.2) "The {attribute uses} and {attribute wildcard} of
206425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the attribute group definition which corresponds to it
206435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* per XML Representation of Attribute Group Definition Schema
206445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Components (�3.6.2) must be �valid restrictions� of the
206455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* {attribute uses} and {attribute wildcard} of that attribute
206465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* group definition in I, as defined in clause 2, clause 3 and
206475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* clause 4 of Derivation Valid (Restriction, Complex)
206485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* (�3.4.6) (where references to the base type definition are
206495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* understood as references to the attribute group definition
206505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* in I)."
206515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
206525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
206535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_ACTION_REDEFINE,
206545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    item, redef->target,
206555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTR_GROUP_CAST item)->attrUses,
206565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
206575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTR_GROUP_CAST item)->attributeWildcard,
206585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
206595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (err == -1)
206605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
206615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
206625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
206635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
206645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
206655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	redef = redef->next;
206665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (redef != NULL);
206675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
206685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
206695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
206725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
206735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaBucketPtr bucket)
206745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
206755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBasicItemPtr item;
206765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
206775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashTablePtr *table;
206785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name;
206795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
206805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WXS_GET_GLOBAL_HASH(c, slot) { \
206825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
206835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	table = &(WXS_IMPBUCKET((c))->schema->slot); \
206845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else \
206855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
206865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
206885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add global components to the schema's hash tables.
206895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * This is the place where duplicate components will be
206905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * detected.
206915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: I think normally we should support imports of the
206925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   same namespace from multiple locations. We don't do currently,
206935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   but if we do then according to:
206945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224
206955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   we would need, if imported directly, to import redefined
206965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   components as well to be able to catch clashing components.
206975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   (I hope I'll still know what this means after some months :-()
206985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
206995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket == NULL)
207005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
207015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
207025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
207035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
207045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < bucket->globals->nbItems; i++) {
207065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = bucket->globals->items[i];
207075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	table = NULL;
207085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
207095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
207105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SIMPLE:
207115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_REDEFINED_TYPE(item))
207125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
207135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_TYPE_CAST item)->name;
207145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, typeDecl)
207155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ELEMENT:
207175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_ELEM_CAST item)->name;
207185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, elemDecl)
207195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTE:
207215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_ATTR_CAST item)->name;
207225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, attrDecl)
207235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
207255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_REDEFINED_MODEL_GROUP_DEF(item))
207265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
207275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_MODEL_GROUPDEF_CAST item)->name;
207285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, groupDecl)
207295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
207315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_REDEFINED_ATTR_GROUP(item))
207325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
207335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_ATTR_GROUP_CAST item)->name;
207345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
207355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_KEY:
207375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
207385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_KEYREF:
207395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = (WXS_IDC_CAST item)->name;
207405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, idcDef)
207415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_NOTATION:
207435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name = ((xmlSchemaNotationPtr) item)->name;
207445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_GET_GLOBAL_HASH(bucket, notaDecl)
207455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
207465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
207475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaAddComponents",
207485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Unexpected global component type");
207495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
207505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
207515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*table == NULL) {
207525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *table = xmlHashCreateDict(10, pctxt->dict);
207535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*table == NULL) {
207545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PERROR_INT("xmlSchemaAddComponents",
207555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "failed to create a component hash table");
207565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
207575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
207585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
207595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	err = xmlHashAddEntry(*table, name, item);
207605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (err != 0) {
207615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
207625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
207645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAP_REDEFINED_TYPE,
207655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_NODE(item),
207665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST item,
207675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"A global %s '%s' does already exist",
207685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_ITEM_TYPE_NAME(item),
207695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetComponentQName(&str, item));
207705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
207715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
207725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
207735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
207745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Process imported/included schemas.
207755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
207765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket->relations != NULL) {
207775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSchemaRelationPtr rel = bucket->relations;
207785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
207795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((rel->bucket != NULL) &&
207805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
207815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
207825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
207835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
207845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rel = rel->next;
207855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (rel != NULL);
207865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
207875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
207885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
207895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
207915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
207925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaBucketPtr rootBucket)
207935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
207945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
207955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTreeItemPtr item, *items;
207965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbItems, i, ret = 0;
207975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr oldbucket = con->bucket;
207985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr elemDecl;
207995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
208015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((con->pending == NULL) ||
208035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(con->pending->nbItems == 0))
208045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
208055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
208075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Since xmlSchemaFixupComplexType() will create new particles
208085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (local components), and those particle components need a bucket
208095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * on the constructor, we'll assure here that the constructor has
208105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a bucket.
208115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Think about storing locals _only_ on the main bucket.
208125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
208135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->bucket == NULL)
208145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	con->bucket = rootBucket;
208155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO:
208175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (src-redefine):
208185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (6.2) "If it has no such self-reference, then all of the
208195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * following must be true:"
208205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (6.2.2) The {model group} of the model group definition which
208225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * corresponds to it per XML Representation of Model Group
208235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Definition Schema Components (�3.7.2) must be a �valid
208245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * restriction� of the {model group} of that model group definition
208255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * in I, as defined in Particle Valid (Restriction) (�3.9.6)."
208265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
208275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaCheckSRCRedefineFirst(pctxt);
208285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
208305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add global components to the schemata's hash tables.
208315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
208325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAddComponents(pctxt, rootBucket);
208335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->ctxtType = NULL;
208355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items = (xmlSchemaTreeItemPtr *) con->pending->items;
208365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbItems = con->pending->nbItems;
208375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
208385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Now that we have parsed *all* the schema document(s) and converted
208395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * them to schema components, we can resolve references, apply component
208405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * constraints, create the FSA from the content model, etc.
208415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
208425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
208435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Resolve references of..
208445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
208455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1. element declarations:
208465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the type definition
208475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the substitution group affiliation
208485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2. simple/complex types:
208495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the base type definition
208505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the memberTypes of union types
208515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the itemType of list types
208525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3. attributes declarations and attribute uses:
208535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the type definition
208545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - if an attribute use, then the attribute declaration
208555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 4. attribute group references:
208565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the attribute group definition
208575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 5. particles:
208585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the term of the particle (e.g. a model group)
208595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 6. IDC key-references:
208605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   - the referenced IDC 'key' or 'unique' definition
208615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 7. Attribute prohibitions which had a "ref" attribute.
208625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
208635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
208645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
208655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
208665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ELEMENT:
208675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveElementReferences(
208685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaElementPtr) item, pctxt);
208695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
208705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
208715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
208725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SIMPLE:
208735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveTypeReferences(
208745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaTypePtr) item, pctxt);
208755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
208765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
208775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTE:
208785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveAttrTypeReferences(
208795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaAttributePtr) item, pctxt);
208805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
208815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
208825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
208835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveAttrUseReferences(
208845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaAttributeUsePtr) item, pctxt);
208855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
208865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
208875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_EXTRA_QNAMEREF:
208885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_QNAME_CAST item)->itemType ==
208895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
208905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
208915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaResolveAttrGroupReferences(
208925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_QNAME_CAST item, pctxt);
208935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
208945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
208955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
208965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SEQUENCE:
208975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_CHOICE:
208985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ALL:
208995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveModelGroupParticleReferences(pctxt,
209005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_MODEL_GROUP_CAST item);
209015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_KEY:
209045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
209055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_IDC_KEYREF:
209065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveIDCKeyReferences(
209075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaIDCPtr) item, pctxt);
209085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
209115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
209125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Handle attribue prohibition which had a
209135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "ref" attribute.
209145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
209155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaResolveAttrUseProhibReferences(
209165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ATTR_PROHIB_CAST item, pctxt);
209175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
209205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
209225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
209235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
209245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
209255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
209275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Now that all references are resolved we
209285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * can check for circularity of...
209295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1. the base axis of type definitions
209305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2. nested model group definitions
209315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3. nested attribute group definitions
209325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: check for circual substitution groups.
209335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
209345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
209355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
209365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
209375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Let's better stop on the first error here.
209385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
209395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
209405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
209415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SIMPLE:
209425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckTypeDefCircular(
209435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaTypePtr) item, pctxt);
209445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (pctxt->nberrors != 0)
209465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit_error;
209475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_GROUP:
209495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckGroupDefCircular(
209505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaModelGroupDefPtr) item, pctxt);
209515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (pctxt->nberrors != 0)
209535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit_error;
209545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
209565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckAttrGroupCircular(
209575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaAttributeGroupPtr) item, pctxt);
209585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
209595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (pctxt->nberrors != 0)
209605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto exit_error;
209615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
209635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
209655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
209665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
209675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
209685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
209695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Model group definition references:
209705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Such a reference is reflected by a particle at the component
209715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * level. Until now the 'term' of such particles pointed
209725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to the model group definition; this was done, in order to
209735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * ease circularity checks. Now we need to set the 'term' of
209745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * such particles to the model group of the model group definition.
209755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
209765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
209775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
209785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
209795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_SEQUENCE:
209805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_CHOICE:
209815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
209825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_MODEL_GROUP_CAST item);
209835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
209855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
209865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
209875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
209885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
209895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
209905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
209915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Expand attribute group references of attribute group definitions.
209925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
209935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
209945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
209955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
209965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
209975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((! WXS_ATTR_GROUP_EXPANDED(item)) &&
209985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_ATTR_GROUP_HAS_REFS(item))
209995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
210005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaAttributeGroupExpandRefs(pctxt,
210015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTR_GROUP_CAST item);
210025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
210035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
210045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
210065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
210085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
210105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
210115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * First compute the variety of simple types. This is needed as
210135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a seperate step, since otherwise we won't be able to detect
210145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * circular union types in all cases.
210155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
210175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
210185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
210195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_SCHEMA_TYPE_SIMPLE:
210205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) {
210215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFixupSimpleTypeStageOne(pctxt,
210225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTypePtr) item);
210235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
210245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
210255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
210275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
210295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
210315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
210325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Detect circular union types. Note that this needs the variety to
210345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * be already computed.
210355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
210375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
210385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
210395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_SCHEMA_TYPE_SIMPLE:
210405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (((xmlSchemaTypePtr) item)->memberTypes != NULL) {
210415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCheckUnionTypeDefCircular(pctxt,
210425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTypePtr) item);
210435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
210445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
210455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
210475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
210495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
210515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
210525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Do the complete type fixup for simple types.
210555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
210575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
210585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
210595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_SCHEMA_TYPE_SIMPLE:
210605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
210615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item);
210625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
210635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
210645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
210665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
210685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
210705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
210715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * At this point we need build and check all simple types.
210735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply contraints for attribute declarations.
210765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
210785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
210795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
210805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTE:
210815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item);
210825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
210835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
210855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
210865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
210875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
210885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
210895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
210905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
210915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply constraints for attribute uses.
210925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
210935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
210945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
210955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
210965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
210975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) {
210985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCheckAttrUsePropsCorrect(pctxt,
210995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_ATTR_USE_CAST item);
211005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
211015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
211025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
211045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
211065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
211075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
211085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
211095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
211115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply constraints for attribute group definitions.
211125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
211135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
211145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
211155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
211165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
211175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) &&
211185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1))
211195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
211205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item);
211215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FIXHFAILURE;
211225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
211235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
211245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
211255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
211265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
211275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
211285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
211295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
211305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
211325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply constraints for redefinitions.
211335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
211345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL)
211355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCheckSRCRedefineSecond(pctxt);
211365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
211375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
211385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
211405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Complex types are builded and checked.
211415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
211425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
211435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = con->pending->items[i];
211445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
211455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
211465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
211475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item);
211485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
211495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
211505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
211525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
211545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
211555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
211565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
211575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
211595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The list could have changed, since xmlSchemaFixupComplexType()
211605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * will create particles and model groups in some cases.
211615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
211625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items = (xmlSchemaTreeItemPtr *) con->pending->items;
211635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbItems = con->pending->nbItems;
211645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
211665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Apply some constraints for element declarations.
211675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
211685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
211695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
211705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
211715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_ELEMENT:
211725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl = (xmlSchemaElementPtr) item;
211735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
211755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
211765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCheckElementDeclComponent(
211775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaElementPtr) elemDecl, pctxt);
211785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FIXHFAILURE;
211795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
211805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WXS_ELEM_DECL_CONS_ENABLED
211825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
211835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Schema Component Constraint: Element Declarations Consistent
211845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Apply this constraint to local types of element declarations.
211855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
211865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) &&
211875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
211885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
211895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
211905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCheckElementDeclConsistent(pctxt,
211915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST elemDecl,
211925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
211935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL, 0);
211945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
211955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
211965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
211985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
211995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
212005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
212015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
212025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
212035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
212055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Finally we can build the automaton from the content model of
212065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * complex types.
212075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
212085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbItems; i++) {
212105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	item = items[i];
212115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (item->type) {
212125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_TYPE_COMPLEX:
212135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt);
212145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* FIXHFAILURE; */
212155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
212165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
212175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
212185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
212195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
212205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors != 0)
212215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_error;
212225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
212235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * URGENT TODO: cos-element-consistent
212245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
212255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
212265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_error:
212285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = pctxt->err;
212295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
212305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
212325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = -1;
212335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
212355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
212365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Reset the constructor. This is needed for XSI acquisition, since
212375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * those items will be processed over and over again for every XSI
212385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * if not cleared here.
212395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
212405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    con->bucket = oldbucket;
212415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    con->pending->nbItems = 0;
212425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->substGroups != NULL) {
212435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashFree(con->substGroups,
212445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
212455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	con->substGroups = NULL;
212465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
212475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (con->redefs != NULL) {
212485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaRedefListFree(con->redefs);
212495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	con->redefs = NULL;
212505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
212515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
212525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
212535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
212545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaParse:
212555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
212565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
212575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a schema definition resource and build an internal
212585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML Shema struture which can be used to validate instances.
212595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
212605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal XML Schema structure built from the resource or
212615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         NULL in case of error
212625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
212635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPtr
212645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
212655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
212665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPtr mainSchema = NULL;
212675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket = NULL;
212685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
212695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
212715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * This one is used if the schema to be parsed was specified via
212725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the API; i.e. not automatically by the validated instance document.
212735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
212745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaInitTypes();
212765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
212785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
212795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Init the context. Is this all we need?*/
212815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->nberrors = 0;
212825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->err = 0;
212835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->counter = 0;
212845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create the *main* schema. */
212865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mainSchema = xmlSchemaNewSchema(ctxt);
212875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mainSchema == NULL)
212885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
212895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
212905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create the schema constructor.
212915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
212925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->constructor == NULL) {
212935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
212945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->constructor == NULL)
212955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
212965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Take ownership of the constructor to be able to free it. */
212975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->ownsConstructor = 1;
212985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
212995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->constructor->mainSchema = mainSchema;
213005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
213015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Locate and add the schema document.
213025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
213035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
213045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL,
213055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, NULL, &bucket);
213065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res == -1)
213075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
213085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0)
213095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
213105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket == NULL) {
213125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: Error code, actually we failed to *locate* the schema. */
213135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->URL)
213145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
213155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL,
213165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Failed to locate the main schema resource at '%s'",
213175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ctxt->URL, NULL);
213185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
213195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
213205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, NULL,
213215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Failed to locate the main schema resource",
213225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL);
213235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
213245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
213255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Then do the parsing for good. */
213265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
213275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
213285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->nberrors != 0)
213295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
213305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mainSchema->doc = bucket->doc;
213325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mainSchema->preserve = ctxt->preserve;
213335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->schema = mainSchema;
213355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
213375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
213385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
213405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: This is not nice, since we cannot distinguish from the
213415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * result if there was an internal error or not.
213425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
213435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
213445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->nberrors != 0) {
213455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (mainSchema) {
213465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFree(mainSchema);
213475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    mainSchema = NULL;
213485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
213495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->constructor) {
213505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaConstructionCtxtFree(ctxt->constructor);
213515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->constructor = NULL;
213525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->ownsConstructor = 0;
213535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
213545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
213555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->schema = NULL;
213565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(mainSchema);
213575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
213585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
213595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Quite verbose, but should catch internal errors, which were
213605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * not communitated.
213615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
213625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mainSchema) {
213635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFree(mainSchema);
213645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	mainSchema = NULL;
213655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
213665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->constructor) {
213675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaConstructionCtxtFree(ctxt->constructor);
213685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->constructor = NULL;
213695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->ownsConstructor = 0;
213705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
213715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PERROR_INT2("xmlSchemaParse",
213725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"An internal error occured");
213735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->schema = NULL;
213745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
213755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
213765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
213785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSetParserErrors:
213795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
213805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err:  the error callback
213815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn:  the warning callback
213825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  contextual data for the callbacks
213835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
213845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the callback functions used to handle errors for a validation context
213855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
213865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
213875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
213885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         xmlSchemaValidityErrorFunc err,
213895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         xmlSchemaValidityWarningFunc warn, void *ctx)
213905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
213915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
213925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
213935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->error = err;
213945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->warning = warn;
213955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errCtxt = ctx;
213965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->vctxt != NULL)
213975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx);
213985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
213995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
214015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSetParserStructuredErrors:
214025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema parser context
214035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @serror:  the structured error function
214045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context
214055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
214065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the structured error callback
214075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
214085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
214095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
214105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlStructuredErrorFunc serror,
214115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   void *ctx)
214125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
214135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
214145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
214155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->serror = serror;
214165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errCtxt = ctx;
214175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->vctxt != NULL)
214185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx);
214195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
214205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
214225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetParserErrors:
214235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a XMl-Schema parser context
214245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error callback result
214255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning callback result
214265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: contextual data for the callbacks result
214275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
214285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the callback information used to handle errors for a parser context
214295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
214305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of failure, 0 otherwise
214315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
214325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
214335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
214345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaValidityErrorFunc * err,
214355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 xmlSchemaValidityWarningFunc * warn, void **ctx)
214365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
214375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt == NULL)
214385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
214395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (err != NULL)
214405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*err = ctxt->error;
214415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (warn != NULL)
214425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*warn = ctxt->warning;
214435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctx != NULL)
214445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*ctx = ctxt->errCtxt;
214455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
214465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
214475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
214495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFacetTypeToString:
214505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the facet type
214515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
214525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert the xmlSchemaTypeType to a char string.
214535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
214545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the char string representation of the facet type if the
214555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     type is a facet and an "Internal Error" string otherwise.
214565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
214575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
214585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFacetTypeToString(xmlSchemaTypeType type)
214595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
214605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
214615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_PATTERN:
214625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "pattern");
214635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
214645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "maxExclusive");
214655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXINCLUSIVE:
214665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "maxInclusive");
214675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MINEXCLUSIVE:
214685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "minExclusive");
214695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MININCLUSIVE:
214705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "minInclusive");
214715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_WHITESPACE:
214725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "whiteSpace");
214735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_ENUMERATION:
214745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "enumeration");
214755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_LENGTH:
214765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "length");
214775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MAXLENGTH:
214785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "maxLength");
214795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_MINLENGTH:
214805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "minLength");
214815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_TOTALDIGITS:
214825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "totalDigits");
214835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_FACET_FRACTIONDIGITS:
214845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (BAD_CAST "fractionDigits");
214855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
214865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
214875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
214885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (BAD_CAST "Internal Error");
214895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
214905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaWhitespaceValueType
214925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type)
214935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
214945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
214955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The normalization type can be changed only for types which are derived
214965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * from xsd:string.
214975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
214985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_BASIC) {
214995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
215005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we assume a whitespace of preserve for anySimpleType.
215015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
215025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((type->builtInType == XML_SCHEMAS_STRING) ||
215035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
215045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_SCHEMA_WHITESPACE_PRESERVE);
215055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (type->builtInType == XML_SCHEMAS_NORMSTRING)
215065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_SCHEMA_WHITESPACE_REPLACE);
215075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
215085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
215095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * For all �atomic� datatypes other than string (and types �derived�
215105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * by �restriction� from it) the value of whiteSpace is fixed to
215115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * collapse
215125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Note that this includes built-in list datatypes.
215135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
215145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_SCHEMA_WHITESPACE_COLLAPSE);
215155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
215165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_LIST(type)) {
215175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
215185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* For list types the facet "whiteSpace" is fixed to "collapse".
215195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
215205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMA_WHITESPACE_COLLAPSE);
215215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type)) {
215225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (XML_SCHEMA_WHITESPACE_UNKNOWN);
215235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_ATOMIC(type)) {
215245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
215255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMA_WHITESPACE_PRESERVE);
215265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
215275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMA_WHITESPACE_REPLACE);
215285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
215295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (XML_SCHEMA_WHITESPACE_COLLAPSE);
215305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
215315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
215325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
215355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
215365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Simple type validation				*
215375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
215385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
215395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
215425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
215435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			DOM Validation code				*
215445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
215455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
215465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
215485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAssembleByLocation:
215495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pctxt:  a schema parser context
215505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt:  a schema validation context
215515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: the existing schema
215525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node that fired the assembling
215535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nsName: the namespace name of the new schema
215545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @location: the location of the schema
215555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
215565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expands an existing schema by an additional schema.
215575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
215585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the new schema is correct, a positive error code
215595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of an internal or API error.
215605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
215615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
215625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
215635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSchemaPtr schema,
215645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodePtr node,
215655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const xmlChar *nsName,
215665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const xmlChar *location)
215675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
215685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
215695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaParserCtxtPtr pctxt;
215705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaBucketPtr bucket = NULL;
215715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt == NULL) || (schema == NULL))
215735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
215745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->pctxt == NULL) {
215765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaAssembleByLocation",
215775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no parser context available");
215785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
215795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
215805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt = vctxt->pctxt;
215815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->constructor == NULL) {
215825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PERROR_INT("xmlSchemaAssembleByLocation",
215835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no constructor");
215845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
215855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
215865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
215875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Acquire the schema document.
215885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
215895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
215905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	location, node);
215915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
215925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here;
215935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the process will automatically change this to
215945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document.
215955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
215965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
215975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	location, NULL, NULL, 0, node, NULL, nsName,
215985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&bucket);
215995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
216005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
216015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bucket == NULL) {
216025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
216035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Generate a warning that the document could not be located.
216045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
216055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
216065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node, NULL,
216075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The document at location '%s' could not be acquired",
216085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    location, NULL, NULL);
216095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
216105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
216115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
216125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The first located schema will be handled as if all other
216135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * schemas imported by XSI were imported by this first schema.
216145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
216155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket != NULL) &&
216165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(WXS_CONSTRUCTOR(pctxt)->bucket == NULL))
216175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
216185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
216195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Is this handled like an import? I.e. is it not an error
216205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * if the schema cannot be located?
216215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
216225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket)))
216235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
216245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
216255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We will reuse the parser context for every schema imported
216265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * directly via XSI. So reset the context.
216275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
216285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->nberrors = 0;
216295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->err = 0;
216305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->doc = bucket->doc;
216315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket);
216335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -1) {
216345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->doc = NULL;
216355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit_failure;
216365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
216375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Paranoid error channelling. */
216385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret == 0) && (pctxt->nberrors != 0))
216395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = pctxt->err;
216405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt->nberrors == 0) {
216415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
216425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Only bother to fixup pending components, if there was
216435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* no error yet.
216445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* For every XSI acquired schema (and its sub-schemata) we will
216455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* fixup the components.
216465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
216475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFixupComponents(pctxt, bucket);
216485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = pctxt->err;
216495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
216505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Not nice, but we need somehow to channel the schema parser
216515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* error to the validation context.
216525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
216535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret != 0) && (vctxt->err == 0))
216545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->err = ret;
216555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->nberrors += pctxt->nberrors;
216565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
216575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Add to validation error sum. */
216585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->nberrors += pctxt->nberrors;
216595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
216605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->doc = NULL;
216615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
216625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_failure:
216635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->doc = NULL;
216645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
216655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
216665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttrInfoPtr
216685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
216695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int metaType)
216705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
216715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos == 0)
216725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
216735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
216745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
216755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttrInfoPtr iattr;
216765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < vctxt->nbAttrInfos; i++) {
216785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr = vctxt->attrInfos[i];
216795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->metaType == metaType)
216805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (iattr);
216815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
216825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
216845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
216855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
216865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
216885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAssembleByXSI:
216895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt:  a schema validation context
216905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
216915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expands an existing schema by an additional schema using
216925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute
216935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace
216945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * must be set to 1.
216955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
216965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the new schema is correct, a positive error code
216975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * number otherwise and -1 in case of an internal or API error.
216985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
216995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
217005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
217015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
217025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur, *end;
217035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nsname = NULL, *location;
217045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int count = 0;
217055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
217065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr iattr;
217075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
217095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Parse the value; we will assume an even number of values
217105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to be given (this is how Xerces and XSV work).
217115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
217125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * URGENT TODO: !! This needs to work for both
217135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * @noNamespaceSchemaLocation AND @schemaLocation on the same
217145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * element !!
217155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
217165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
217175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
217185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iattr == NULL)
217195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
217205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
217215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iattr == NULL)
217225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
217235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = iattr->value;
217245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
217255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
217265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Move the string parsing mechanism away from here.
217275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
217285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
217295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
217305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Get the namespace name.
217315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
217325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (IS_BLANK_CH(*cur))
217335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
217345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
217355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
217365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
217375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (end == cur)
217385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
217395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    count++; /* TODO: Don't use the schema's dict. */
217405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
217415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = end;
217425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
217435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
217445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Get the URI.
217455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
217465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur))
217475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
217485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	end = cur;
217495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*end != 0) && (!(IS_BLANK_CH(*end))))
217505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end++;
217515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (end == cur) {
217525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->metaType ==
217535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
217545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
217555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
217565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* If using @schemaLocation then tuples are expected.
217575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* I.e. the namespace name *and* the document's URI.
217585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
217595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
217605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->node, NULL,
217615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The value must consist of tuples: the target namespace "
217625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "name and the document's URI", NULL, NULL, NULL);
217635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
217645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
217655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
217665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	count++; /* TODO: Don't use the schema's dict. */
217675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	location = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
217685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = end;
217695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
217705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->node, nsname, location);
217715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
217725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaAssembleByXSI",
217735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"assembling schemata");
217745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
217755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
217765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (*cur != 0);
217775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
217785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
217795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
217815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
217825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 const xmlChar *prefix)
217835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
217845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->sax != NULL) {
217855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i, j;
217865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaNodeInfoPtr inode;
217875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = vctxt->depth; i >= 0; i--) {
217895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt->elemInfos[i]->nbNsBindings != 0) {
217905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode = vctxt->elemInfos[i];
217915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (j = 0; j < inode->nbNsBindings * 2; j += 2) {
217925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (((prefix == NULL) &&
217935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (inode->nsBindings[j] == NULL)) ||
217945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((prefix != NULL) && xmlStrEqual(prefix,
217955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    inode->nsBindings[j]))) {
217965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
217985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Note that the namespace bindings are already
217995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* in a string dict.
218005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
218015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (inode->nsBindings[j+1]);
218025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
218035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
218045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
218055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
218065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
218075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
218085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->reader != NULL) {
218095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *nsName;
218105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix);
218125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName != NULL) {
218135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *ret;
218145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlDictLookup(vctxt->dict, nsName, -1);
218165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsName);
218175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ret);
218185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
218195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
218205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
218215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
218225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr ns;
218235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->inode->node == NULL) ||
218255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (vctxt->inode->node->doc == NULL)) {
218265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaLookupNamespace",
218275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"no node or node's doc avaliable");
218285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
218295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
218305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = xmlSearchNs(vctxt->inode->node->doc,
218315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->node, prefix);
218325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns != NULL)
218335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ns->href);
218345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
218355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
218365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
218375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
218395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* This one works on the schema of the validation context.
218405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
218415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
218425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
218435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaPtr schema,
218445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlNodePtr node,
218455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  const xmlChar *value,
218465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaValPtr *val,
218475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  int valNeeded)
218485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
218495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
218505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt && (vctxt->schema == NULL)) {
218525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidateNotation",
218535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "a schema is needed on the validation context");
218545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
218555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
218565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlValidateQName(value, 1);
218575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
218585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ret);
218595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
218605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *localName = NULL;
218615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *prefix = NULL;
218625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	localName = xmlSplitQName2(value, &prefix);
218645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prefix != NULL) {
218655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *nsName = NULL;
218665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt != NULL)
218685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix);
218695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (node != NULL) {
218705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix);
218715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ns != NULL)
218725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nsName = ns->href;
218735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
218745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(prefix);
218755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(localName);
218765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (1);
218775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
218785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsName == NULL) {
218795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(prefix);
218805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(localName);
218815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (1);
218825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
218835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) {
218845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((valNeeded) && (val != NULL)) {
218855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName),
218865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						       xmlStrdup(nsName));
218875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (*val == NULL)
218885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = -1;
218895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
218905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
218915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = 1;
218925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prefix);
218935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(localName);
218945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
218955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaGetNotation(schema, value, NULL) != NULL) {
218965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (valNeeded && (val != NULL)) {
218975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (*val) = xmlSchemaNewNOTATIONValue(
218985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			BAD_CAST xmlStrdup(value), NULL);
218995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (*val == NULL)
219005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = -1;
219015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
219025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
219035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (1);
219045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
219055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
219075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
219085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
219105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
219115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar* lname,
219125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar* nsname)
219135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
219145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
219155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lname = xmlDictLookup(vctxt->dict, lname, -1);
219175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (lname == NULL)
219185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
219195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsname != NULL) {
219205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsname = xmlDictLookup(vctxt->dict, nsname, -1);
219215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsname == NULL)
219225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
219235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) {
219255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->nodeQNames->items [i] == lname) &&
219265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (vctxt->nodeQNames->items[i +1] == nsname))
219275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Already there */
219285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(i);
219295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Add new entry. */
219315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = vctxt->nodeQNames->nbItems;
219325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname);
219335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname);
219345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(i);
219355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
219365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
219385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
219395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Validation of identity-constraints (IDC)                            *
219405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
219415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
219425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
219445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAugmentIDC:
219455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @idcDef: the IDC definition
219465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
219475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates an augmented IDC definition item.
219485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
219495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the item, or NULL on internal errors.
219505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
219515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
219525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef,
219535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaValidCtxtPtr vctxt)
219545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
219555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr aidc;
219565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug));
219585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (aidc == NULL) {
219595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaVErrMemory(vctxt,
219605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
219615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL);
219625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
219635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aidc->keyrefDepth = -1;
219655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aidc->def = idcDef;
219665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aidc->next = NULL;
219675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->aidcs == NULL)
219685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->aidcs = aidc;
219695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
219705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	aidc->next = vctxt->aidcs;
219715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->aidcs = aidc;
219725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
219745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Save if we have keyrefs at all.
219755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
219765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->hasKeyrefs == 0) &&
219775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
219785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->hasKeyrefs = 1;
219795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
219805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
219825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaAugmentImportedIDC:
219835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @imported: the imported schema
219845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
219855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates an augmented IDC definition for the imported schema.
219865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
219875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
219885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) {
219895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (imported->schema->idcDef != NULL) {
219905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlHashScan(imported->schema->idcDef ,
219915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlHashScanner) xmlSchemaAugmentIDC, vctxt);
219925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
219935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
219945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
219965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCNewBinding:
219975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @idcDef: the IDC definition of this binding
219985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
219995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new IDC binding.
220005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
220015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new IDC binding, NULL on internal errors.
220025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
220035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaPSVIIDCBindingPtr
220045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
220055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
220065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr ret;
220075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc(
220095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sizeof(xmlSchemaPSVIIDCBinding));
220105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
220115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaVErrMemory(NULL,
220125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "allocating a PSVI IDC binding item", NULL);
220135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
220145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
220155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding));
220165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->definition = idcDef;
220175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
220185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
220195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
220215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCStoreNodeTableItem:
220225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
220235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the IDC node table item
220245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
220255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The validation context is used to store IDC node table items.
220265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * They are stored to avoid copying them if IDC node-tables are merged
220275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with corresponding parent IDC node-tables (bubbling).
220285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
220295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if succeeded, -1 on internal errors.
220305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
220315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
220325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
220335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaPSVIIDCNodePtr item)
220345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
220355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
220365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add to gobal list.
220375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
220385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->idcNodes == NULL) {
220395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
220405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr));
220415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcNodes == NULL) {
220425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
220435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating the IDC node table item list", NULL);
220445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
220455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
220465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeIdcNodes = 20;
220475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
220485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeIdcNodes *= 2;
220495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
220505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
220515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sizeof(xmlSchemaPSVIIDCNodePtr));
220525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcNodes == NULL) {
220535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
220545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"re-allocating the IDC node table item list", NULL);
220555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
220565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
220575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
220585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->idcNodes[vctxt->nbIdcNodes++] = item;
220595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
220615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
220625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
220645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCStoreKey:
220655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
220665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @item: the IDC key
220675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
220685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The validation context is used to store an IDC key.
220695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
220705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if succeeded, -1 on internal errors.
220715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
220725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
220735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
220745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlSchemaPSVIIDCKeyPtr key)
220755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
220765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
220775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add to gobal list.
220785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
220795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->idcKeys == NULL) {
220805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
220815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr));
220825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcKeys == NULL) {
220835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
220845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating the IDC key storage list", NULL);
220855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
220865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
220875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeIdcKeys = 40;
220885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
220895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeIdcKeys *= 2;
220905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
220915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
220925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sizeof(xmlSchemaPSVIIDCKeyPtr));
220935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcKeys == NULL) {
220945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
220955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"re-allocating the IDC key storage list", NULL);
220965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
220975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
220985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
220995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->idcKeys[vctxt->nbIdcKeys++] = key;
221005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
221025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
221035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
221055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCAppendNodeTableItem:
221065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @bind: the IDC binding
221075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ntItem: the node-table item
221085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
221095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Appends the IDC node-table item to the binding.
221105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
221115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and -1 on internal errors.
221125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
221135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
221145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind,
221155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaPSVIIDCNodePtr ntItem)
221165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
221175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bind->nodeTable == NULL) {
221185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind->sizeNodes = 10;
221195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
221205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
221215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bind->nodeTable == NULL) {
221225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(NULL,
221235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating an array of IDC node-table items", NULL);
221245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
221255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
221265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (bind->sizeNodes <= bind->nbNodes) {
221275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind->sizeNodes *= 2;
221285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
221295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRealloc(bind->nodeTable, bind->sizeNodes *
221305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sizeof(xmlSchemaPSVIIDCNodePtr));
221315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bind->nodeTable == NULL) {
221325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(NULL,
221335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"re-allocating an array of IDC node-table items", NULL);
221345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
221355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
221365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
221375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bind->nodeTable[bind->nbNodes++] = ntItem;
221385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
221395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
221405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
221425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCAcquireBinding:
221435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
221445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matcher: the IDC matcher
221455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
221465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Looks up an PSVI IDC binding, for the IDC definition and
221475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the given matcher. If none found, a new one is created
221485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and added to the IDC table.
221495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
221505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an IDC binding or NULL on internal errors.
221515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
221525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaPSVIIDCBindingPtr
221535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
221545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlSchemaIDCMatcherPtr matcher)
221555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
221565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr ielem;
221575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem = vctxt->elemInfos[matcher->depth];
221595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->idcTable == NULL) {
221615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
221625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ielem->idcTable == NULL)
221635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
221645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ielem->idcTable);
221655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
221665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSVIIDCBindingPtr bind = NULL;
221675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind = ielem->idcTable;
221695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
221705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bind->definition == matcher->aidc->def)
221715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(bind);
221725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bind->next == NULL) {
221735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
221745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (bind->next == NULL)
221755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (NULL);
221765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(bind->next);
221775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
221785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind = bind->next;
221795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (bind != NULL);
221805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
221815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
221825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
221835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaItemListPtr
221855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
221865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaIDCMatcherPtr matcher)
221875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
221885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (matcher->targets == NULL)
221895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->targets = xmlSchemaItemListCreate();
221905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(matcher->targets);
221915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
221925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
221945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCFreeKey:
221955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @key: the IDC key
221965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
221975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Frees an IDC key together with its compiled value.
221985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
221995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
222005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key)
222015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
222025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key->val != NULL)
222035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(key->val);
222045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(key);
222055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
222065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
222085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCFreeBinding:
222095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
222105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Frees an IDC binding. Note that the node table-items
222115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are not freed.
222125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
222135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
222145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind)
222155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
222165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bind->nodeTable != NULL)
222175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(bind->nodeTable);
222185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bind->dupls != NULL)
222195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(bind->dupls);
222205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(bind);
222215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
222225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
222245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCFreeIDCTable:
222255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @bind: the first IDC binding in the list
222265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
222275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Frees an IDC table, i.e. all the IDC bindings in the list.
222285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
222295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
222305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind)
222315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
222325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr prev;
222335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (bind != NULL) {
222355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = bind;
222365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind = bind->next;
222375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCFreeBinding(prev);
222385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
222395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
222405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
222425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCFreeMatcherList:
222435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matcher: the first IDC matcher in the list
222445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
222455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Frees a list of IDC matchers.
222465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
222475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
222485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
222495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
222505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr next;
222515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (matcher != NULL) {
222535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = matcher->next;
222545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (matcher->keySeqs != NULL) {
222555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i;
222565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < matcher->sizeKeySeqs; i++)
222575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (matcher->keySeqs[i] != NULL)
222585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(matcher->keySeqs[i]);
222595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(matcher->keySeqs);
222605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
222615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (matcher->targets != NULL) {
222625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
222635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int i;
222645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSVIIDCNodePtr idcNode;
222655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
222665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Node-table items for keyrefs are not stored globally
222675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* to the validation context, since they are not bubbled.
222685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* We need to free them here.
222695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
222705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (i = 0; i < matcher->targets->nbItems; i++) {
222715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    idcNode =
222725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
222735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(idcNode->keys);
222745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(idcNode);
222755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
222765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
222775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaItemListFree(matcher->targets);
222785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
222795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(matcher);
222805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher = next;
222815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
222825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
222835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
222855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCReleaseMatcherList:
222865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
222875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matcher: the first IDC matcher in the list
222885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
222895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Caches a list of IDC matchers for reuse.
222905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
222915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
222925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
222935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaIDCMatcherPtr matcher)
222945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
222955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr next;
222965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (matcher != NULL) {
222985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = matcher->next;
222995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (matcher->keySeqs != NULL) {
223005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i;
223015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
223025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Don't free the array, but only the content.
223035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
223045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < matcher->sizeKeySeqs; i++)
223055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (matcher->keySeqs[i] != NULL) {
223065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(matcher->keySeqs[i]);
223075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    matcher->keySeqs[i] = NULL;
223085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
223095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
223105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (matcher->targets) {
223115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
223125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int i;
223135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSVIIDCNodePtr idcNode;
223145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
223155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Node-table items for keyrefs are not stored globally
223165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* to the validation context, since they are not bubbled.
223175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* We need to free them here.
223185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
223195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (i = 0; i < matcher->targets->nbItems; i++) {
223205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    idcNode =
223215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
223225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(idcNode->keys);
223235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(idcNode);
223245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
223255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
223265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaItemListFree(matcher->targets);
223275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets = NULL;
223285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
223295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->next = NULL;
223305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
223315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Cache the matcher.
223325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
223335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcMatcherCache != NULL)
223345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->nextCached = vctxt->idcMatcherCache;
223355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcMatcherCache = matcher;
223365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher = next;
223385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
223395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
223405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
223425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCAddStateObject:
223435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
223445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matcher: the IDC matcher
223455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sel: the XPath information
223465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent "selector" state object if any
223475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: "selector" or "field"
223485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
223495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates/reuses and activates state objects for the given
223505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XPath information; if the XPath expression consists of unions,
223515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * multiple state objects are created for every unioned expression.
223525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
223535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and -1 on internal errors.
223545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
223555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
223565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
223575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaIDCMatcherPtr matcher,
223585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaIDCSelectPtr sel,
223595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int type)
223605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
223615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr sto;
223625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
223645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Reuse the state objects from the pool.
223655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
223665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStatePool != NULL) {
223675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto = vctxt->xpathStatePool;
223685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->xpathStatePool = sto->next;
223695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto->next = NULL;
223705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
223715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
223725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a new state object.
223735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
223745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj));
223755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto == NULL) {
223765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(NULL,
223775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating an IDC state object", NULL);
223785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
223795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
223805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(sto, 0, sizeof(xmlSchemaIDCStateObj));
223815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
223825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
223835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add to global list.
223845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
223855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates != NULL)
223865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto->next = vctxt->xpathStates;
223875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->xpathStates = sto;
223885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
223905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Free the old xpath validation context.
223915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
223925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sto->xpathCtxt != NULL)
223935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
223945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
223965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a new XPath (pattern) validation context.
223975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
223985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt(
223995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlPatternPtr) sel->xpathComp);
224005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sto->xpathCtxt == NULL) {
224015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaIDCAddStateObject",
224025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "failed to create an XPath validation context");
224035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
224045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
224055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->type = type;
224065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->depth = vctxt->depth;
224075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->matcher = matcher;
224085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->sel = sel;
224095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto->nbHistory = 0;
224105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
224125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "IDC:   STO push '%s'\n",
224135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto->sel->xpath);
224145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
224155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
224165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
224175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
224195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaXPathEvaluate:
224205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
224215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nodeType: the nodeType of the current node
224225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
224235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluates all active XPath state objects.
224245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
224255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of IC "field" state objects which resolved to
224265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this node, 0 if none resolved and -1 on internal errors.
224275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
224285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
224295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
224305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlElementType nodeType)
224315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
224325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr sto, head = NULL, first;
224335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, resolved = 0, depth = vctxt->depth;
224345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates == NULL)
224365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
224375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nodeType == XML_ATTRIBUTE_NODE)
224395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	depth++;
224405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
224415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
224425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *str = NULL;
224435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
224445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "IDC: EVAL on %s, depth %d, type %d\n",
224455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
224465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName), depth, nodeType);
224475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
224485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
224495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
224505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
224515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Process all active XPath state objects.
224525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
224535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first = vctxt->xpathStates;
224545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto = first;
224555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (sto != head) {
224565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
224575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR)
224585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] selector '%s'\n",
224595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->matcher->aidc->def->name, sto->sel->xpath);
224605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
224615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] field '%s'\n",
224625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->matcher->aidc->def->name, sto->sel->xpath);
224635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
224645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nodeType == XML_ELEMENT_NODE)
224655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
224665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName, vctxt->inode->nsName);
224675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
224685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
224695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName, vctxt->inode->nsName);
224705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -1) {
224725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaXPathEvaluate",
224735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlStreamPush()");
224745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
224755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
224765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 0)
224775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_sto;
224785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
224795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Full match.
224805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
224815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
224825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "IDC:     "
224835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "MATCH\n");
224845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
224855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
224865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Register a match in the state object history.
224875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
224885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->history == NULL) {
224895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->history = (int *) xmlMalloc(5 * sizeof(int));
224905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sto->history == NULL) {
224915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaVErrMemory(NULL,
224925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "allocating the state object history", NULL);
224935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
224945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
224955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->sizeHistory = 5;
224965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (sto->sizeHistory <= sto->nbHistory) {
224975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->sizeHistory *= 2;
224985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->history = (int *) xmlRealloc(sto->history,
224995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->sizeHistory * sizeof(int));
225005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sto->history == NULL) {
225015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaVErrMemory(NULL,
225025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "re-allocating the state object history", NULL);
225035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
225045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
225055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
225065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto->history[sto->nbHistory++] = depth;
225075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
225095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "IDC:       push match '%d'\n",
225105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->depth);
225115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
225145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIDCSelectPtr sel;
225155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
225165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Activate state objects for the IDC fields of
225175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the IDC selector.
225185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
225195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
225205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "IDC:     "
225215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"activating field states\n");
225225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sel = sto->matcher->aidc->def->fields;
225245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (sel != NULL) {
225255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
225265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
225275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
225285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sel = sel->next;
225295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
225305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
225315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
225325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * An IDC key node was found by the IDC field.
225335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
225345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
225355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
225365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"IDC:     key found\n");
225375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
225395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Notify that the character value of this node is
225405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * needed.
225415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
225425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (resolved == 0) {
225435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((vctxt->inode->flags &
225445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
225455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
225465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
225475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    resolved++;
225485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
225495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_sto:
225505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->next == NULL) {
225515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
225525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Evaluate field state objects created on this node as well.
225535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
225545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    head = first;
225555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto = vctxt->xpathStates;
225565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
225575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto = sto->next;
225585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
225595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (resolved);
225605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
225635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
225645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlChar **buf,
225655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaPSVIIDCKeyPtr *seq,
225665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int count)
225675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
225685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, res;
225695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *value = NULL;
225705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrdup(BAD_CAST "[");
225725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < count; i++) {
225735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buf = xmlStrcat(*buf, BAD_CAST "'");
225745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val,
225755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type),
225765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    &value);
225775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 0)
225785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST value);
225795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
225805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaFormatIDCKeySequence",
225815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to compute a canonical value");
225825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "???");
225835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
225845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (i < count -1)
225855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "', ");
225865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
225875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *buf = xmlStrcat(*buf, BAD_CAST "'");
225885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value != NULL) {
225895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(value);
225905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value = NULL;
225915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
225925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
225935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buf = xmlStrcat(*buf, BAD_CAST "]");
225945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (BAD_CAST *buf);
225965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
225995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaXPathPop:
226005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
226015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
226025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops all XPath states.
226035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
226045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and -1 on internal errors.
226055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
226065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
226075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
226085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
226095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr sto;
226105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
226115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates == NULL)
226135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
226145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto = vctxt->xpathStates;
226155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
226165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
226175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -1)
226185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
226195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto = sto->next;
226205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (sto != NULL);
226215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
226225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
226235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
226255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaXPathProcessHistory:
226265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
226275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the simple/complex type of the current node if any at all
226285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val: the precompiled value
226295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
226305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes and pops the history items of the IDC state objects.
226315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IDC key-sequences are validated/created on IDC bindings.
226325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
226335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and -1 on internal errors.
226345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
226355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
226365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
226375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int depth)
226385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
226395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCStateObjPtr sto, nextsto;
226405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, matchDepth;
226415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr key = NULL;
226425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL;
226435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates == NULL)
226455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
226465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sto = vctxt->xpathStates;
226475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
226495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
226505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *str = NULL;
226515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
226525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "IDC: BACK on %s, depth %d\n",
226535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
226545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName), vctxt->depth);
226555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
226565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
226575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
226585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
226595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Evaluate the state objects.
226605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
226615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (sto != NULL) {
226625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
226635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == -1) {
226645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaXPathProcessHistory",
226655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlStreamPop()");
226665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
226675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
226685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
226695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "IDC:   stream pop '%s'\n",
226705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->sel->xpath);
226715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
226725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->nbHistory == 0)
226735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto deregister_check;
226745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matchDepth = sto->history[sto->nbHistory -1];
226765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
226785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Only matches at the current depth are of interest.
226795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
226805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (matchDepth != depth) {
226815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto = sto->next;
226825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
226835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
226845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
226855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
226865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: According to
226875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198
226885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *   ... the simple-content of complex types is also allowed.
226895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
226905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_COMPLEX(type)) {
226925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_HAS_SIMPLE_CONTENT(type)) {
226935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
226945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Sanity check for complex types with simple content.
226955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
226965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    simpleType = type->contentTypeDef;
226975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (simpleType == NULL) {
226985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaXPathProcessHistory",
226995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "field resolves to a CT with simple content "
227005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "but the CT is missing the ST definition");
227015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
227025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
227035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
227045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    simpleType = NULL;
227055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
227065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		simpleType = type;
227075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (simpleType == NULL) {
227085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
227095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
227115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Not qualified if the field resolves to a node of non
227125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* simple type.
227135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
227145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST vctxt,
227155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_CVC_IDC, NULL,
227165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST sto->matcher->aidc->def,
227175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The XPath '%s' of a field of %s does evaluate to a node of "
227185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "non-simple type",
227195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sto->sel->xpath,
227205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def));
227215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
227225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->nbHistory--;
227235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto deregister_check;
227245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
227255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((key == NULL) && (vctxt->inode->val == NULL)) {
227275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
227285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Failed to provide the normalized value; maybe
227295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the value was invalid.
227305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
227315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(XML_SCHEMAV_CVC_IDC,
227325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST sto->matcher->aidc->def,
227335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Warning: No precomputed value available, the value "
227345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "was either invalid or something strange happend");
227355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->nbHistory--;
227365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto deregister_check;
227375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
227385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaIDCMatcherPtr matcher = sto->matcher;
227395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSVIIDCKeyPtr *keySeq;
227405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int pos, idx;
227415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
227435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* The key will be anchored on the matcher's list of
227445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* key-sequences. The position in this list is determined
227455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* by the target node's depth relative to the matcher's
227465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* depth of creation (i.e. the depth of the scope element).
227475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
227485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Element        Depth    Pos   List-entries
227495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* <scope>          0              NULL
227505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   <bar>          1              NULL
227515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*     <target/>    2       2      target
227525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   <bar>
227535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                * </scope>
227545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
227555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* The size of the list is only dependant on the depth of
227565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the tree.
227575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* An entry will be NULLed in selector_leave, i.e. when
227585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* we hit the target's
227595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
227605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pos = sto->depth - matcher->depth;
227615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		idx = sto->sel->index;
227625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
227645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create/grow the array of key-sequences.
227655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
227665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (matcher->keySeqs == NULL) {
227675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (pos > 9)
227685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->sizeKeySeqs = pos * 2;
227695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
227705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->sizeKeySeqs = 10;
227715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
227725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlMalloc(matcher->sizeKeySeqs *
227735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(xmlSchemaPSVIIDCKeyPtr *));
227745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (matcher->keySeqs == NULL) {
227755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaVErrMemory(NULL,
227765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "allocating an array of key-sequences",
227775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
227785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(-1);
227795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
227805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    memset(matcher->keySeqs, 0,
227815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->sizeKeySeqs *
227825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(xmlSchemaPSVIIDCKeyPtr *));
227835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (pos >= matcher->sizeKeySeqs) {
227845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int i = matcher->sizeKeySeqs;
227855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    matcher->sizeKeySeqs *= 2;
227875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
227885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlRealloc(matcher->keySeqs,
227895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->sizeKeySeqs *
227905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(xmlSchemaPSVIIDCKeyPtr *));
227915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (matcher->keySeqs == NULL) {
227925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaVErrMemory(NULL,
227935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "reallocating an array of key-sequences",
227945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL);
227955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
227965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
227975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
227985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * The array needs to be NULLed.
227995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * TODO: Use memset?
228005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
228015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (; i < matcher->sizeKeySeqs; i++)
228025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->keySeqs[i] = NULL;
228035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
228045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
228065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Get/create the key-sequence.
228075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
228085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		keySeq = matcher->keySeqs[pos];
228095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (keySeq == NULL) {
228105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto create_sequence;
228115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (keySeq[idx] != NULL) {
228125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
228135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
228145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * cvc-identity-constraint:
228155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 3 For each node in the �target node set� all
228165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * of the {fields}, with that node as the context
228175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * node, evaluate to either an empty node-set or
228185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * a node-set with exactly one member, which must
228195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * have a simple type.
228205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *
228215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * The key was already set; report an error.
228225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
228235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
228245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_IDC, NULL,
228255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST matcher->aidc->def,
228265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The XPath '%s' of a field of %s evaluates to a "
228275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"node-set with more than one member",
228285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sto->sel->xpath,
228295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetIDCDesignation(&str, matcher->aidc->def));
228305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str);
228315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sto->nbHistory--;
228325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto deregister_check;
228335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
228345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto create_key;
228355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)create_sequence:
228375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
228385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create a key-sequence.
228395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
228405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc(
228415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    matcher->aidc->def->nbFields *
228425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sizeof(xmlSchemaPSVIIDCKeyPtr));
228435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (keySeq == NULL) {
228445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaVErrMemory(NULL,
228455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"allocating an IDC key-sequence", NULL);
228465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
228475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
228485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memset(keySeq, 0, matcher->aidc->def->nbFields *
228495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sizeof(xmlSchemaPSVIIDCKeyPtr));
228505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		matcher->keySeqs[pos] = keySeq;
228515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)create_key:
228525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
228535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create a key once per node only.
228545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
228555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (key == NULL) {
228565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc(
228575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(xmlSchemaPSVIIDCKey));
228585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (key == NULL) {
228595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaVErrMemory(NULL,
228605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "allocating a IDC key", NULL);
228615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(keySeq);
228625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			matcher->keySeqs[pos] = NULL;
228635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(-1);
228645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
228655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
228665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Consume the compiled value.
228675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
228685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    key->type = simpleType;
228695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    key->val = vctxt->inode->val;
228705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt->inode->val = NULL;
228715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
228725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Store the key in a global list.
228735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
228745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaIDCStoreKey(vctxt, key) == -1) {
228755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaIDCFreeKey(key);
228765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
228775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
228785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
228795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		keySeq[idx] = key;
228805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
228815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
228825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSVIIDCKeyPtr **keySeq = NULL;
228845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* xmlSchemaPSVIIDCBindingPtr bind; */
228855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSVIIDCNodePtr ntItem;
228865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIDCMatcherPtr matcher;
228875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIDCPtr idc;
228885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaItemListPtr targets;
228895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int pos, i, j, nbKeys;
228905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
228915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Here we have the following scenario:
228925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * An IDC 'selector' state object resolved to a target node,
228935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * during the time this target node was in the
228945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * ancestor-or-self axis, the 'field' state object(s) looked
228955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * out for matching nodes to create a key-sequence for this
228965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * target node. Now we are back to this target node and need
228975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to put the key-sequence, together with the target node
228985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * itself, into the node-table of the corresponding IDC
228995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * binding.
229005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
229015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = sto->matcher;
229025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    idc = matcher->aidc->def;
229035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbKeys = idc->nbFields;
229045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pos = depth - matcher->depth;
229055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
229065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Check if the matcher has any key-sequences at all, plus
229075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * if it has a key-sequence for the current target node.
229085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
229095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((matcher->keySeqs == NULL) ||
229105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(matcher->sizeKeySeqs <= pos)) {
229115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
229125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_key_error;
229135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
229145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_leave;
229155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
229165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    keySeq = &(matcher->keySeqs[pos]);
229185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*keySeq == NULL) {
229195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
229205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_key_error;
229215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
229225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_leave;
229235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
229245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < nbKeys; i++) {
229265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((*keySeq)[i] == NULL) {
229275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
229285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Not qualified, if not all fields did resolve.
229295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
229305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
229315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
229325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* All fields of a "key" IDC must resolve.
229335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
229345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto selector_key_error;
229355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
229365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_leave;
229375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
229385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
229395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
229405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * All fields did resolve.
229415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
229425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
229445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 4.1 If the {identity-constraint category} is unique(/key),
229455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * then no two members of the �qualified node set� have
229465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �key-sequences� whose members are pairwise equal, as
229475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * defined by Equal in [XML Schemas: Datatypes].
229485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
229495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Get the IDC binding from the matcher and check for
229505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * duplicate key-sequences.
229515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
229525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
229535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
229545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
229555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
229565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
229575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(targets->nbItems != 0)) {
229585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
229595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i = 0;
229615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = 0;
229625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
229635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Compare the key-sequences, key by key.
229645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
229655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
229665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bkeySeq =
229675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys;
229685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (j = 0; j < nbKeys; j++) {
229695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ckey = (*keySeq)[j];
229705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			bkey = bkeySeq[j];
229715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
229725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (res == -1) {
229735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return (-1);
229745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if (res == 0) {
229755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
229765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * One of the keys differs, so the key-sequence
229775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * won't be equal; get out.
229785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
229795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
229805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
229815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
229825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (res == 1) {
229835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
229845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Duplicate key-sequence found.
229855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
229865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
229875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
229885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    i++;
229895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (i < targets->nbItems);
229905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (i != targets->nbItems) {
229915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL, *strB = NULL;
229925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
229935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * TODO: Try to report the key-sequence.
229945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
229955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
229965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_IDC, NULL,
229975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			WXS_BASIC_CAST idc,
229985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Duplicate key-sequence %s in %s",
229995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatIDCKeySequence(vctxt, &str,
230005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (*keySeq), nbKeys),
230015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetIDCDesignation(&strB, idc));
230025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str);
230035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(strB);
230045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto selector_leave;
230055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
230065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
230085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Add a node-table item to the IDC binding.
230095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
230105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc(
230115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sizeof(xmlSchemaPSVIIDCNode));
230125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ntItem == NULL) {
230135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaVErrMemory(NULL,
230145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "allocating an IDC node-table item", NULL);
230155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(*keySeq);
230165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*keySeq = NULL;
230175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
230185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode));
230205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
230225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Store the node-table item in a global list.
230235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
230245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
230255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
230265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ntItem);
230275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(*keySeq);
230285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *keySeq = NULL;
230295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
230305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
230315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ntItem->nodeQNameID = -1;
230325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
230335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
230345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Save a cached QName for this node on the IDC node, to be
230355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* able to report it, even if the node is not saved.
230365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
230375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
230385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt->inode->localName, vctxt->inode->nsName);
230395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ntItem->nodeQNameID == -1) {
230405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ntItem);
230415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(*keySeq);
230425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *keySeq = NULL;
230435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
230445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
230455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
230475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Init the node-table item: Save the node, position and
230485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * consume the key-sequence.
230495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
230505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ntItem->node = vctxt->node;
230515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ntItem->nodeLine = vctxt->inode->nodeLine;
230525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ntItem->keys = *keySeq;
230535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *keySeq = NULL;
230545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
230555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1)
230565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
230575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
230585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
230595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
230605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Free the item, since keyref items won't be
230615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * put on a global list.
230625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
230635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ntItem->keys);
230645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ntItem);
230655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
230665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
230675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto selector_leave;
230705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)selector_key_error:
230715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
230725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
230735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
230745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 4.2.1 (KEY) The �target node set� and the
230755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* �qualified node set� are equal, that is, every
230765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* member of the �target node set� is also a member
230775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of the �qualified node set� and vice versa.
230785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
230795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST vctxt,
230805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_CVC_IDC, NULL,
230815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST idc,
230825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Not all fields of %s evaluate to a node",
230835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetIDCDesignation(&str, idc), NULL);
230845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
230855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)selector_leave:
230875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
230885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Free the key-sequence if not added to the IDC table.
230895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
230905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((keySeq != NULL) && (*keySeq != NULL)) {
230915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(*keySeq);
230925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*keySeq = NULL;
230935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
230945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} /* if selector */
230955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sto->nbHistory--;
230975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)deregister_check:
230995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
231005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Deregister state objects if they reach the depth of creation.
231015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
231025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((sto->nbHistory == 0) && (sto->depth == depth)) {
231035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
231045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "IDC:   STO pop '%s'\n",
231055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sto->sel->xpath);
231065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
231075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt->xpathStates != sto) {
231085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaXPathProcessHistory",
231095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The state object to be removed is not the first "
231105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "in the list");
231115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
231125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nextsto = sto->next;
231135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
231145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Unlink from the list of active XPath state objects.
231155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
231165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->xpathStates = sto->next;
231175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto->next = vctxt->xpathStatePool;
231185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
231195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Link it to the pool of reusable state objects.
231205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
231215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->xpathStatePool = sto;
231225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto = nextsto;
231235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
231245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sto = sto->next;
231255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } /* while (sto != NULL) */
231265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
231275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
231285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
231305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIDCRegisterMatchers:
231315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
231325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elemDecl: the element declaration
231335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
231345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates helper objects to evaluate IDC selectors/fields
231355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * successively.
231365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
231375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if OK and -1 on internal errors.
231385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
231395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
231405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
231415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaElementPtr elemDecl)
231425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
231435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr matcher, last = NULL;
231445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCPtr idc, refIdc;
231455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr aidc;
231465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    idc = (xmlSchemaIDCPtr) elemDecl->idcs;
231485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idc == NULL)
231495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
231505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
231525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
231535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *str = NULL;
231545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
231555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "IDC: REGISTER on %s, depth %d\n",
231565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName,
231575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName), vctxt->depth);
231585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
231595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
231605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
231615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->idcMatchers != NULL) {
231625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaIDCRegisterMatchers",
231635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The chain of IDC matchers is expected to be empty");
231645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
231655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
231665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
231675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
231685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
231695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Since IDCs bubbles are expensive we need to know the
231705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * depth at which the bubbles should stop; this will be
231715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the depth of the top-most keyref IDC. If no keyref
231725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * references a key/unique IDC, the keyrefDepth will
231735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * be -1, indicating that no bubbles are needed.
231745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
231755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    refIdc = (xmlSchemaIDCPtr) idc->ref->item;
231765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (refIdc != NULL) {
231775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
231785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Remember that we have keyrefs on this node.
231795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
231805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->hasKeyrefs = 1;
231815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
231825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Lookup the referenced augmented IDC info.
231835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
231845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		aidc = vctxt->aidcs;
231855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (aidc != NULL) {
231865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (aidc->def == refIdc)
231875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
231885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    aidc = aidc->next;
231895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
231905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (aidc == NULL) {
231915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaIDCRegisterMatchers",
231925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Could not find an augmented IDC item for an IDC "
231935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"definition");
231945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
231955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
231965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((aidc->keyrefDepth == -1) ||
231975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (vctxt->depth < aidc->keyrefDepth))
231985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    aidc->keyrefDepth = vctxt->depth;
231995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
232005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Lookup the augmented IDC item for the IDC definition.
232035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	aidc = vctxt->aidcs;
232055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (aidc != NULL) {
232065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (aidc->def == idc)
232075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
232085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    aidc = aidc->next;
232095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (aidc == NULL) {
232115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaIDCRegisterMatchers",
232125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Could not find an augmented IDC item for an IDC definition");
232135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
232145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create an IDC matcher for every IDC definition.
232175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->idcMatcherCache != NULL) {
232195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
232205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Reuse a cached matcher.
232215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
232225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = vctxt->idcMatcherCache;
232235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->idcMatcherCache = matcher->nextCached;
232245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->nextCached = NULL;
232255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
232265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = (xmlSchemaIDCMatcherPtr)
232275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlMalloc(sizeof(xmlSchemaIDCMatcher));
232285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (matcher == NULL) {
232295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaVErrMemory(vctxt,
232305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "allocating an IDC matcher", NULL);
232315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
232325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
232335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memset(matcher, 0, sizeof(xmlSchemaIDCMatcher));
232345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (last == NULL)
232365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->idcMatchers = matcher;
232375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
232385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    last->next = matcher;
232395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	last = matcher;
232405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->type = IDC_MATCHER;
232425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->depth = vctxt->depth;
232435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->aidc = aidc;
232445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher->idcType = aidc->def->type;
232455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC
232465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "IDC:   register matcher\n");
232475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
232485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Init the automaton state object.
232505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaIDCAddStateObject(vctxt, matcher,
232525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
232535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
232545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	idc = idc->next;
232565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (idc != NULL);
232575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
232585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
232595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
232615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
232625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   xmlSchemaNodeInfoPtr ielem)
232635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
232645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr bind;
232655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable;
232665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys;
232675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCNodePtr *targets, *dupls;
232685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
232705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* vctxt->createIDCNodeTables */
232715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (matcher != NULL) {
232725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Skip keyref IDCs and empty IDC target-lists.
232745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
232765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    WXS_ILIST_IS_EMPTY(matcher->targets))
232775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
232785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = matcher->next;
232795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
232805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If we _want_ the IDC node-table to be created in any case
232835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* then do so. Otherwise create them only if keyrefs need them.
232845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! vctxt->createIDCNodeTables) &&
232865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((matcher->aidc->keyrefDepth == -1) ||
232875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (matcher->aidc->keyrefDepth > vctxt->depth)))
232885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
232895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = matcher->next;
232905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
232915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
232925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
232935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Get/create the IDC binding on this element for the IDC definition.
232945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
232955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
232965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! WXS_ILIST_IS_EMPTY(bind->dupls)) {
232985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items;
232995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbDupls = bind->dupls->nbItems;
233005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
233015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dupls = NULL;
233025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbDupls = 0;
233035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
233045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bind->nodeTable != NULL) {
233055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbNodeTable = bind->nbNodes;
233065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
233075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbNodeTable = 0;
233085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
233095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((nbNodeTable == 0) && (nbDupls == 0)) {
233115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
233125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Transfer all IDC target-nodes to the IDC node-table.
233135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
233145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind->nodeTable =
233155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
233165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind->sizeNodes = matcher->targets->sizeItems;
233175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind->nbNodes = matcher->targets->nbItems;
233185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets->items = NULL;
233205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets->sizeItems = 0;
233215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets->nbItems = 0;
233225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
233235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
233245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Compare the key-sequences and add to the IDC node-table.
233255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
233265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbTargets = matcher->targets->nbItems;
233275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
233285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbFields = matcher->aidc->def->nbFields;
233295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i = 0;
233305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
233315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		keys = targets[i]->keys;
233325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nbDupls) {
233335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
233345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Search in already found duplicates first.
233355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
233365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    j = 0;
233375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    do {
233385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (nbFields == 1) {
233395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    res = xmlSchemaAreValuesEqual(keys[0]->val,
233405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				dupls[j]->keys[0]->val);
233415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == -1)
233425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
233435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == 1) {
233445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
233455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* Equal key-sequence.
233465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
233475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto next_target;
233485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
233495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
233505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    res = 0;
233515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ntkeys = dupls[j]->keys;
233525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    for (k = 0; k < nbFields; k++) {
233535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				res = xmlSchemaAreValuesEqual(keys[k]->val,
233545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ntkeys[k]->val);
233555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (res == -1)
233565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto internal_error;
233575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (res == 0) {
233585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    /*
233595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    * One of the keys differs.
233605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    */
233615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
233625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
233635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
233645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == 1) {
233655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
233665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* Equal key-sequence found.
233675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
233685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto next_target;
233695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
233705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
233715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			j++;
233725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } while (j < nbDupls);
233735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
233745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nbNodeTable) {
233755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    j = 0;
233765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    do {
233775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (nbFields == 1) {
233785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    res = xmlSchemaAreValuesEqual(keys[0]->val,
233795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				bind->nodeTable[j]->keys[0]->val);
233805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == -1)
233815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
233825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == 0) {
233835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
233845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* The key-sequence differs.
233855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
233865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto next_node_table_entry;
233875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
233885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
233895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    res = 0;
233905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ntkeys = bind->nodeTable[j]->keys;
233915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    for (k = 0; k < nbFields; k++) {
233925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				res = xmlSchemaAreValuesEqual(keys[k]->val,
233935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ntkeys[k]->val);
233945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (res == -1)
233955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto internal_error;
233965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (res == 0) {
233975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    /*
233985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    * One of the keys differs.
233995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    */
234005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto next_node_table_entry;
234015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
234025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
234035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
234045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
234055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Add the duplicate to the list of duplicates.
234065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
234075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (bind->dupls == NULL) {
234085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    bind->dupls = xmlSchemaItemListCreate();
234095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (bind->dupls == NULL)
234105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
234115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
234125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1)
234135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
234145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
234155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Remove the duplicate entry from the IDC node-table.
234165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
234175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1];
234185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			bind->nbNodes--;
234195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto next_target;
234215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_node_table_entry:
234235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			j++;
234245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } while (j < nbNodeTable);
234255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
234265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
234275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* If everything is fine, then add the IDC target-node to
234285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the IDC node-table.
234295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
234305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1)
234315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
234325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_target:
234345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i++;
234355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (i < nbTargets);
234365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
234375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher = matcher->next;
234385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
234395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
234405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
234425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
234435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
234445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
234465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaBubbleIDCNodeTables:
234475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth: the current tree depth
234485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
234495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Merges IDC bindings of an element at @depth into the corresponding IDC
234505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * bindings of its parent element. If a duplicate note-table entry is found,
234515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * both, the parent node-table entry and child entry are discarded from the
234525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * node-table of the parent.
234535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
234545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if OK and -1 on internal errors.
234555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
234565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
234575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
234585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
234595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */
234605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */
234615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */
234625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCAugPtr aidc;
234635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j, k, ret = 0, nbFields, oldNum, oldDupls;
234645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bind = vctxt->inode->idcTable;
234665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bind == NULL) {
234675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Fine, no table, no bubbles. */
234685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
234695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
234705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
234725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
234735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Walk all bindings; create new or add to existing bindings.
234745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Remove duplicate key-sequences.
234755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
234765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (bind != NULL) {
234775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls))
234795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_binding;
234805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
234815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Check if the key/unique IDC table needs to be bubbled.
234825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
234835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! vctxt->createIDCNodeTables) {
234845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    aidc = vctxt->aidcs;
234855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
234865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (aidc->def == bind->definition) {
234875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((aidc->keyrefDepth == -1) ||
234885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(aidc->keyrefDepth >= vctxt->depth)) {
234895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto next_binding;
234905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
234915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
234925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
234935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		aidc = aidc->next;
234945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (aidc != NULL);
234955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
234965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parTable != NULL)
234985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parBind = *parTable;
234995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
235005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Search a matching parent binding for the
235015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* IDC definition.
235025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
235035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (parBind != NULL) {
235045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parBind->definition == bind->definition)
235055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
235065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parBind = parBind->next;
235075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
235085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parBind != NULL) {
235105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
235115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Compare every node-table entry of the child node,
235125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * i.e. the key-sequence within, ...
235135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
235145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    oldNum = parBind->nbNodes; /* Skip newly added items. */
235155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
235175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		oldDupls = parBind->dupls->nbItems;
235185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
235195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
235205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		dupls = NULL;
235215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		oldDupls = 0;
235225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
235235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parNodes = parBind->nodeTable;
235255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbFields = bind->definition->nbFields;
235265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < bind->nbNodes; i++) {
235285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = bind->nodeTable[i];
235295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (node == NULL)
235305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
235315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
235325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* ...with every key-sequence of the parent node, already
235335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* evaluated to be a duplicate key-sequence.
235345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
235355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (oldDupls) {
235365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    j = 0;
235375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (j < oldDupls) {
235385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (nbFields == 1) {
235395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlSchemaAreValuesEqual(
235405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				node->keys[0]->val,
235415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				dupls[j]->keys[0]->val);
235425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret == -1)
235435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
235445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret == 0) {
235455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				j++;
235465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				continue;
235475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
235485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
235495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parNode = dupls[j];
235505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    for (k = 0; k < nbFields; k++) {
235515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ret = xmlSchemaAreValuesEqual(
235525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    node->keys[k]->val,
235535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    parNode->keys[k]->val);
235545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (ret == -1)
235555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto internal_error;
235565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (ret == 0)
235575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
235585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
235595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
235605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ret == 1)
235615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* Duplicate found. */
235625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
235635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			j++;
235645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
235655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (j != oldDupls) {
235665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Duplicate found. Skip this entry. */
235675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			continue;
235685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
235695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
235705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
235715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* ... and with every key-sequence of the parent node.
235725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
235735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (oldNum) {
235745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    j = 0;
235755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (j < oldNum) {
235765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parNode = parNodes[j];
235775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (nbFields == 1) {
235785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlSchemaAreValuesEqual(
235795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				node->keys[0]->val,
235805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				parNode->keys[0]->val);
235815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret == -1)
235825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
235835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret == 0) {
235845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				j++;
235855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				continue;
235865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
235875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
235885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    for (k = 0; k < nbFields; k++) {
235895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ret = xmlSchemaAreValuesEqual(
235905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    node->keys[k]->val,
235915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    parNode->keys[k]->val);
235925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (ret == -1)
235935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto internal_error;
235945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (ret == 0)
235955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
235965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
235975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
235985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ret == 1)
235995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* Duplicate found. */
236005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
236015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			j++;
236025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
236035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (j != oldNum) {
236045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
236055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Handle duplicates. Move the duplicate in
236065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* the parent's node-table to the list of
236075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* duplicates.
236085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
236095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			oldNum--;
236105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parBind->nbNodes--;
236115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
236125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Move last old item to pos of duplicate.
236135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
236145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parNodes[j] = parNodes[oldNum];
236155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (parBind->nbNodes != oldNum) {
236175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
236185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * If new items exist, move last new item to
236195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * last of old items.
236205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
236215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parNodes[oldNum] =
236225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				parNodes[parBind->nbNodes];
236235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
236245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (parBind->dupls == NULL) {
236255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parBind->dupls = xmlSchemaItemListCreate();
236265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (parBind->dupls == NULL)
236275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
236285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
236295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaItemListAdd(parBind->dupls, parNode);
236305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
236315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
236325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Add the node-table entry (node and key-sequence) of
236335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* the child node to the node table of the parent node.
236345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
236355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (parBind->nodeTable == NULL) {
236365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
236375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
236385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (parBind->nodeTable == NULL) {
236395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaVErrMemory(NULL,
236405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "allocating IDC list of node-table items", NULL);
236415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
236425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
236435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parBind->sizeNodes = 1;
236445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if (parBind->nbNodes >= parBind->sizeNodes) {
236455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parBind->sizeNodes *= 2;
236465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
236475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
236485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				sizeof(xmlSchemaPSVIIDCNodePtr));
236495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (parBind->nodeTable == NULL) {
236505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaVErrMemory(NULL,
236515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "re-allocating IDC list of node-table items", NULL);
236525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
236535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
236545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
236555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parNodes = parBind->nodeTable;
236565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
236575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Append the new node-table entry to the 'new node-table
236585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* entries' section.
236595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
236605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parNodes[parBind->nbNodes++] = node;
236615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
236625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
236645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
236665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
236675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
236685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * No binding for the IDC was found: create a new one and
236695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * copy all node-tables.
236705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
236715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parBind = xmlSchemaIDCNewBinding(bind->definition);
236725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parBind == NULL)
236735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
236745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
236765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Hmm, how to optimize the initial number of
236775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * allocated entries?
236785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
236795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bind->nbNodes != 0) {
236805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
236815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Add all IDC node-table entries.
236825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
236835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! vctxt->psviExposeIDCNodeTables) {
236845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
236855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Just move the entries.
236865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * NOTE: this is quite save here, since
236875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * all the keyref lookups have already been
236885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * performed.
236895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
236905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->nodeTable = bind->nodeTable;
236915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bind->nodeTable = NULL;
236925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->sizeNodes = bind->sizeNodes;
236935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bind->sizeNodes = 0;
236945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->nbNodes = bind->nbNodes;
236955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bind->nbNodes = 0;
236965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
236975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
236985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Copy the entries.
236995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
237005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
237015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlMalloc(bind->nbNodes *
237025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(xmlSchemaPSVIIDCNodePtr));
237035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (parBind->nodeTable == NULL) {
237045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaVErrMemory(NULL,
237055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "allocating an array of IDC node-table "
237065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "items", NULL);
237075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaIDCFreeBinding(parBind);
237085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
237095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
237105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->sizeNodes = bind->nbNodes;
237115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parBind->nbNodes = bind->nbNodes;
237125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    memcpy(parBind->nodeTable, bind->nodeTable,
237135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr));
237145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
237155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
237165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (bind->dupls) {
237175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
237185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Move the duplicates.
237195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
237205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (parBind->dupls != NULL)
237215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaItemListFree(parBind->dupls);
237225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parBind->dupls = bind->dupls;
237235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bind->dupls = NULL;
237245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
237255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (parTable != NULL) {
237265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (*parTable == NULL)
237275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    *parTable = parBind;
237285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                else {
237295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    parBind->next = *parTable;
237305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    *parTable = parBind;
237315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
237325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
237335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
237345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_binding:
237365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bind = bind->next;
237375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
237385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
237395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
237415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
237425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
237435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
237455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaCheckCVCIDCKeyRef:
237465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
237475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elemDecl: the element declaration
237485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
237495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the cvc-idc-keyref constraints.
237505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
237515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
237525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
237535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
237545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaIDCMatcherPtr matcher;
237555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPSVIIDCBindingPtr bind;
237565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matcher = vctxt->inode->idcMatchers;
237585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
237595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Find a keyref.
237605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
237615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (matcher != NULL) {
237625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
237635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets &&
237645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher->targets->nbItems)
237655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
237665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int i, j, k, res, nbFields, hasDupls;
237675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSVIIDCKeyPtr *refKeys, *keys;
237685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaPSVIIDCNodePtr refNode = NULL;
237695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbFields = matcher->aidc->def->nbFields;
237715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
237735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Find the IDC node-table for the referenced IDC key/unique.
237745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
237755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    bind = vctxt->inode->idcTable;
237765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (bind != NULL) {
237775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
237785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    bind->definition)
237795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
237805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bind = bind->next;
237815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
237825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0;
237835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
237845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Search for a matching key-sequences.
237855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
237865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0; i < matcher->targets->nbItems; i++) {
237875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = 0;
237885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		refNode = matcher->targets->items[i];
237895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (bind != NULL) {
237905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    refKeys = refNode->keys;
237915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (j = 0; j < bind->nbNodes; j++) {
237925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			keys = bind->nodeTable[j]->keys;
237935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			for (k = 0; k < nbFields; k++) {
237945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    res = xmlSchemaAreValuesEqual(keys[k]->val,
237955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				refKeys[k]->val);
237965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == 0)
237975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				break;
237985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    else if (res == -1) {
237995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				return (-1);
238005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
238015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
238025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (res == 1) {
238035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
238045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * Match found.
238055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
238065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
238075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
238085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
238095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((res == 0) && hasDupls) {
238105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
238115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Search in duplicates
238125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
238135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			for (j = 0; j < bind->dupls->nbItems; j++) {
238145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    keys = ((xmlSchemaPSVIIDCNodePtr)
238155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				bind->dupls->items[j])->keys;
238165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    for (k = 0; k < nbFields; k++) {
238175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				res = xmlSchemaAreValuesEqual(keys[k]->val,
238185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    refKeys[k]->val);
238195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (res == 0)
238205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
238215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				else if (res == -1) {
238225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    return (-1);
238235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
238245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
238255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (res == 1) {
238265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
238275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* Match in duplicates found.
238285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
238295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlChar *str = NULL, *strB = NULL;
238305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlSchemaKeyrefErr(vctxt,
238315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    XML_SCHEMAV_CVC_IDC, refNode,
238325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (xmlSchemaTypePtr) matcher->aidc->def,
238335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "More than one match found for "
238345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "key-sequence %s of keyref '%s'",
238355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaFormatIDCKeySequence(vctxt, &str,
238365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					refNode->keys, nbFields),
238375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlSchemaGetComponentQName(&strB,
238385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					matcher->aidc->def));
238395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				FREE_AND_NULL(str);
238405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				FREE_AND_NULL(strB);
238415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				break;
238425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
238435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
238445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
238455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
238465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (res == 0) {
238485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL, *strB = NULL;
238495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaKeyrefErr(vctxt,
238505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_IDC, refNode,
238515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaTypePtr) matcher->aidc->def,
238525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"No match found for key-sequence %s of keyref '%s'",
238535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatIDCKeySequence(vctxt, &str,
238545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    refNode->keys, nbFields),
238555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
238565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str);
238575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(strB);
238585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
238595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
238605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
238615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	matcher = matcher->next;
238625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
238635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: Return an error if any error encountered. */
238645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
238655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
238665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
238685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
238695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			XML Reader validation code                      *
238705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
238715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
238725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaAttrInfoPtr
238745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
238755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
238765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr iattr;
238775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
238785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Grow/create list of attribute infos.
238795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
238805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->attrInfos == NULL) {
238815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
238825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(sizeof(xmlSchemaAttrInfoPtr));
238835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeAttrInfos = 1;
238845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->attrInfos == NULL) {
238855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
238865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating attribute info list", NULL);
238875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
238885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
238895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
238905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeAttrInfos++;
238915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
238925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRealloc(vctxt->attrInfos,
238935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr));
238945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->attrInfos == NULL) {
238955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
238965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"re-allocating attribute info list", NULL);
238975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
238985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
238995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
239005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
239015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr->localName != NULL) {
239025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaGetFreshAttrInfo",
239035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"attr info not cleared");
239045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
239055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
239065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr->nodeType = XML_ATTRIBUTE_NODE;
239075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (iattr);
239085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
239095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
239105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create an attribute info.
239115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
239125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iattr = (xmlSchemaAttrInfoPtr)
239135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlMalloc(sizeof(xmlSchemaAttrInfo));
239145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iattr == NULL) {
239155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL);
239165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
239175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
239185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(iattr, 0, sizeof(xmlSchemaAttrInfo));
239195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iattr->nodeType = XML_ATTRIBUTE_NODE;
239205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
239215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (iattr);
239235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
239245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
239265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
239275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNodePtr attrNode,
239285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int nodeLine,
239295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *localName,
239305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *nsName,
239315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int ownedNames,
239325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar *value,
239335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int ownedValue)
239345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
239355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr attr;
239365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr = xmlSchemaGetFreshAttrInfo(vctxt);
239385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
239395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaPushAttribute",
239405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaGetFreshAttrInfo()");
239415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
239425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
239435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->node = attrNode;
239445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->nodeLine = nodeLine;
239455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
239465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->localName = localName;
239475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->nsName = nsName;
239485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ownedNames)
239495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
239505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
239515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Evaluate if it's an XSI attribute.
239525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
239535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsName != NULL) {
239545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlStrEqual(localName, BAD_CAST "nil")) {
239555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
239565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
239575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
239585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(localName, BAD_CAST "type")) {
239595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
239605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
239615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
239625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) {
239635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
239645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
239655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
239665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) {
239675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
239685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
239695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
239705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) {
239715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
239725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
239735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
239745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->value = value;
239755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ownedValue)
239765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
239775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->metaType != 0)
239785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr->state = XML_SCHEMAS_ATTR_META;
239795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
239805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
239815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
239835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaClearElemInfo:
239845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the WXS validation context
239855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ielem: the element information item
239865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
239875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
239885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
239895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaNodeInfoPtr ielem)
239905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
239915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->hasKeyrefs = 0;
239925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->appliedXPath = 0;
239935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
239945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(ielem->localName);
239955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(ielem->nsName);
239965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
239975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->localName = NULL;
239985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->nsName = NULL;
239995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
240015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(ielem->value);
240025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
240035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->value = NULL;
240045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->val != NULL) {
240065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
240075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* PSVI TODO: Be careful not to free it when the value is
240085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* exposed via PSVI.
240095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
240105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(ielem->val);
240115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->val = NULL;
240125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->idcMatchers != NULL) {
240145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
240155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* REVISIT OPTIMIZE TODO: Use a pool of IDC matchers.
240165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   Does it work?
240175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
240185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
240195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
240205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
240215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
240225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->idcMatchers = NULL;
240235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->idcTable != NULL) {
240255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
240265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* OPTIMIZE TODO: Use a pool of IDC tables??.
240275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
240285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCFreeIDCTable(ielem->idcTable);
240295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->idcTable = NULL;
240305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->regexCtxt != NULL) {
240325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegFreeExecCtxt(ielem->regexCtxt);
240335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->regexCtxt = NULL;
240345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ielem->nsBindings != NULL) {
240365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree((xmlChar **)ielem->nsBindings);
240375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->nsBindings = NULL;
240385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->nbNsBindings = 0;
240395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ielem->sizeNsBindings = 0;
240405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
240425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
240445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetFreshElemInfo:
240455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vctxt: the schema validation context
240465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
240475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates/reuses and initializes the element info item for
240485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the currect tree depth.
240495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
240505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the element info item or NULL on API or internal errors.
240515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
240525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaNodeInfoPtr
240535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
240545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
240555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr info = NULL;
240565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth > vctxt->sizeElemInfos) {
240585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaGetFreshElemInfo",
240595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "inconsistent depth encountered");
240605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
240615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
240625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->elemInfos == NULL) {
240635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
240645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr));
240655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->elemInfos == NULL) {
240665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
240675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating the element info array", NULL);
240685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
240695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
240705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr));
240715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeElemInfos = 10;
240725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->sizeElemInfos <= vctxt->depth) {
240735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i = vctxt->sizeElemInfos;
240745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeElemInfos *= 2;
240765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
240775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
240785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sizeof(xmlSchemaNodeInfoPtr));
240795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->elemInfos == NULL) {
240805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
240815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"re-allocating the element info array", NULL);
240825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
240835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
240845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
240855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We need the new memory to be NULLed.
240865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: Use memset instead?
240875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
240885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (; i < vctxt->sizeElemInfos; i++)
240895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->elemInfos[i] = NULL;
240905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
240915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	info = vctxt->elemInfos[vctxt->depth];
240925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (info == NULL) {
240945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	info = (xmlSchemaNodeInfoPtr)
240955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlMalloc(sizeof(xmlSchemaNodeInfo));
240965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (info == NULL) {
240975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaVErrMemory(vctxt,
240985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating an element info", NULL);
240995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
241005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
241015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->elemInfos[vctxt->depth] = info;
241025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
241035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (info->localName != NULL) {
241045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaGetFreshElemInfo",
241055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"elem info has not been cleared");
241065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
241075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
241085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
241095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(info, 0, sizeof(xmlSchemaNodeInfo));
241105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->nodeType = XML_ELEMENT_NODE;
241115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->depth = vctxt->depth;
241125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (info);
241145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
241155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
241175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
241185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
241195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
241215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
241225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNodePtr node,
241235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaTypePtr type,
241245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaValType valType,
241255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar * value,
241265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaValPtr val,
241275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			unsigned long length,
241285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int fireErrors)
241295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
241305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret, error = 0;
241315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr tmpType;
241335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetLinkPtr facetLink;
241345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaFacetPtr facet;
241355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long len = 0;
241365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWhitespaceValueType ws;
241375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
241395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * In Libxml2, derived built-in types have currently no explicit facets.
241405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
241415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->type == XML_SCHEMA_TYPE_BASIC)
241425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
241435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
241455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: Do not jump away, if the facetSet of the given type is
241465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * empty: until now, "pattern" and "enumeration" facets of the
241475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * *base types* need to be checked as well.
241485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
241495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->facetSet == NULL)
241505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto pattern_and_enum;
241515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_ATOMIC(type)) {
241535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_LIST(type))
241545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto WXS_IS_LIST;
241555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
241565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto pattern_and_enum;
241575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
241585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
241595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Whitespace handling is only of importance for string-based
241605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * types.
241615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
241625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmpType = xmlSchemaGetPrimitiveType(type);
241635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
241645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
241655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ws = xmlSchemaGetWhiteSpaceFacetValue(type);
241665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
241675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
241685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
241695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If the value was not computed (for string or
241705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * anySimpleType based types), then use the provided
241715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * type.
241725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
241735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val == NULL)
241745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	valType = valType;
241755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
241765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	valType = xmlSchemaGetValType(val);
241775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = 0;
241795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (facetLink = type->facetSet; facetLink != NULL;
241805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facetLink = facetLink->next) {
241815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
241825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Skip the pattern "whiteSpace": it is used to
241835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* format the character content beforehand.
241845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
241855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (facetLink->facet->type) {
241865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_WHITESPACE:
241875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_PATTERN:
241885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_ENUMERATION:
241895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
241905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_LENGTH:
241915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINLENGTH:
241925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXLENGTH:
241935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
241945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    valType, value, val, &len, ws);
241955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
241965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
241975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
241985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    valType, value, val, ws);
241995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
242005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
242015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
242025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    AERROR_INT("xmlSchemaValidateFacets",
242035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"validating against a atomic type facet");
242045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
242055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret > 0) {
242065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (fireErrors)
242075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetErr(actxt, ret, node,
242085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value, len, type, facetLink->facet, NULL, NULL, NULL);
242095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
242105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (ret);
242115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (error == 0)
242125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		error = ret;
242135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
242145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = 0;
242155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
242165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WXS_IS_LIST:
242185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! WXS_IS_LIST(type))
242195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto pattern_and_enum;
242205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
242215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "length", "minLength" and "maxLength" of list types.
242225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
242235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = 0;
242245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (facetLink = type->facetSet; facetLink != NULL;
242255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facetLink = facetLink->next) {
242265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (facetLink->facet->type) {
242285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_LENGTH:
242295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MINLENGTH:
242305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_FACET_MAXLENGTH:
242315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
242325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    value, length, NULL);
242335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
242345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
242355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
242365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
242375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
242385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    AERROR_INT("xmlSchemaValidateFacets",
242395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"validating against a list type facet");
242405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
242415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret > 0) {
242425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (fireErrors)
242435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetErr(actxt, ret, node,
242445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value, length, type, facetLink->facet, NULL, NULL, NULL);
242455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
242465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (ret);
242475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (error == 0)
242485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		error = ret;
242495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
242505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = 0;
242515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
242525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pattern_and_enum:
242545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (error >= 0) {
242555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int found = 0;
242565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
242575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Process enumerations. Facet values are in the value space
242585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the defining type's base type. This seems to be a bug in the
242595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* XML Schema 1.0 spec. Use the whitespace type of the base type.
242605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Only the first set of enumerations in the ancestor-or-self axis
242615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* is used for validation.
242625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
242635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = 0;
242645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmpType = type;
242655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
242665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (facet = tmpType->facets; facet != NULL; facet = facet->next) {
242675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
242685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
242695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		found = 1;
242705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaAreValuesEqual(facet->val, val);
242715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == 1)
242725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
242735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (ret < 0) {
242745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaValidateFacets",
242755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating against an enumeration facet");
242765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
242775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
242785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
242795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0)
242805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
242815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
242825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Break on the first set of enumerations. Any additional
242835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  enumerations which might be existent on the ancestors
242845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  of the current type are restricted by this set; thus
242855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *  *must* *not* be taken into account.
242865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
242875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (found)
242885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
242895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpType = tmpType->baseType;
242905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while ((tmpType != NULL) &&
242915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (tmpType->type != XML_SCHEMA_TYPE_BASIC));
242925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (found && (ret == 0)) {
242935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_ENUMERATION_VALID;
242945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (fireErrors) {
242955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFacetErr(actxt, ret, node,
242965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    value, 0, type, NULL, NULL, NULL, NULL);
242975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
242985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (ret);
242995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (error == 0)
243005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		error = ret;
243015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
243025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
243035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (error >= 0) {
243055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int found;
243065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
243075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Process patters. Pattern facets are ORed at type level
243085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* and ANDed if derived. Walk the base type axis.
243095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
243105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmpType = type;
243115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	facet = NULL;
243125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
243135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 0;
243145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (facetLink = tmpType->facetSet; facetLink != NULL;
243155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		facetLink = facetLink->next) {
243165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
243175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
243185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		found = 1;
243195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
243205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* NOTE that for patterns, @value needs to be the
243215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* normalized vaule.
243225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
243235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlRegexpExec(facetLink->facet->regexp, value);
243245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == 1)
243255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
243265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (ret < 0) {
243275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaValidateFacets",
243285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating against a pattern facet");
243295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
243305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
243315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
243325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Save the last non-validating facet.
243335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
243345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    facet = facetLink->facet;
243355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
243365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
243375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (found && (ret != 1)) {
243385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_PATTERN_VALID;
243395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (fireErrors) {
243405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFacetErr(actxt, ret, node,
243415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value, 0, type, facet, NULL, NULL, NULL);
243425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
243435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (ret);
243445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (error == 0)
243455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    error = ret;
243465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
243475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
243485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpType = tmpType->baseType;
243495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
243505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
243515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (error);
243535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
243545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
243565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNormalizeValue(xmlSchemaTypePtr type,
243575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			const xmlChar *value)
243585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
243595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (xmlSchemaGetWhiteSpaceFacetValue(type)) {
243605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_WHITESPACE_COLLAPSE:
243615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlSchemaCollapseString(value));
243625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_WHITESPACE_REPLACE:
243635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlSchemaWhiteSpaceReplace(value));
243645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
243655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
243665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
243675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
243685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
243705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
243715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar *value,
243725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlSchemaValPtr *val,
243735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       int valNeeded)
243745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
243755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
243765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nsName;
243775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *local, *prefix = NULL;
243785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlValidateQName(value, 1);
243805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0) {
243815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
243825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaValidateQName",
243835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlValidateQName()");
243845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
243855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
243865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1);
243875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
243885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
243895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: xmlSplitQName2 will always return a duplicated
243905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * strings.
243915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
243925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local = xmlSplitQName2(value, &prefix);
243935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (local == NULL)
243945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	local = xmlStrdup(value);
243955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
243965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * OPTIMIZE TODO: Use flags for:
243975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *  - is there any namespace binding?
243985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *  - is there a default namespace?
243995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nsName = xmlSchemaLookupNamespace(vctxt, prefix);
244015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix != NULL) {
244035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(prefix);
244045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
244055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* A namespace must be found if the prefix is
244065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOT NULL.
244075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
244085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName == NULL) {
244095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
244105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL,
244115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
244125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The QName value '%s' has no "
244135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"corresponding namespace declaration in "
244145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"scope", value, NULL);
244155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (local != NULL)
244165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(local);
244175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ret);
244185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
244195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
244205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (valNeeded && val) {
244215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName != NULL)
244225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *val = xmlSchemaNewQNameValue(
244235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST xmlStrdup(nsName), BAD_CAST local);
244245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
244255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *val = xmlSchemaNewQNameValue(NULL,
244265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST local);
244275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
244285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(local);
244295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
244305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
244315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
244335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* cvc-simple-type
244345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
244355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
244365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
244375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNodePtr node,
244385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
244395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     const xmlChar *value,
244405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaValPtr *retVal,
244415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int fireErrors,
244425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int normalize,
244435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int isNormalized)
244445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
244455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, valNeeded = (retVal) ? 1 : 0;
244465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValPtr val = NULL;
244475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlSchemaWhitespaceValueType ws; */
244485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *normValue = NULL;
244495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NORMALIZE(atype) \
244515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! isNormalized) && \
244525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
244535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	normValue = xmlSchemaNormalizeValue(atype, value); \
244545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (normValue != NULL) \
244555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value = normValue; \
244565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	isNormalized = 1; \
244575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
244585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((retVal != NULL) && (*retVal != NULL)) {
244605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(*retVal);
244615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retVal = NULL;
244625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
244635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
244645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 3.14.4 Simple Type Definition Validation Rules
244655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validation Rule: String Valid
244665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
244685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 It is schema-valid with respect to that definition as defined
244695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * by Datatype Valid in [XML Schemas: Datatypes].
244705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
244725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.1 If The definition is ENTITY or is validly derived from ENTITY given
244735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then
244745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the string must be a �declared entity name�.
244755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
244775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES
244785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6),
244795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * then every whitespace-delimited substring of the string must be a �declared
244805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * entity name�.
244815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
244835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.3 otherwise no further condition applies.
244845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
244855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
244865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	valNeeded = 1;
244875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
244885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	value = BAD_CAST "";
244895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) {
244905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr biType; /* The built-in type. */
244915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
244925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (1.2.1) "if {variety} is �atomic� then the string must �match�
244935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* a literal in the �lexical space� of {base type definition}"
244945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
244955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
244965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Whitespace-normalize.
244975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
244985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NORMALIZE(type);
244995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type->type != XML_SCHEMA_TYPE_BASIC) {
245005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
245015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Get the built-in type.
245025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
245035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    biType = type->baseType;
245045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((biType != NULL) &&
245055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(biType->type != XML_SCHEMA_TYPE_BASIC))
245065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		biType = biType->baseType;
245075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (biType == NULL) {
245095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
245105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "could not get the built-in type");
245115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
245125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
245135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
245145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    biType = type;
245155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
245165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTATIONs need to be processed here, since they need
245175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to lookup in the hashtable of NOTATION declarations of the schema.
245185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
245195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
245205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (biType->builtInType) {
245215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_NOTATION:
245225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaValidateNotation(
245235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlSchemaValidCtxtPtr) actxt,
245245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaValidCtxtPtr) actxt)->schema,
245255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, value, &val, valNeeded);
245265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
245275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_QNAME:
245285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
245295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value, &val, valNeeded);
245305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
245315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
245325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
245335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (valNeeded)
245345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
245355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    value, &val, node);
245365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
245375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
245385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    value, NULL, node);
245395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
245405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
245415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
245425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (biType->builtInType) {
245435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_SCHEMAS_NOTATION:
245445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaValidateNotation(NULL,
245455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlSchemaParserCtxtPtr) actxt)->schema, node,
245465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			value, &val, valNeeded);
245475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
245485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
245495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
245505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (valNeeded)
245515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
245525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    value, &val, node);
245535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
245545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
245555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    value, NULL, node);
245565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
245575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
245585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
245595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
245605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Validation via a public API is not implemented yet.
245615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
245625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TODO
245635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
245645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
245655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
245665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
245675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
245685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "validating against a built-in type");
245695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
245705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
245715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_LIST(type))
245725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
245735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
245745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
245755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
245765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
245775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
245785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Check facets.
245795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
245805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidateFacets(actxt, node, type,
245815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValType) biType->builtInType, value, val,
245825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		0, fireErrors);
245835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
245845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
245855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
245865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating facets of atomic simple type");
245875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
245885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
245895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_IS_LIST(type))
245905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
245915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
245925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
245935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
245945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
245955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fireErrors && (ret > 0))
245965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
245975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_LIST(type)) {
245985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypePtr itemType;
246005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *cur, *end;
246015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *tmpValue = NULL;
246025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unsigned long len = 0;
246035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaValPtr prevVal = NULL, curVal = NULL;
246045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* 1.2.2 if {variety} is �list� then the string must be a sequence
246055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of white space separated tokens, each of which �match�es a literal
246065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* in the �lexical space� of {item type definition}
246075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
246085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
246095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if
246105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the list type has an enum or pattern facet.
246115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
246125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NORMALIZE(type);
246135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
246145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* VAL TODO: Optimize validation of empty values.
246155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* VAL TODO: We do not have computed values for lists.
246165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
246175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	itemType = WXS_LIST_ITEMTYPE(type);
246185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = value;
246195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
246205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (IS_BLANK_CH(*cur))
246215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
246225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    end = cur;
246235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
246245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		end++;
246255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (end == cur)
246265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
246275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpValue = xmlStrndup(cur, end - cur);
246285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    len++;
246295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
246305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (valNeeded)
246315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
246325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmpValue, &curVal, fireErrors, 0, 1);
246335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
246345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
246355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmpValue, NULL, fireErrors, 0, 1);
246365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(tmpValue);
246375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (curVal != NULL) {
246385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
246395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Add to list of computed values.
246405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
246415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (val == NULL)
246425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    val = curVal;
246435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
246445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaValueAppend(prevVal, curVal);
246455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prevVal = curVal;
246465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curVal = NULL;
246475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
246485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
246495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
246505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
246515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating an item of list simple type");
246525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
246535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
246545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
246555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
246565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
246575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = end;
246585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (*cur != 0);
246595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(tmpValue);
246605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
246615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
246625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Apply facets (pattern, enumeration).
246635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
246645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidateFacets(actxt, node, type,
246655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_UNKNOWN, value, val,
246665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		len, fireErrors);
246675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
246685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
246695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
246705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating facets of list simple type");
246715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
246725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
246735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
246745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
246755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
246765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fireErrors && (ret > 0)) {
246775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
246785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Report the normalized value.
246795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
246805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    normalize = 1;
246815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NORMALIZE(type);
246825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
246835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
246845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_IS_UNION(type)) {
246855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaTypeLinkPtr memberLink;
246865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
246875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: For all datatypes �derived� by �union�  whiteSpace does
246885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* not apply directly; however, the normalization behavior of �union�
246895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* types is controlled by the value of whiteSpace on that one of the
246905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �memberTypes� against which the �union� is successfully validated.
246915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
246925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* This means that the value is normalized by the first validating
246935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* member type, then the facets of the union type are applied. This
246945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* needs changing of the value!
246955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
246965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
246975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
246985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1.2.3 if {variety} is �union� then the string must �match� a
246995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* literal in the �lexical space� of at least one member of
247005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* {member type definitions}
247015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
247025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type);
247035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (memberLink == NULL) {
247045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
247055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"union simple type has no member types");
247065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
247075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
247085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
247095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Always normalize union type values, since we currently
247105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* cannot store the whitespace information with the value
247115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* itself; otherwise a later value-comparison would be
247125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* not possible.
247135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
247145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (memberLink != NULL) {
247155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (valNeeded)
247165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
247175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    memberLink->type, value, &val, 0, 1, 0);
247185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
247195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
247205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    memberLink->type, value, NULL, 0, 1, 0);
247215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret <= 0)
247225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
247235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memberLink = memberLink->next;
247245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
247255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
247265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
247275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
247285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "validating members of union simple type");
247295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
247305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
247315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
247325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
247335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
247345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Apply facets (pattern, enumeration).
247355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
247365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
247375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
247385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The normalization behavior of �union� types is controlled by
247395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the value of whiteSpace on that one of the �memberTypes�
247405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * against which the �union� is successfully validated.
247415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
247425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NORMALIZE(memberLink->type);
247435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidateFacets(actxt, node, type,
247445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAS_UNKNOWN, value, val,
247455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		0, fireErrors);
247465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
247475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
247485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
247495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"validating facets of union simple type");
247505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
247515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
247525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
247535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
247545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
247555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fireErrors && (ret > 0))
247565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
247575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
247585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normValue != NULL)
247605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(normValue);
247615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == 0) {
247625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (retVal != NULL)
247635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *retVal = val;
247645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (val != NULL)
247655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFreeValue(val);
247665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (val != NULL)
247675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(val);
247685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
247695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
247705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normValue != NULL)
247715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(normValue);
247725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (val != NULL)
247735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(val);
247745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
247755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
247765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
247785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
247795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar *value,
247805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar **nsName,
247815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   const xmlChar **localName)
247825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
247835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
247845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nsName == NULL) || (localName == NULL))
247865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
247875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *nsName = NULL;
247885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *localName = NULL;
247895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlValidateQName(value, 1);
247915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -1)
247925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
247935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret > 0) {
247945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
247955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
247965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
247975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
247985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
247995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
248005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *local = NULL;
248015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *prefix;
248025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
248045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: xmlSplitQName2 will return a duplicated
248055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* string.
248065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
248075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	local = xmlSplitQName2(value, &prefix);
248085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (local == NULL)
248095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *localName = xmlDictLookup(vctxt->dict, value, -1);
248105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
248115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *localName = xmlDictLookup(vctxt->dict, local, -1);
248125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(local);
248135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
248145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*nsName = xmlSchemaLookupNamespace(vctxt, prefix);
248165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prefix != NULL) {
248185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prefix);
248195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
248205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * A namespace must be found if the prefix is NOT NULL.
248215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
248225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*nsName == NULL) {
248235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST vctxt,
248245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
248255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
248265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The QName value '%s' has no "
248275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "corresponding namespace declaration in scope",
248285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    value, NULL);
248295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (2);
248305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
248315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
248325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
248335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
248345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
248355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
248375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
248385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaAttrInfoPtr iattr,
248395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaTypePtr *localType,
248405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaElementPtr elemDecl)
248415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
248425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
248435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
248445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cvc-elt (3.3.4) : (4)
248455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * AND
248465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema-Validity Assessment (Element) (cvc-assess-elt)
248475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   (1.2.1.2.1) - (1.2.1.2.4)
248485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle 'xsi:type'.
248495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
248505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (localType == NULL)
248515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
248525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *localType = NULL;
248535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iattr == NULL)
248545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
248555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
248565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *nsName = NULL, *local = NULL;
248575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
248585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: We should report a *warning* that the type was overriden
248595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* by the instance.
248605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
248615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ACTIVATE_ATTRIBUTE(iattr);
248625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
248635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (cvc-elt) (3.3.4) : (4.1)
248645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (cvc-assess-elt) (1.2.1.2.2)
248655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
248665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVExpandQName(vctxt, iattr->value,
248675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    &nsName, &local);
248685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
248695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
248705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateElementByDeclaration",
248715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaQNameExpand() to validate the "
248725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "attribute 'xsi:type'");
248735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
248745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
248755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
248765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
248775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
248785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (cvc-elt) (3.3.4) : (4.2)
248795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (cvc-assess-elt) (1.2.1.2.3)
248805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
248815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*localType = xmlSchemaGetType(vctxt->schema, local, nsName);
248825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*localType == NULL) {
248835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *str = NULL;
248845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaCustomErr(ACTXT_CAST vctxt,
248865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAV_CVC_ELT_4_2, NULL,
248875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
248885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"The QName value '%s' of the xsi:type attribute does not "
248895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"resolve to a type definition",
248905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str, nsName, local), NULL);
248915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FREE_AND_NULL(str);
248925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = vctxt->err;
248935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
248945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
248955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elemDecl != NULL) {
248965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int set = 0;
248975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
248995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK)
249005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "The �local type definition� must be validly
249015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * derived from the {type definition} given the union of
249025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the {disallowed substitutions} and the {type definition}'s
249035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {prohibited substitutions}, as defined in
249045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Type Derivation OK (Complex) (�3.4.6)
249055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (if it is a complex type definition),
249065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * or given {disallowed substitutions} as defined in Type
249075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Derivation OK (Simple) (�3.14.6) (if it is a simple type
249085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition)."
249095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
249105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {disallowed substitutions}: the "block" on the element decl.
249115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {prohibited substitutions}: the "block" on the type def.
249125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
249135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
249145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * OPTIMIZE TODO: We could map types already evaluated
249155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to be validly derived from other types to avoid checking
249165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * this over and over for the same types.
249175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
249185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
249195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elemDecl->subtypes->flags &
249205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
249215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= SUBSET_EXTENSION;
249225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
249245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(elemDecl->subtypes->flags &
249255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
249265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		set |= SUBSET_RESTRICTION;
249275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
249295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * REMOVED and CHANGED since this produced a parser context
249305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * which adds to the string dict of the schema. So this would
249315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * change the schema and we don't want this. We don't need
249325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the parser context anymore.
249335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
249345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * if ((vctxt->pctxt == NULL) &&
249355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *	(xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
249365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *	    return (-1);
249375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
249385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
249405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl->subtypes, set) != 0) {
249415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *str = NULL;
249425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST vctxt,
249445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL,
249455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The type definition '%s', specified by xsi:type, is "
249465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "blocked or not validly derived from the type definition "
249475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "of the element declaration",
249485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str,
249495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(*localType)->targetNamespace,
249505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(*localType)->name),
249515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL);
249525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		FREE_AND_NULL(str);
249535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = vctxt->err;
249545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*localType = NULL;
249555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
249565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
249575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
249585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
249595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVATE_ELEM;
249605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
249615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
249625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVATE_ELEM;
249635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
249645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
249655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
249675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
249685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
249695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
249705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr actualType;
249715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
249735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cvc-elt (3.3.4) : 1
249745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
249755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemDecl == NULL) {
249765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL,
249775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No matching declaration available");
249785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (vctxt->err);
249795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
249805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actualType = WXS_ELEM_TYPEDEF(elemDecl);
249815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
249825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cvc-elt (3.3.4) : 2
249835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
249845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
249855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(XML_SCHEMAV_CVC_ELT_2, NULL,
249865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The element declaration is abstract");
249875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (vctxt->err);
249885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
249895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actualType == NULL) {
249905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
249915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    "The type definition is absent");
249925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	return (XML_SCHEMAV_CVC_TYPE_1);
249935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
249945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos != 0) {
249955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
249965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttrInfoPtr iattr;
249975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
249985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* cvc-elt (3.3.4) : 3
249995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Handle 'xsi:nil'.
250005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
250015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
250025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
250035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr) {
250045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_ATTRIBUTE(iattr);
250055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
250065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Validate the value.
250075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
250085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckCVCSimpleType(
250095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ACTXT_CAST vctxt, NULL,
250105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
250115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->value, &(iattr->val), 1, 0, 0);
250125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_ELEM;
250135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
250145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateElemDecl",
250155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVCheckCVCSimpleType() to "
250165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "validate the attribute 'xsi:nil'");
250175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
250185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
250195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == 0) {
250205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
250215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
250225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * cvc-elt (3.3.4) : 3.1
250235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
250245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL,
250255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The element is not 'nillable'");
250265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Does not return an error on purpose. */
250275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
250285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaValueGetAsBoolean(iattr->val)) {
250295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
250305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* cvc-elt (3.3.4) : 3.2.2
250315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
250325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
250335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (elemDecl->value != NULL)) {
250345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL,
250355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"The element cannot be 'nilled' because "
250365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"there is a fixed value constraint defined "
250375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"for it");
250385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     /* Does not return an error on purpose. */
250395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else
250405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    vctxt->inode->flags |=
250415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_SCHEMA_ELEM_INFO_NILLED;
250425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
250435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
250445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
250455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
250465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
250475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* cvc-elt (3.3.4) : 4
250485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Handle 'xsi:type'.
250495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
250505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
250515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
250525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr) {
250535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaTypePtr localType = NULL;
250545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
250565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemDecl);
250575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
250585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == -1) {
250595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaValidateElemDecl",
250605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaProcessXSIType() to "
250615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"process the attribute 'xsi:type'");
250625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
250635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
250645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Does not return an error on purpose. */
250655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
250665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (localType != NULL) {
250675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
250685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		actualType = localType;
250695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
250705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
250715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
250725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
250735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * IDC: Register identity-constraint XPath matchers.
250745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
250755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elemDecl->idcs != NULL) &&
250765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
250775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
250785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
250795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * No actual type definition.
250805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
250815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actualType == NULL) {
250825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
250835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    "The type definition is absent");
250845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	return (XML_SCHEMAV_CVC_TYPE_1);
250855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
250865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
250875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Remember the actual type definition.
250885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
250895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->inode->typeDef = actualType;
250905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
250925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
250935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
250955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
250965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
250975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr iattr;
250985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, i;
250995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
251015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC cvc-type (3.1.1)
251025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * "The attributes of must be empty, excepting those whose namespace
251035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * name is identical to http://www.w3.org/2001/XMLSchema-instance and
251045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * whose local name is one of type, nil, schemaLocation or
251055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * noNamespaceSchemaLocation."
251065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
251075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos == 0)
251085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
251095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < vctxt->nbAttrInfos; i++) {
251105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = vctxt->attrInfos[i];
251115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! iattr->metaType) {
251125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_ATTRIBUTE(iattr)
251135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
251145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL);
251155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_TYPE_3_1_1;
251165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
251175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
251185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVATE_ELEM
251195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
251205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
251215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
251235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Cleanup currently used attribute infos.
251245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
251255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
251265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
251275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
251285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
251295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr attr;
251305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos == 0)
251325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
251335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < vctxt->nbAttrInfos; i++) {
251345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr = vctxt->attrInfos[i];
251355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
251365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->localName != NULL)
251375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *) attr->localName);
251385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->nsName != NULL)
251395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *) attr->nsName);
251405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
251415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
251425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attr->value != NULL)
251435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *) attr->value);
251445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
251455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr->val != NULL) {
251465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFreeValue(attr->val);
251475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr->val = NULL;
251485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
251495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(attr, 0, sizeof(xmlSchemaAttrInfo));
251505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
251515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->nbAttrInfos = 0;
251525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
251535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
251555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 3.4.4 Complex Type Definition Validation Rules
251565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   Element Locally Valid (Complex Type) (cvc-complex-type)
251575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 3.2.4 Attribute Declaration Validation Rules
251585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   Validation Rule: Attribute Locally Valid (cvc-attribute)
251595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   Attribute Locally Valid (Use) (cvc-au)
251605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
251615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Only "assessed" attribute information items will be visible to
251625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes.
251635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
251645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
251655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
251665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
251675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr type = vctxt->inode->typeDef;
251685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListPtr attrUseList;
251695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributeUsePtr attrUse = NULL;
251705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttributePtr attrDecl = NULL;
251715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaAttrInfoPtr iattr, tmpiattr;
251725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j, found, nbAttrs, nbUses;
251735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int xpathRes = 0, res, wildIDs = 0, fixed;
251745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr defAttrOwnerElem = NULL;
251755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
251775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (cvc-attribute)
251785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (1) "The declaration must not be �absent� (see Missing
251795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Sub-components (�5.3) for how this can fail to be
251805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the case)."
251815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (2) "Its {type definition} must not be absent."
251825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
251835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE (1) + (2): This is not handled here, since we currently do not
251845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * allow validation against schemas which have missing sub-components.
251855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
251865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (cvc-complex-type)
251875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (3) "For each attribute information item in the element information
251885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * item's [attributes] excepting those whose [namespace name] is
251895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * identical to http://www.w3.org/2001/XMLSchema-instance and whose
251905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * [local name] is one of type, nil, schemaLocation or
251915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * noNamespaceSchemaLocation, the appropriate case among the following
251925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be true:
251935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
251945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
251955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attrUseList = (xmlSchemaItemListPtr) type->attrUses;
251965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
251975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * @nbAttrs is the number of attributes present in the instance.
251985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
251995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbAttrs = vctxt->nbAttrInfos;
252005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrUseList != NULL)
252015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbUses = attrUseList->nbItems;
252025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
252035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbUses = 0;
252045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < nbUses; i++) {
252055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        found = 0;
252065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attrUse = attrUseList->items[i];
252075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attrDecl = WXS_ATTRUSE_DECL(attrUse);
252085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (j = 0; j < nbAttrs; j++) {
252095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr = vctxt->attrInfos[j];
252105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
252115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type) (3)
252125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Skip meta attributes.
252135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
252145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->metaType)
252155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
252165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->localName[0] != attrDecl->name[0])
252175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
252185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrEqual(iattr->localName, attrDecl->name))
252195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
252205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
252215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
252225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    found = 1;
252235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
252245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type)
252255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.1) "If there is among the {attribute uses} an attribute
252265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * use with an {attribute declaration} whose {name} matches
252275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the attribute information item's [local name] and whose
252285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * {target namespace} is identical to the attribute information
252295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * item's [namespace name] (where an �absent� {target namespace}
252305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * is taken to be identical to a [namespace name] with no value),
252315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * then the attribute information must be �valid� with respect
252325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * to that attribute use as per Attribute Locally Valid (Use)
252335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (�3.5.4). In this case the {attribute declaration} of that
252345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * attribute use is the �context-determined declaration� for the
252355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * attribute information item with respect to Schema-Validity
252365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Assessment (Attribute) (�3.2.4) and
252375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Assessment Outcome (Attribute) (�3.2.5).
252385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
252395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
252405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->use = attrUse;
252415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
252425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Context-determined declaration.
252435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
252445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->decl = attrDecl;
252455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->typeDef = attrDecl->subtypes;
252465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
252475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
252485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (found)
252505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
252515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
252535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
252545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Handle non-existent, required attributes.
252555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
252565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type)
252575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (4) "The {attribute declaration} of each attribute use in
252585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the {attribute uses} whose {required} is true matches one
252595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * of the attribute information items in the element information
252605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * item's [attributes] as per clause 3.1 above."
252615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
252625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
252635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpiattr == NULL) {
252645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT(
252655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "xmlSchemaVAttributesComplex",
252665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaGetFreshAttrInfo()");
252675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
252685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
252695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
252705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->use = attrUse;
252715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->decl = attrDecl;
252725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
252735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((attrUse->defValue != NULL) ||
252745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (attrDecl->defValue != NULL))) {
252755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
252765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Handle non-existent, optional, default/fixed attributes.
252775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
252785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
252795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpiattr == NULL) {
252805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT(
252815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "xmlSchemaVAttributesComplex",
252825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaGetFreshAttrInfo()");
252835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
252845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
252855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
252865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->use = attrUse;
252875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->decl = attrDecl;
252885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->typeDef = attrDecl->subtypes;
252895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->localName = attrDecl->name;
252905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpiattr->nsName = attrDecl->targetNamespace;
252915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
252925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
252935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos == 0)
252955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
252965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
252975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate against the wildcard.
252985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
252995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type->attributeWildcard != NULL) {
253005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
253015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (cvc-complex-type)
253025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (3.2.1) "There must be an {attribute wildcard}."
253035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
253045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < nbAttrs; i++) {
253055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr = vctxt->attrInfos[i];
253065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
253075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type) (3)
253085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Skip meta attributes.
253095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
253105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
253115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
253125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
253135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type)
253145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.2.2) "The attribute information item must be �valid� with
253155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * respect to it as defined in Item Valid (Wildcard) (�3.10.4)."
253165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
253175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC Item Valid (Wildcard) (cvc-wildcard)
253185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "... its [namespace name] must be �valid� with respect to
253195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the wildcard constraint, as defined in Wildcard allows
253205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Namespace Name (�3.10.4)."
253215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
253225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard,
253235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->nsName) == 0) {
253245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
253255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Handle processContents.
253265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*
253275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (cvc-wildcard):
253285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* processContents | context-determined declaration:
253295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "strict"          "mustFind"
253305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "lax"             "none"
253315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "skip"            "skip"
253325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
253335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->attributeWildcard->processContents ==
253345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ANY_SKIP) {
253355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     /*
253365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * context-determined declaration = "skip"
253375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *
253385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC PSVI Assessment Outcome (Attribute)
253395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [validity] = "notKnown"
253405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [validation attempted] = "none"
253415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
253425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
253435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
253445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
253455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
253465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Find an attribute declaration.
253475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
253485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
253495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->localName, iattr->nsName);
253505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->decl != NULL) {
253515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
253525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
253535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC (cvc-complex-type)
253545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * (5) "Let [Definition:]  the wild IDs be the set of
253555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * all attribute information item to which clause 3.2
253565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * applied and whose �validation� resulted in a
253575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * �context-determined declaration� of mustFind or no
253585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * �context-determined declaration� at all, and whose
253595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [local name] and [namespace name] resolve (as
253605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * defined by QName resolution (Instance) (�3.15.4)) to
253615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * an attribute declaration whose {type definition} is
253625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * or is derived from ID. Then all of the following
253635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * must be true:"
253645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
253655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
253665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaIsDerivedFromBuiltInType(
253675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			iattr->typeDef, XML_SCHEMAS_ID)) {
253685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
253695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* SPEC (5.1) "There must be no more than one
253705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* item in �wild IDs�."
253715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
253725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (wildIDs != 0) {
253735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* VAL TODO */
253745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
253755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    TODO
253765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    continue;
253775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
253785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			wildIDs++;
253795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
253805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* SPEC (cvc-complex-type)
253815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* (5.2) "If �wild IDs� is non-empty, there must not
253825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* be any attribute uses among the {attribute uses}
253835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* whose {attribute declaration}'s {type definition}
253845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* is or is derived from ID."
253855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
253865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (attrUseList != NULL) {
253875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            for (j = 0; j < attrUseList->nbItems; j++) {
253885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                if (xmlSchemaIsDerivedFromBuiltInType(
253895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]),
253905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    XML_SCHEMAS_ID)) {
253915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    /* URGENT VAL TODO: implement */
253925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
253935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    TODO
253945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    break;
253955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                }
253965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            }
253975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
253985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
253995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (type->attributeWildcard->processContents ==
254005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAS_ANY_LAX) {
254015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
254025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
254035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * SPEC PSVI Assessment Outcome (Attribute)
254045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [validity] = "notKnown"
254055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [validation attempted] = "none"
254065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
254075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
254085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
254095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
254105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
254115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
254125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
254135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos == 0)
254155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
254165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
254185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Get the owner element; needed for creation of default attributes.
254195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * This fixes bug #341337, reported by David Grohmann.
254205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
254215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
254225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
254235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ielem && ielem->node && ielem->node->doc)
254245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    defAttrOwnerElem = ielem->node;
254255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
254265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
254275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate values, create default attributes, evaluate IDCs.
254285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
254295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < vctxt->nbAttrInfos; i++) {
254305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = vctxt->attrInfos[i];
254315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
254325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* VAL TODO: Note that we won't try to resolve IDCs to
254335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "lax" and "skip" validated attributes. Check what to
254345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* do in this case.
254355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
254365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
254375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
254385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
254395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
254405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* VAL TODO: What to do if the type definition is missing?
254415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
254425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr->typeDef == NULL) {
254435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
254445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
254455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
254465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ACTIVATE_ATTRIBUTE(iattr);
254485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fixed = 0;
254495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xpathRes = 0;
254505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->xpathStates != NULL) {
254525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
254535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Evaluate IDCs.
254545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
254555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xpathRes = xmlSchemaXPathEvaluate(vctxt,
254565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_ATTRIBUTE_NODE);
254575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xpathRes == -1) {
254585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVAttributesComplex",
254595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaXPathEvaluate()");
254605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
254615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
254625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
254635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
254655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
254665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Default/fixed attributes.
254675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We need the value only if we need to resolve IDCs or
254685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * will create default attributes.
254695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
254705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((xpathRes) || (defAttrOwnerElem)) {
254715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->use->defValue != NULL) {
254725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->value = (xmlChar *) iattr->use->defValue;
254735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->val = iattr->use->defVal;
254745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
254755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->value = (xmlChar *) iattr->decl->defValue;
254765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->val = iattr->decl->defVal;
254775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
254785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
254795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* IDCs will consume the precomputed default value,
254805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* so we need to clone it.
254815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
254825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->val == NULL) {
254835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVAttributesComplex",
254845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"default/fixed value on an attribute use was "
254855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"not precomputed");
254865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
254875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
254885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->val = xmlSchemaCopyValue(iattr->val);
254895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->val == NULL) {
254905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVAttributesComplex",
254915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaCopyValue()");
254925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
254935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
254945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
254955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
254965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * PSVI: Add the default attribute to the current element.
254975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * VAL TODO: Should we use the *normalized* value? This currently
254985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *   uses the *initial* value.
254995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
255005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (defAttrOwnerElem) {
255025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *normValue;
255035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		const xmlChar *value;
255045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value = iattr->value;
255065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
255075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Normalize the value.
255085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
255095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		normValue = xmlSchemaNormalizeValue(iattr->typeDef,
255105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->value);
255115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (normValue != NULL)
255125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    value = BAD_CAST normValue;
255135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->nsName == NULL) {
255155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlNewProp(defAttrOwnerElem,
255165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			iattr->localName, value) == NULL) {
255175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaVAttributesComplex",
255185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "callling xmlNewProp()");
255195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (normValue != NULL)
255205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlFree(normValue);
255215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
255225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
255235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
255245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNsPtr ns;
255255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
255275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			defAttrOwnerElem, iattr->nsName);
255285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ns == NULL) {
255295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlChar prefix[12];
255305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			int counter = 0;
255315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
255335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Create a namespace declaration on the validation
255345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* root node if no namespace declaration is in scope.
255355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
255365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			do {
255375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    snprintf((char *) prefix, 12, "p%d", counter++);
255385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ns = xmlSearchNs(defAttrOwnerElem->doc,
255395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				defAttrOwnerElem, BAD_CAST prefix);
255405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (counter > 1000) {
255415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				VERROR_INT(
255425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "xmlSchemaVAttributesComplex",
255435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "could not compute a ns prefix for a "
255445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "default/fixed attribute");
255455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (normValue != NULL)
255465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlFree(normValue);
255475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
255485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
255495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} while (ns != NULL);
255505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = xmlNewNs(vctxt->validationRoot,
255515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    iattr->nsName, BAD_CAST prefix);
255525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
255535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
255545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * TODO:
255555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html
255565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * If we have QNames: do we need to ensure there's a
255575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * prefix defined for the QName?
255585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
255595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value);
255605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
255615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (normValue != NULL)
255625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(normValue);
255635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
255645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
255655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Go directly to IDC evaluation.
255665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
255675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto eval_idcs;
255685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
255695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
255705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Validate the value.
255715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
255725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->value != NULL) {
255735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
255745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Free last computed value; just for safety reasons.
255755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
255765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFreeValue(vctxt->value);
255775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->value = NULL;
255785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
255795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
255805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that the attribute *use* can be unavailable, if
255815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* the attribute was a wild attribute.
255825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
255835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
255845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((iattr->use != NULL) &&
255855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
255865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fixed = 1;
255875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
255885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fixed = 0;
255895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
255905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (cvc-attribute)
255915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (3) "The item's �normalized value� must be locally �valid�
255925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* with respect to that {type definition} as per
255935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* String Valid (�3.14.4)."
255945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
255955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* VAL TODO: Do we already have the
255965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "normalized attribute value" here?
255975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
255985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xpathRes || fixed) {
255995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
256005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
256015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Request a computed value.
256025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
256035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaVCheckCVCSimpleType(
256045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ACTXT_CAST vctxt,
256055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
256065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		1, 1, 0);
256075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
256085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = xmlSchemaVCheckCVCSimpleType(
256095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ACTXT_CAST vctxt,
256105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->node, iattr->typeDef, iattr->value, NULL,
256115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		1, 0, 0);
256125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
256135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
256145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0) {
256155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (res == -1) {
256165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVAttributesComplex",
256175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaStreamValidateSimpleTypeValue()");
256185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
256195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
256205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
256215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
256225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC PSVI Assessment Outcome (Attribute)
256235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * [validity] = "invalid"
256245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
256255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto eval_idcs;
256265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
256275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
256285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fixed) {
256295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
256305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC Attribute Locally Valid (Use) (cvc-au)
256315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "For an attribute information item to be�valid�
256325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * with respect to an attribute use its *normalized*
256335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * value� must match the *canonical* lexical
256345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * representation of the attribute use's {value
256355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * constraint}value, if it is present and fixed."
256365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
256375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * VAL TODO: The requirement for the *canonical* value
256385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * will be removed in XML Schema 1.1.
256395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
256405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
256415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC Attribute Locally Valid (cvc-attribute)
256425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (4) "The item's *actual* value� must match the *value* of
256435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the {value constraint}, if it is present and fixed."
256445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
256455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr->val == NULL) {
256465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* VAL TODO: A value was not precomputed. */
256475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		TODO
256485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto eval_idcs;
256495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
256505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((iattr->use != NULL) &&
256515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(iattr->use->defValue != NULL)) {
256525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->use->defVal == NULL) {
256535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* VAL TODO: A default value was not precomputed. */
256545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TODO
256555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto eval_idcs;
256565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
256575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->vcValue = iattr->use->defValue;
256585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
256595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaCompareValuesWhtsp(attr->val,
256605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaWhitespaceValueType) ws,
256615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attr->use->defVal,
256625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaWhitespaceValueType) ws) != 0) {
256635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
256645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
256655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
256665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
256675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->decl->defVal == NULL) {
256685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* VAL TODO: A default value was not precomputed. */
256695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TODO
256705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto eval_idcs;
256715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
256725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		iattr->vcValue = iattr->decl->defValue;
256735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
256745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlSchemaCompareValuesWhtsp(attr->val,
256755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaWhitespaceValueType) ws,
256765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrDecl->defVal,
256775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlSchemaWhitespaceValueType) ws) != 0) {
256785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
256795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
256805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
256815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
256825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
256835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * [validity] = "valid"
256845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
256855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
256865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)eval_idcs:
256875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
256885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Evaluate IDCs.
256895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
256905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xpathRes) {
256915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaXPathProcessHistory(vctxt,
256925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->depth +1) == -1) {
256935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVAttributesComplex",
256945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaXPathEvaluate()");
256955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
256965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
256975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (vctxt->xpathStates != NULL)
256985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaXPathPop(vctxt);
256995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
257005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
257025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Report errors.
257035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
257045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < vctxt->nbAttrInfos; i++) {
257055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = vctxt->attrInfos[i];
257065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
257075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
257085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
257095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
257105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
257115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ACTIVATE_ATTRIBUTE(iattr);
257125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (iattr->state) {
257135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ATTR_ERR_MISSING: {
257145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *str = NULL;
257155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ACTIVATE_ELEM;
257165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
257175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL,
257185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"The attribute '%s' is required but missing",
257195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaFormatQName(&str,
257205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    iattr->decl->targetNamespace,
257215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    iattr->decl->name),
257225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
257235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FREE_AND_NULL(str)
257245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
257255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
257265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
257275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL,
257285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The type definition is absent");
257295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
257305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
257315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaCustomErr(ACTXT_CAST vctxt,
257325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_CVC_AU, NULL, NULL,
257335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The value '%s' does not match the fixed "
257345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "value constraint '%s'",
257355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    iattr->value, iattr->vcValue);
257365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
257375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
257385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL,
257395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "No matching global attribute declaration available, but "
257405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "demanded by the strict wildcard");
257415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
257425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMAS_ATTR_UNKNOWN:
257435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (iattr->metaType)
257445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
257455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
257465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* MAYBE VAL TODO: One might report different error messages
257475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* for the following errors.
257485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
257495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (type->attributeWildcard == NULL) {
257505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
257515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL);
257525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
257535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
257545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL);
257555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
257565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
257575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
257585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
257595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
257605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
257615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVATE_ELEM;
257635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
257645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
257655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVATE_ELEM;
257665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
257675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
257685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
257705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
257715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int *skip)
257725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
257735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
257745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
257755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The namespace of the element was already identified to be
257765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * matching the wildcard.
257775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
257785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((skip == NULL) || (wild == NULL) ||
257795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(wild->type != XML_SCHEMA_TYPE_ANY)) {
257805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidateElemWildcard",
257815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "bad arguments");
257825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
257835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
257845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *skip = 0;
257855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
257865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
257875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* URGENT VAL TODO: Either we need to position the stream to the
257885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* next sibling, or walk the whole subtree.
257895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
257905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*skip = 1;
257915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
257925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
257935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
257945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaElementPtr decl = NULL;
257955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	decl = xmlSchemaGetElem(vctxt->schema,
257975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->localName, vctxt->inode->nsName);
257985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (decl != NULL) {
257995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->decl = decl;
258005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
258015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
258025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
258035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
258045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* VAL TODO: Change to proper error code. */
258055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */
258065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No matching global element declaration available, but "
258075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "demanded by the strict wildcard");
258085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (vctxt->err);
258095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
258105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos != 0) {
258115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttrInfoPtr iattr;
258125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
258135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC Validation Rule: Schema-Validity Assessment (Element)
258145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (1.2.1.2.1) - (1.2.1.2.3 )
258155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
258165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Use the xsi:type attribute for the type definition.
258175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
258185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
258195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
258205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (iattr != NULL) {
258215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaProcessXSIType(vctxt, iattr,
258225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&(vctxt->inode->typeDef), NULL) == -1) {
258235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateElemWildcard",
258245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaProcessXSIType() to "
258255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "process the attribute 'xsi:nil'");
258265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
258275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
258285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
258295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Don't return an error on purpose.
258305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
258315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
258325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
258335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
258345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
258355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC Validation Rule: Schema-Validity Assessment (Element)
258365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
258375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Fallback to "anyType".
258385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
258395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->inode->typeDef =
258405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
258415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
258425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
258435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
258455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSchemaCheckCOSValidDefault:
258465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
258475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* This will be called if: not nilled, no content and a default/fixed
258485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* value is provided.
258495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
258505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
258525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
258535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      const xmlChar *value,
258545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlSchemaValPtr *val)
258555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
258565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
258575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr inode = vctxt->inode;
258585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
258605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cos-valid-default:
258615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Schema Component Constraint: Element Default Valid (Immediate)
258625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * For a string to be a valid default with respect to a type
258635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * definition the appropriate case among the following must be true:
258645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
258655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if WXS_IS_COMPLEX(inode->typeDef) {
258665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
258675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Complex type.
258685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
258695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.1) "its {content type} must be a simple type definition
258705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* or mixed."
258715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
258725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* type}'s particle must be �emptiable� as defined by
258735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Particle Emptiable (�3.9.6)."
258745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
258755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) &&
258765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) ||
258775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (! WXS_EMPTIABLE(inode->typeDef)))) {
258785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1;
258795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* NOTE that this covers (2.2.2) as well. */
258805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR(ret, NULL,
258815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"For a string to be a valid default, the type definition "
258825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"must be a simple type or a complex type with simple content "
258835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"or mixed content and a particle emptiable");
258845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
258855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
258865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
258875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
258885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1 If the type definition is a simple type definition, then the string
258895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * must be �valid� with respect to that definition as defined by String
258905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Valid (�3.14.4).
258915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
258925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * AND
258935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
258945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2.2.1 If the {content type} is a simple type definition, then the
258955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * string must be �valid� with respect to that simple type definition
258965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * as defined by String Valid (�3.14.4).
258975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
258985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_SIMPLE(inode->typeDef)) {
258995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
259015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, inode->typeDef, value, val, 1, 1, 0);
259025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
259045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
259065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0);
259075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) {
259095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaCheckCOSValidDefault",
259105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaVCheckCVCSimpleType()");
259115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
259135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
259145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
259165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
259175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       const xmlChar * name ATTRIBUTE_UNUSED,
259185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaElementPtr item,
259195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       xmlSchemaNodeInfoPtr inode)
259205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
259215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inode->decl = item;
259225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CONTENT
259235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
259245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *str = NULL;
259255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (item->type == XML_SCHEMA_TYPE_ELEMENT) {
259275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
259285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"AUTOMATON callback for '%s' [declaration]\n",
259295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaFormatQName(&str,
259305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->localName, inode->nsName));
259315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
259325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
259335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "AUTOMATON callback for '%s' [wildcard]\n",
259345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaFormatQName(&str,
259355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    inode->localName, inode->nsName));
259365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
259385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	FREE_AND_NULL(str)
259395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
259415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
259425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
259445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
259455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
259465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
259475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode == NULL) {
259485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidatorPushElem",
259495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaGetFreshElemInfo()");
259505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
259515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->nbAttrInfos = 0;
259535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
259545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
259555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
259575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
259585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaNodeInfoPtr inode,
259595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlSchemaTypePtr type,
259605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     const xmlChar *value)
259615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
259625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
259635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaVCheckCVCSimpleType(
259645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTXT_CAST vctxt, NULL,
259655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type, value, &(inode->val), 1, 1, 0));
259665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
259675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (xmlSchemaVCheckCVCSimpleType(
259685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTXT_CAST vctxt, NULL,
259695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    type, value, NULL, 1, 0, 0));
259705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
259715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
259755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Process END of element.
259765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
259775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
259785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
259795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
259805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
259815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr inode = vctxt->inode;
259825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos != 0)
259845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaClearAttrInfos(vctxt);
259855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
259865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
259875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* This element was not expected;
259885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* we will not validate child elements of broken parents.
259895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Skip validation of all content of the parent.
259905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
259915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->skipDepth = vctxt->depth -1;
259925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto end_elem;
259935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((inode->typeDef == NULL) ||
259955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
259965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
259975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 1. the type definition might be missing if the element was
259985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*    error prone
259995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 2. it might be abstract.
260005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
260015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto end_elem;
260025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
260035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
260045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check the content model.
260055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
260065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
260075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
260085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
260105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Workaround for "anyType".
260115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
260125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
260135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto character_content;
260145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
260165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *values[10];
260175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int terminal, nbval = 10, nbneg;
260185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (inode->regexCtxt == NULL) {
260205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
260215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create the regex context.
260225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
260235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->regexCtxt =
260245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlRegNewExecCtxt(inode->typeDef->contModel,
260255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
260265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt);
260275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (inode->regexCtxt == NULL) {
260285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaValidatorPopElem",
260295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"failed to create a regex context");
260305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
260315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
260325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_AUTOMATA
260335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
260345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "AUTOMATON create on '%s'\n", inode->localName);
260355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
260365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
260375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
260385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Get hold of the still expected content, since a further
260395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * call to xmlRegExecPushString() will loose this information.
260405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
260415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRegExecNextValues(inode->regexCtxt,
260425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&nbval, &nbneg, &values[0], &terminal);
260435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL);
260445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) {
260455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
260465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Still missing something.
260475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
260485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = 1;
260495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->flags |=
260505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
260515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
260525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL,
260535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Missing child element(s)",
260545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nbval, nbneg, values);
260555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_AUTOMATA
260565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
260575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "AUTOMATON missing ERROR on '%s'\n",
260585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    inode->localName);
260595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
260605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
260615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
260625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Content model is satisfied.
260635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
260645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = 0;
260655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_AUTOMATA
260665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
260675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "AUTOMATON succeeded on '%s'\n",
260685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    inode->localName);
260695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
260705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
260715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
260735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
260745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
260755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto end_elem;
260765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)character_content:
260785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->value != NULL) {
260805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValue(vctxt->value);
260815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->value = NULL;
260825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
260835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
260845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check character content.
260855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
260865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->decl == NULL) {
260875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
260885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Speedup if no declaration exists.
260895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
260905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_SIMPLE(inode->typeDef)) {
260915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
260925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode, inode->typeDef, inode->value);
260935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
260945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
260955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode, inode->typeDef->contentTypeDef,
260965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->value);
260975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
260985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
260995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaValidatorPopElem",
261005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlSchemaVCheckCVCSimpleType()");
261015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
261025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
261035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto end_elem;
261045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
261055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
261065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cvc-elt (3.3.4) : 5
261075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The appropriate case among the following must be true:
261085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
261095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
261105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * cvc-elt (3.3.4) : 5.1
261115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If the declaration has a {value constraint},
261125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the item has neither element nor character [children] and
261135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * clause 3.2 has not applied, then all of the following must be true:
261145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
261155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((inode->decl->value != NULL) &&
261165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
261175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(! INODE_NILLED(inode))) {
261185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
261195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* cvc-elt (3.3.4) : 5.1.1
261205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If the �actual type definition� is a �local type definition�
261215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* then the canonical lexical representation of the {value constraint}
261225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* value must be a valid default for the �actual type definition� as
261235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* defined in Element Default Valid (Immediate) (�3.3.6).
261245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
261255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
261265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: 'local' above means types acquired by xsi:type.
261275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* NOTE: Although the *canonical* value is stated, it is not
261285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* relevant if canonical or not. Additionally XML Schema 1.1
261295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* will removed this requirement as well.
261305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
261315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
261325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
261335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaCheckCOSValidDefault(vctxt,
261345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->decl->value, &(inode->val));
261355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
261365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
261375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaValidatorPopElem",
261385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaCheckCOSValidDefault()");
261395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
261405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
261415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto end_elem;
261425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
261435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
261445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Stop here, to avoid redundant validation of the value
261455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (see following).
261465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
261475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto default_psvi;
261485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
261495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
261505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* cvc-elt (3.3.4) : 5.1.2
261515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The element information item with the canonical lexical
261525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* representation of the {value constraint} value used as its
261535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �normalized value� must be �valid� with respect to the
261545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* �actual type definition� as defined by Element Locally Valid (Type)
261555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* (�3.3.4).
261565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
261575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_SIMPLE(inode->typeDef)) {
261585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
261595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode, inode->typeDef, inode->decl->value);
261605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
261615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
261625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode, inode->typeDef->contentTypeDef,
261635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->decl->value);
261645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
261655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
261665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
261675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidatorPopElem",
261685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVCheckCVCSimpleType()");
261695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
261705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
261715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto end_elem;
261725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
261735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
261745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)default_psvi:
261755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
261765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* PSVI: Create a text node on the instance element.
261775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
261785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
261795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (inode->node != NULL)) {
261805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr textChild;
261815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *normValue;
261825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
261835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * VAL TODO: Normalize the value.
261845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
261855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    normValue = xmlSchemaNormalizeValue(inode->typeDef,
261865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode->decl->value);
261875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (normValue != NULL) {
261885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		textChild = xmlNewText(BAD_CAST normValue);
261895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(normValue);
261905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
261915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		textChild = xmlNewText(inode->decl->value);
261925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (textChild == NULL) {
261935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidatorPopElem",
261945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlNewText()");
261955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
261965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
261975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAddChild(inode->node, textChild);
261985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
261995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (! INODE_NILLED(inode)) {
262015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
262025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 5.2.1 The element information item must be �valid� with respect
262035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* to the �actual type definition� as defined by Element Locally
262045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Valid (Type) (�3.3.4).
262055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
262065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (WXS_IS_SIMPLE(inode->typeDef)) {
262075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     /*
262085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-type) (3.1)
262095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "If the type definition is a simple type definition, ..."
262105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (3.1.3) "If clause 3.2 of Element Locally Valid
262115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (Element) (�3.3.4) did not apply, then the �normalized value�
262125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * must be �valid� with respect to the type definition as defined
262135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * by String Valid (�3.14.4).
262145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
262155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
262165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    inode, inode->typeDef, inode->value);
262175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
262185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
262195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-type) (3.2) "If the type definition is a complex type
262205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * definition, then the element information item must be
262215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �valid� with respect to the type definition as per
262225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Element Locally Valid (Complex Type) (�3.4.4);"
262235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *
262245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-complex-type) (2.2)
262255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "If the {content type} is a simple type definition, ...
262265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * the �normalized value� of the element information item is
262275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * �valid� with respect to that simple type definition as
262285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * defined by String Valid (�3.14.4)."
262295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
262305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVCheckINodeDataType(vctxt,
262315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		inode, inode->typeDef->contentTypeDef, inode->value);
262325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
262335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
262345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
262355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidatorPopElem",
262365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVCheckCVCSimpleType()");
262375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
262385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
262395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto end_elem;
262405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
262415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
262425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* 5.2.2 If there is a fixed {value constraint} and clause 3.2 has
262435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* not applied, all of the following must be true:
262445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
262455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((inode->decl->value != NULL) &&
262465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
262475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
262495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: We will need a computed value, when comparison is
262505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * done on computed values.
262515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
262525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
262535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * 5.2.2.1 The element information item must have no element
262545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * information item [children].
262555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
262565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (inode->flags &
262575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
262585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_ELT_5_2_2_1;
262595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(ret, NULL,
262605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "The content must not containt element nodes since "
262615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "there is a fixed value constraint");
262625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto end_elem;
262635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
262645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
262655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* 5.2.2.2 The appropriate case among the following must
262665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* be true:
262675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
262685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) {
262695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
262705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 5.2.2.2.1 If the {content type} of the �actual type
262715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * definition� is mixed, then the *initial value* of the
262725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * item must match the canonical lexical representation
262735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * of the {value constraint} value.
262745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *
262755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * ... the *initial value* of an element information
262765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * item is the string composed of, in order, the
262775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * [character code] of each character information item in
262785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * the [children] of that element information item.
262795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
262805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (! xmlStrEqual(inode->value, inode->decl->value)){
262815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
262825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* VAL TODO: Report invalid & expected values as well.
262835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* VAL TODO: Implement the canonical stuff.
262845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
262855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1;
262865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST vctxt,
262875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret, NULL, NULL,
262885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The initial value '%s' does not match the fixed "
262895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "value constraint '%s'",
262905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    inode->value, inode->decl->value);
262915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto end_elem;
262925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
262935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
262945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
262955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * 5.2.2.2.2 If the {content type} of the �actual type
262965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * definition� is a simple type definition, then the
262975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * *actual value* of the item must match the canonical
262985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * lexical representation of the {value constraint} value.
262995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
263005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
263015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * VAL TODO: *actual value* is the normalized value, impl.
263025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *           this.
263035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * VAL TODO: Report invalid & expected values as well.
263045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * VAL TODO: Implement a comparison with the computed values.
263055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
263065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (! xmlStrEqual(inode->value,
263075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    inode->decl->value)) {
263085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2;
263095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaCustomErr(ACTXT_CAST vctxt,
263105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret, NULL, NULL,
263115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "The actual value '%s' does not match the fixed "
263125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "value constraint '%s'",
263135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    inode->value,
263145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    inode->decl->value);
263155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto end_elem;
263165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
263175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
263185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
263195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
263205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
263215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
263225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)end_elem:
263235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth < 0) {
263245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* TODO: raise error? */
263255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
263265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
263275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth == vctxt->skipDepth)
263285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->skipDepth = -1;
263295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Evaluate the history of XPath state objects.
263315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->appliedXPath &&
263335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
263345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto internal_error;
263355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * MAYBE TODO:
263375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (6) "The element information item must be �valid� with
263385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * respect to each of the {identity-constraint definitions} as per
263395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Identity-constraint Satisfied (�3.11.4)."
263405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * PSVI TODO: If we expose IDC node-tables via PSVI then the tables
263435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   need to be built in any case.
263445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   We will currently build IDC node-tables and bubble them only if
263455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   keyrefs do exist.
263465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
263485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Add the current IDC target-nodes to the IDC node-tables.
263505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((inode->idcMatchers != NULL) &&
263525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
263535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
263545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1)
263555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
263565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
263575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate IDC keyrefs.
263595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->hasKeyrefs)
263615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
263625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
263635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Merge/free the IDC table.
263655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inode->idcTable != NULL) {
263675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_IDC_NODE_TABLE
263685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaDebugDumpIDCTable(stdout,
263695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    inode->nsName,
263705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    inode->localName,
263715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    inode->idcTable);
263725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
263735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->depth > 0) &&
263745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
263755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
263765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
263775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Merge the IDC node table with the table of the parent node.
263785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
263795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
263805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
263815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
263825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
263835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Clear the current ielem.
263855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * VAL TODO: Don't free the PSVI IDC tables if they are
263865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * requested for the PSVI.
263875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaClearElemInfo(vctxt, inode);
263895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Skip further processing if we are on the validation root.
263915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
263925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth == 0) {
263935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->depth--;
263945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode = NULL;
263955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
263965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
263975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
263985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Reset the keyrefDepth if needed.
263995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
264005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->aidcs != NULL) {
264015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
264025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
264035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (aidc->keyrefDepth == vctxt->depth) {
264045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
264055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* A 'keyrefDepth' of a key/unique IDC matches the current
264065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* depth, this means that we are leaving the scope of the
264075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* top-most keyref IDC which refers to this IDC.
264085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
264095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		aidc->keyrefDepth = -1;
264105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
264115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    aidc = aidc->next;
264125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (aidc != NULL);
264135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
264145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->depth--;
264155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->inode = vctxt->elemInfos[vctxt->depth];
264165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
264175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * VAL TODO: 7 If the element information item is the �validation root�, it must be
264185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4).
264195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
264205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
264215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
264235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->err = -1;
264245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
264255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
264265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
264285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 3.4.4 Complex Type Definition Validation Rules
264295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type)
264305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
264315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
264325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
264335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
264345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr pielem;
264355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaTypePtr ptype;
264365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
264375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth <= 0) {
264395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidateChildElem",
264405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "not intended for the validation root");
264415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
264425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
264435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pielem = vctxt->elemInfos[vctxt->depth -1];
264445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
264455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
264465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
264475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle 'nilled' elements.
264485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
264495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (INODE_NILLED(pielem)) {
264505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
264515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC (cvc-elt) (3.3.4) : (3.2.1)
264525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
264535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ACTIVATE_PARENT_ELEM;
264545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAV_CVC_ELT_3_2_1;
264555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(ret, NULL,
264565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Neither character nor element content is allowed, "
264575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "because the element was 'nilled'");
264585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ACTIVATE_ELEM;
264595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto unexpected_elem;
264605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
264615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptype = pielem->typeDef;
264635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
264655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
264665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Workaround for "anyType": we have currently no content model
264675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* assigned for "anyType", so handle it explicitely.
264685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "anyType" has an unbounded, lax "any" wildcard.
264695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
264705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
264715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->localName,
264725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->nsName);
264735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->inode->decl == NULL) {
264755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaAttrInfoPtr iattr;
264765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
264775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process "xsi:type".
264785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3)
264795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
264805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
264815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
264825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iattr != NULL) {
264835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlSchemaProcessXSIType(vctxt, iattr,
264845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &(vctxt->inode->typeDef), NULL);
264855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != 0) {
264865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret == -1) {
264875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaValidateChildElem",
264885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "calling xmlSchemaProcessXSIType() to "
264895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "process the attribute 'xsi:nil'");
264905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
264915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
264925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (ret);
264935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
264945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
264955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 /*
264965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Fallback to "anyType".
264975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 *
264985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * SPEC (cvc-assess-elt)
264995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * "If the item cannot be �strictly assessed�, [...]
265005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * an element information item's schema validity may be laxly
265015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * assessed if its �context-determined declaration� is not
265025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * skip by �validating� with respect to the �ur-type
265035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * definition� as per Element Locally Valid (Type) (�3.3.4)."
265045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
265055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->typeDef =
265065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
265075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
265085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
265095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
265105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
265115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ptype->contentType) {
265135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_CONTENT_EMPTY:
265145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
265155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2.1) "If the {content type} is empty, then the
265165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * element information item has no character or element
265175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * information item [children]."
265185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
265195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_PARENT_ELEM
265205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1;
265215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR(ret, NULL,
265225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Element content is not allowed, "
265235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"because the content type is empty");
265245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_ELEM
265255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto unexpected_elem;
265265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
265275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_CONTENT_MIXED:
265295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_SCHEMA_CONTENT_ELEMENTS: {
265305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRegExecCtxtPtr regexCtxt;
265315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *values[10];
265325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int terminal, nbval = 10, nbneg;
265335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* VAL TODO: Optimized "anyType" validation.*/
265355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ptype->contModel == NULL) {
265375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateChildElem",
265385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "type has elem content but no content model");
265395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
265405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
265415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
265425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Safety belf for evaluation if the cont. model was already
265435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * examined to be invalid.
265445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
265455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
265465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateChildElem",
265475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "validating elem, but elem content is already invalid");
265485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
265495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
265505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    regexCtxt = pielem->regexCtxt;
265525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (regexCtxt == NULL) {
265535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
265545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Create the regex context.
265555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
265565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
265575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
265585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt);
265595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (regexCtxt == NULL) {
265605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaValidateChildElem",
265615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"failed to create a regex context");
265625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return (-1);
265635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
265645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pielem->regexCtxt = regexCtxt;
265655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_AUTOMATA
265665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n",
265675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pielem->localName);
265685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
265705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
265725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC (2.4) "If the {content type} is element-only or mixed,
265735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * then the sequence of the element information item's
265745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * element information item [children], if any, taken in
265755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * order, is �valid� with respect to the {content type}'s
265765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * particle, as defined in Element Sequence Locally Valid
265775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * (Particle) (�3.9.4)."
265785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
265795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlRegExecPushString2(regexCtxt,
265805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName,
265815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->nsName,
265825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode);
265835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_AUTOMATA
265845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0)
265855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
265865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"AUTOMATON push ERROR for '%s' on '%s'\n",
265875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName, pielem->localName);
265885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
265895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
265905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"AUTOMATON push OK for '%s' on '%s'\n",
265915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->localName, pielem->localName);
265925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt->err == XML_SCHEMAV_INTERNAL) {
265945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateChildElem",
265955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlRegExecPushString2()");
265965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
265975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
265985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
265995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg,
266005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    &values[0], &terminal);
266015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
266025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL,
266035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "This element is not expected",
266045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nbval, nbneg, values);
266055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = vctxt->err;
266065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto unexpected_elem;
266075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
266085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = 0;
266095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
266105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
266115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_CONTENT_SIMPLE:
266125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_SCHEMA_CONTENT_BASIC:
266135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_PARENT_ELEM
266145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (WXS_IS_COMPLEX(ptype)) {
266155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
266165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (cvc-complex-type) (2.2)
266175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* "If the {content type} is a simple type definition, then
266185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* the element information item has no element information
266195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* item [children], ..."
266205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
266215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2;
266225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(ret, NULL, "Element content is not allowed, "
266235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "because the content type is a simple type definition");
266245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
266255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
266265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* SPEC (cvc-type) (3.1.2) "The element information item must
266275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* have no element information item [children]."
266285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
266295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = XML_SCHEMAV_CVC_TYPE_3_1_2;
266305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR(ret, NULL, "Element content is not allowed, "
266315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "because the type definition is simple");
266325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
266335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ACTIVATE_ELEM
266345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = vctxt->err;
266355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto unexpected_elem;
266365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
266375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
266395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
266405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
266415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
266425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unexpected_elem:
266435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
266445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Pop this element and set the skipDepth to skip
266455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * all further content of the parent element.
266465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
266475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->skipDepth = vctxt->depth;
266485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
266495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
266505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
266515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
266525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
266545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_PUSH_TEXT_CREATED 2
266555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
266565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
266585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
266595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int nodeType, const xmlChar *value, int len,
266605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int mode, int *consumed)
266615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
266625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
266635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Unfortunately we have to duplicate the text sometimes.
266645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * OPTIMIZE: Maybe we could skip it, if:
266655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   1. content type is simple
266665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   2. whitespace is "collapse"
266675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   3. it consists of whitespace only
266685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
266695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Process character content.
266705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
266715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (consumed != NULL)
266725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*consumed = 0;
266735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (INODE_NILLED(vctxt->inode)) {
266745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
266755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* SPEC cvc-elt (3.3.4 - 3.2.1)
266765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* "The element information item must have no character or
266775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* element information item [children]."
266785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
266795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL,
266805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Neither character nor element content is allowed "
266815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "because the element is 'nilled'");
266825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (vctxt->err);
266835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
266845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
266855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SPEC (2.1) "If the {content type} is empty, then the
266865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * element information item has no character or element
266875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * information item [children]."
266885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
266895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->typeDef->contentType ==
266905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_CONTENT_EMPTY) {
266915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL,
266925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Character content is not allowed, "
266935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "because the content type is empty");
266945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (vctxt->err);
266955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
266965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->typeDef->contentType ==
266985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMA_CONTENT_ELEMENTS) {
266995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((nodeType != XML_TEXT_NODE) ||
267005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (! xmlSchemaIsBlank((xmlChar *) value, len))) {
267015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
267025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * SPEC cvc-complex-type (2.3)
267035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * "If the {content type} is element-only, then the
267045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * element information item has no character information
267055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * item [children] other than those whose [character
267065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * code] is defined as a white space in [XML 1.0 (Second
267075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Edition)]."
267085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
267095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL,
267105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Character content other than whitespace is not allowed "
267115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"because the content type is 'element-only'");
267125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (vctxt->err);
267135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
267145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
267155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
267165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((value == NULL) || (value[0] == 0))
267185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
267195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
267205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Save the value.
267215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE that even if the content type is *mixed*, we need the
267225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * *initial value* for default/fixed value constraints.
267235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
267245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
267255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((vctxt->inode->decl == NULL) ||
267265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(vctxt->inode->decl->value == NULL)))
267275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
267285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->value == NULL) {
267305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
267315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Set the value.
267325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
267335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (mode) {
267345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_PUSH_TEXT_PERSIST:
267355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
267365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* When working on a tree.
267375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
267385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->value = value;
267395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
267405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_PUSH_TEXT_CREATED:
267415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
267425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* When working with the reader.
267435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* The value will be freed by the element info.
267445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
267455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->value = value;
267465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (consumed != NULL)
267475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *consumed = 1;
267485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->flags |=
267495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
267505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
267515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_SCHEMA_PUSH_TEXT_VOLATILE:
267525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
267535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* When working with SAX.
267545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* The value will be freed by the element info.
267555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
267565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (len != -1)
267575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt->inode->value = BAD_CAST xmlStrndup(value, len);
267585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
267595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    vctxt->inode->value = BAD_CAST xmlStrdup(value);
267605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		vctxt->inode->flags |=
267615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
267625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
267635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
267645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
267655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
267665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
267675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (len < 0)
267685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    len = xmlStrlen(value);
267695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
267705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Concat the value.
267715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
267725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
267735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->value = BAD_CAST xmlStrncat(
267745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlChar *) vctxt->inode->value, value, len);
267755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
267765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->value =
267775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len);
267785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
267795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
267805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
267815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
267835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
267845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
267865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
267875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
267885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
267895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->skipDepth != -1) &&
267915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(vctxt->depth >= vctxt->skipDepth)) {
267925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidateElem",
267935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "in skip-state");
267945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto internal_error;
267955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
267965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xsiAssemble) {
267975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
267985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We will stop validation if there was an error during
267995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* dynamic schema construction.
268005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we simply set @skipDepth to 0, this could
268015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* mean that a streaming document via SAX would be
268025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* still read to the end but it won't be validated any more.
268035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* TODO: If we are sure how to stop the validation at once
268045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   for all input scenarios, then this should be changed to
268055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   instantly stop the validation.
268065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
268075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaAssembleByXSI(vctxt);
268085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
268095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -1)
268105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
268115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->skipDepth = 0;
268125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
268135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
268155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth > 0) {
268165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
268175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Validate this element against the content model
268185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* of the parent.
268195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
268205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaValidateChildElem(vctxt);
268215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
268225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
268235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateElem",
268245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaStreamValidateChildElement()");
268255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
268265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
268275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
268285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->depth == vctxt->skipDepth)
268305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
268315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->inode->decl == NULL) &&
268325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (vctxt->inode->typeDef == NULL)) {
268335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaValidateElem",
268345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"the child element was valid but neither the "
268355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"declaration nor the type was set");
268365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
268375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
268395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
268405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Get the declaration of the validation root.
268415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
268425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
268435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->localName,
268445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->nsName);
268455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->inode->decl == NULL) {
268465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = XML_SCHEMAV_CVC_ELT_1;
268475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR(ret, NULL,
268485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"No matching global declaration available "
268495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"for the validation root");
268505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
268515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
268535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->decl == NULL)
268555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto type_validation;
268565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
268585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int skip;
268595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
268605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Wildcards.
268615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
268625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaValidateElemWildcard(vctxt, &skip);
268635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
268645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
268655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaValidateElem",
268665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaValidateElemWildcard()");
268675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
268685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
268695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
268705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (skip) {
268725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->skipDepth = vctxt->depth;
268735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto exit;
268745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
268765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* The declaration might be set by the wildcard validation,
268775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* when the processContents is "lax" or "strict".
268785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
268795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
268805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
268815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Clear the "decl" field to not confuse further processing.
268825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
268835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->inode->decl = NULL;
268845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto type_validation;
268855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
268875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
268885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate against the declaration.
268895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
268905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaValidateElemDecl(vctxt);
268915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0) {
268925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
268935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaValidateElem",
268945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlSchemaValidateElemDecl()");
268955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
268965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
268975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
268985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
268995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate against the type definition.
269015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)type_validation:
269035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->typeDef == NULL) {
269055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
269065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAV_CVC_TYPE_1;
269075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	VERROR(ret, NULL,
269085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    "The type definition is absent");
269095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
269105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
269125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
269135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = XML_SCHEMAV_CVC_TYPE_2;
269145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    VERROR(ret, NULL,
269155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	    "The type definition is abstract");
269165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
269175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Evaluate IDCs. Do it here, since new IDC matchers are registered
269205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * during validation against the declaration. This must be done
269215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * _before_ attribute validation.
269225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates != NULL) {
269245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
269255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->appliedXPath = 1;
269265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
269275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaValidateElem",
269285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlSchemaXPathEvaluate()");
269295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
269305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
269315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate attributes.
269345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
269365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->nbAttrInfos != 0) ||
269375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (vctxt->inode->typeDef->attrUses != NULL)) {
269385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVAttributesComplex(vctxt);
269405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
269415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->nbAttrInfos != 0) {
269425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVAttributesSimple(vctxt);
269445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Clear registered attributes.
269475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos != 0)
269495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaClearAttrInfos(vctxt);
269505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -1) {
269515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaValidateElem",
269525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling attributes validation");
269535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto internal_error;
269545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Don't return an error if attributes are invalid on purpose.
269575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = 0;
269595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
269615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
269625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->skipDepth = vctxt->depth;
269635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
269645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
269655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
269665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
269675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XML_SCHEMA_READER_ENABLED
269695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
269705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
269715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
269725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
269735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth, nodeType, ret = 0, consumed;
269745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr ielem;
269755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->depth = -1;
269775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlTextReaderRead(vctxt->reader);
269785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
269795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Move to the document element.
269805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
269815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (ret == 1) {
269825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nodeType = xmlTextReaderNodeType(vctxt->reader);
269835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nodeType == XML_ELEMENT_NODE)
269845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto root_found;
269855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlTextReaderRead(vctxt->reader);
269865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
269875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
269885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)root_found:
269905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
269925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	depth = xmlTextReaderDepth(vctxt->reader);
269935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nodeType = xmlTextReaderNodeType(vctxt->reader);
269945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nodeType == XML_ELEMENT_NODE) {
269965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->depth++;
269985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
269995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVReaderWalk",
270005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaValidatorPushElem()");
270015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
270025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem = vctxt->inode;
270045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->localName = xmlTextReaderLocalName(vctxt->reader);
270055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
270065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
270075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
270085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Is the element empty?
270095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
270105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderIsEmptyElement(vctxt->reader);
270115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -1) {
270125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVReaderWalk",
270135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlTextReaderIsEmptyElement()");
270145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
270155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret) {
270175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
270185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
270205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Register attributes.
270215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
270225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->nbAttrInfos = 0;
270235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
270245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -1) {
270255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVReaderWalk",
270265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlTextReaderMoveToFirstAttribute()");
270275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
270285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == 1) {
270305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
270315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
270325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * VAL TODO: How do we know that the reader works on a
270335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * node tree, to be able to pass a node here?
270345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
270355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSchemaValidatorPushAttribute(vctxt, NULL,
270365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
270375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTextReaderNamespaceUri(vctxt->reader), 1,
270385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTextReaderValue(vctxt->reader), 1) == -1) {
270395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaVReaderWalk",
270415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "calling xmlSchemaValidatorPushAttribute()");
270425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
270435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
270445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
270455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret == -1) {
270465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaVReaderWalk",
270475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "calling xmlTextReaderMoveToFirstAttribute()");
270485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
270495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
270505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ret == 1);
270515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
270525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Back to element position.
270535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
270545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlTextReaderMoveToElement(vctxt->reader);
270555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == -1) {
270565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVReaderWalk",
270575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlTextReaderMoveToElement()");
270585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
270595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
270605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
270625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Validate the element.
270635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
270645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret= xmlSchemaValidateElem(vctxt);
270655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
270665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == -1) {
270675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVReaderWalk",
270685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaValidateElem()");
270695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
270705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
270715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
270725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt->depth == vctxt->skipDepth) {
270745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int curDepth;
270755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
270765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Skip all content.
270775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
270785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
270795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlTextReaderRead(vctxt->reader);
270805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    curDepth = xmlTextReaderDepth(vctxt->reader);
270815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while ((ret == 1) && (curDepth != depth)) {
270825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlTextReaderRead(vctxt->reader);
270835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			curDepth = xmlTextReaderDepth(vctxt->reader);
270845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
270855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
270865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
270875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* VAL TODO: A reader error occured; what to do here?
270885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
270895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = 1;
270905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto exit;
270915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
270925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
270935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_elem;
270945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
270955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
270965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * READER VAL TODO: Is an END_ELEM really never called
270975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * if the elem is empty?
270985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
270995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
271005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_elem;
271015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (nodeType == END_ELEM) {
271025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
271035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process END of element.
271045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
271055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)leave_elem:
271065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidatorPopElem(vctxt);
271075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
271085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
271095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVReaderWalk",
271105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaValidatorPopElem()");
271115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
271125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
271135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
271145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
271155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (vctxt->depth >= 0)
271165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem = vctxt->inode;
271175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
271185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem = NULL;
271195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((nodeType == XML_TEXT_NODE) ||
271205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (nodeType == XML_CDATA_SECTION_NODE) ||
271215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (nodeType == WHTSP) ||
271225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (nodeType == SIGN_WHTSP)) {
271235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
271245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process character content.
271255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
271265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *value;
271275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
271295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nodeType = XML_TEXT_NODE;
271305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value = xmlTextReaderValue(vctxt->reader);
271325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value,
271335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		-1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed);
271345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (! consumed)
271355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(value);
271365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -1) {
271375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVReaderWalk",
271385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVPushText()");
271395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
271405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
271415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((nodeType == XML_ENTITY_NODE) ||
271425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (nodeType == XML_ENTITY_REF_NODE)) {
271435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
271445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * VAL TODO: What to do with entities?
271455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
271465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TODO
271475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
271485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
271495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Read next node.
271505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
271515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlTextReaderRead(vctxt->reader);
271525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (ret == 1);
271535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
271555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
271565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
271575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
271585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
271595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
271605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
271625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
271635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			SAX validation handlers				*
271645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
271655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
271665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
271685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Process text content.
271695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
271705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
271715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXHandleText(void *ctx,
271725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar * ch,
271735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       int len)
271745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
271755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
271765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth < 0)
271785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
271795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
271805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
271815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
271825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
271835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len,
271845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
271855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaSAXHandleCDataSection",
271865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaVPushText()");
271875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->err = -1;
271885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStopParser(vctxt->parserCtxt);
271895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
271905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
271915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
271935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Process CDATA content.
271945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
271955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
271965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXHandleCDataSection(void *ctx,
271975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     const xmlChar * ch,
271985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     int len)
271995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
272005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
272015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth < 0)
272035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
272045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
272055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
272065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
272075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
272085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len,
272095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
272105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaSAXHandleCDataSection",
272115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaVPushText()");
272125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->err = -1;
272135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStopParser(vctxt->parserCtxt);
272145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
272155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
272165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
272185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED,
272195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    const xmlChar * name ATTRIBUTE_UNUSED)
272205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
272215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
272225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->depth < 0)
272245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
272255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
272265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
272275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* SAX VAL TODO: What to do here? */
272285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TODO
272295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
272305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
272325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXHandleStartElementNs(void *ctx,
272335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar * localname,
272345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar * prefix ATTRIBUTE_UNUSED,
272355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar * URI,
272365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int nb_namespaces,
272375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar ** namespaces,
272385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int nb_attributes,
272395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 int nb_defaulted ATTRIBUTE_UNUSED,
272405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const xmlChar ** attributes)
272415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
272425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
272435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
272445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr ielem;
272455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, j;
272465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
272485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SAX VAL TODO: What to do with nb_defaulted?
272495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
272505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
272515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Skip elements if inside a "skip" wildcard or invalid.
272525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
272535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->depth++;
272545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
272555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
272565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
272575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Push the element.
272585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
272595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
272605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaSAXHandleStartElementNs",
272615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "calling xmlSchemaValidatorPushElem()");
272625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto internal_error;
272635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
272645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem = vctxt->inode;
272655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
272665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Is this OK?
272675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
272685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt);
272695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->localName = localname;
272705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->nsName = URI;
272715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
272725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
272735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Register namespaces on the elem info.
272745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
272755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nb_namespaces != 0) {
272765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
272775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Although the parser builds its own namespace list,
272785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* we have no access to it, so we'll use an own one.
272795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
272805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
272815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
272825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Store prefix and namespace name.
272835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
272845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ielem->nsBindings == NULL) {
272855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsBindings =
272865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar **) xmlMalloc(10 *
272875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(const xmlChar *));
272885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ielem->nsBindings == NULL) {
272895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaVErrMemory(vctxt,
272905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"allocating namespace bindings for SAX validation",
272915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
272925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
272935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
272945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nbNsBindings = 0;
272955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->sizeNsBindings = 5;
272965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
272975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->sizeNsBindings *= 2;
272985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsBindings =
272995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar **) xmlRealloc(
273005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(void *) ielem->nsBindings,
273015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ielem->sizeNsBindings * 2 * sizeof(const xmlChar *));
273025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ielem->nsBindings == NULL) {
273035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSchemaVErrMemory(vctxt,
273045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"re-allocating namespace bindings for SAX validation",
273055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL);
273065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
273075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
273085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
273095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j];
273115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (namespaces[j+1][0] == 0) {
273125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
273135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Handle xmlns="".
273145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
273155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL;
273165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
273175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
273185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    namespaces[j+1];
273195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->nbNsBindings++;
273205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
273215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
273225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
273235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Register attributes.
273245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SAX VAL TODO: We are not adding namespace declaration
273255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * attributes yet.
273265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
273275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nb_attributes != 0) {
273285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *value;
273295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (j = 0, i = 0; i < nb_attributes; i++, j += 5) {
273315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
273325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Duplicate the value.
273335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
273345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    value = xmlStrndup(attributes[j+3],
273355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attributes[j+4] - attributes[j+3]);
273365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
273375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Set the node line.
273385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
273395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidatorPushAttribute(vctxt,
273405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0,
273415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		value, 1);
273425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == -1) {
273435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaSAXHandleStartElementNs",
273445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaValidatorPushAttribute()");
273455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
273465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
273475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
273485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
273495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
273505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Validate the element.
273515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
273525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaValidateElem(vctxt);
273535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0) {
273545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
273555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaSAXHandleStartElementNs",
273565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlSchemaValidateElem()");
273575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
273585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
273595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
273605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
273615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
273635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
273645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
273655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->err = -1;
273665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStopParser(vctxt->parserCtxt);
273675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
273685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
273695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
273715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXHandleEndElementNs(void *ctx,
273725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       const xmlChar * localname ATTRIBUTE_UNUSED,
273735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       const xmlChar * prefix ATTRIBUTE_UNUSED,
273745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       const xmlChar * URI ATTRIBUTE_UNUSED)
273755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
273765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
273775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
273785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
273805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Skip elements if inside a "skip" wildcard or if invalid.
273815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
273825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->skipDepth != -1) {
273835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->depth > vctxt->skipDepth) {
273845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->depth--;
273855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
273865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
273875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->skipDepth = -1;
273885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
273895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
273905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * SAX VAL TODO: Just a temporary check.
273915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
273925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!xmlStrEqual(vctxt->inode->localName, localname)) ||
273935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(!xmlStrEqual(vctxt->inode->nsName, URI))) {
273945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaSAXHandleEndElementNs",
273955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "elem pop mismatch");
273965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
273975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlSchemaValidatorPopElem(vctxt);
273985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != 0) {
273995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res < 0) {
274005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaSAXHandleEndElementNs",
274015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"calling xmlSchemaValidatorPopElem()");
274025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
274035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
274045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto exit;
274055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
274065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
274075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
274085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
274095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->err = -1;
274105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStopParser(vctxt->parserCtxt);
274115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
274125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
274135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
274155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
274165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Validation interfaces				*
274175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
274185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
274195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
274215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaNewValidCtxt:
274225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema:  a precompiled XML Schemas
274235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
274245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XML Schemas validation context based on the given schema.
274255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
274265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the validation context or NULL in case of error
274275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
274285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidCtxtPtr
274295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaNewValidCtxt(xmlSchemaPtr schema)
274305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
274315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr ret;
274325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt));
274345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
274355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaVErrMemory(NULL, "allocating validation context", NULL);
274365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
274375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
274385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaValidCtxt));
274395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = XML_SCHEMA_CTXT_VALIDATOR;
274405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dict = xmlDictCreate();
274415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->nodeQNames = xmlSchemaItemListCreate();
274425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->schema = schema;
274435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
274445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
274455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
274475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaClearValidCtxt:
274485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context
274495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
274505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the resources associated to the schema validation context;
274515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * leaves some fields alive intended for reuse of the context.
274525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
274535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
274545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
274555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
274565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt == NULL)
274575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
274585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
274605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Should we clear the flags?
274615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   Might be problematic if one reuses the context
274625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *   and assumes that the options remain the same.
274635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
274645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->flags = 0;
274655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->validationRoot = NULL;
274665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->doc = NULL;
274675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
274685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->reader = NULL;
274695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
274705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->hasKeyrefs = 0;
274715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->value != NULL) {
274735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeValue(vctxt->value);
274745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->value = NULL;
274755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
274765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
274775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Augmented IDC information.
274785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
274795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->aidcs != NULL) {
274805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCAugPtr cur = vctxt->aidcs, next;
274815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
274825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    next = cur->next;
274835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
274845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = next;
274855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (cur != NULL);
274865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->aidcs = NULL;
274875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
274885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->idcMatcherCache != NULL) {
274895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
274905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (matcher) {
274925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = matcher;
274935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    matcher = matcher->nextCached;
274945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIDCFreeMatcherList(tmp);
274955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
274965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcMatcherCache = NULL;
274975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
274985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->idcNodes != NULL) {
275015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
275025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSVIIDCNodePtr item;
275035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < vctxt->nbIdcNodes; i++) {
275055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item = vctxt->idcNodes[i];
275065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(item->keys);
275075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(item);
275085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
275095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(vctxt->idcNodes);
275105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->idcNodes = NULL;
275115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->nbIdcNodes = 0;
275125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->sizeIdcNodes = 0;
275135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
275155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note that we won't delete the XPath state pool here.
275165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
275175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xpathStates != NULL) {
275185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
275195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->xpathStates = NULL;
275205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
275225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Attribute info.
275235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
275245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->nbAttrInfos != 0) {
275255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaClearAttrInfos(vctxt);
275265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
275285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Element info.
275295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
275305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->elemInfos != NULL) {
275315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
275325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaNodeInfoPtr ei;
275335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < vctxt->sizeElemInfos; i++) {
275355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ei = vctxt->elemInfos[i];
275365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ei == NULL)
275375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
275385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaClearElemInfo(vctxt, ei);
275395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
275405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaItemListClear(vctxt->nodeQNames);
275425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Recreate the dict. */
275435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictFree(vctxt->dict);
275445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
275455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Is is save to recreate it? Do we have a scenario
275465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * where the user provides the dict?
275475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
275485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->dict = xmlDictCreate();
275495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
275525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaFreeValidCtxt:
275535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the schema validation context
275545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
275555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the resources associated to the schema validation context
275565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
275575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
275585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
275595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
275605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
275615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
275625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->value != NULL)
275635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaFreeValue(ctxt->value);
275645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->pctxt != NULL)
275655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(ctxt->pctxt);
275665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->idcNodes != NULL) {
275675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
275685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaPSVIIDCNodePtr item;
275695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < ctxt->nbIdcNodes; i++) {
275715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    item = ctxt->idcNodes[i];
275725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(item->keys);
275735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(item);
275745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
275755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ctxt->idcNodes);
275765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->idcKeys != NULL) {
275785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
275795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < ctxt->nbIdcKeys; i++)
275805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaIDCFreeKey(ctxt->idcKeys[i]);
275815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ctxt->idcKeys);
275825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->xpathStates != NULL) {
275855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
275865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->xpathStates = NULL;
275875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->xpathStatePool != NULL) {
275895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
275905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->xpathStatePool = NULL;
275915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
275925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
275945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Augmented IDC information.
275955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
275965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->aidcs != NULL) {
275975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaIDCAugPtr cur = ctxt->aidcs, next;
275985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
275995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    next = cur->next;
276005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
276015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = next;
276025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (cur != NULL);
276035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
276045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->attrInfos != NULL) {
276055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
276065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaAttrInfoPtr attr;
276075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Just a paranoid call to the cleanup. */
276095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->nbAttrInfos != 0)
276105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaClearAttrInfos(ctxt);
276115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < ctxt->sizeAttrInfos; i++) {
276125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = ctxt->attrInfos[i];
276135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(attr);
276145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
276155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ctxt->attrInfos);
276165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
276175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->elemInfos != NULL) {
276185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
276195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaNodeInfoPtr ei;
276205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0; i < ctxt->sizeElemInfos; i++) {
276225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ei = ctxt->elemInfos[i];
276235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ei == NULL)
276245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
276255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaClearElemInfo(ctxt, ei);
276265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ei);
276275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
276285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ctxt->elemInfos);
276295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
276305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->nodeQNames != NULL)
276315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaItemListFree(ctxt->nodeQNames);
276325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->dict != NULL)
276335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDictFree(ctxt->dict);
276345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(ctxt);
276355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
276365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
276385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaIsValid:
276395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the schema validation context
276405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
276415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if any error was detected during validation.
276425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
276435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if valid so far, 0 if errors were detected, and -1 in case
276445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         of internal error.
276455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
276465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
276475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
276485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
276495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
276505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
276515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ctxt->err == 0);
276525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
276535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
276555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSetValidErrors:
276565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
276575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err:  the error function
276585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning function
276595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context
276605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
276615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the error and warning callback informations
276625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
276635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
276645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
276655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlSchemaValidityErrorFunc err,
276665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlSchemaValidityWarningFunc warn, void *ctx)
276675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
276685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
276695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
276705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->error = err;
276715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->warning = warn;
276725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errCtxt = ctx;
276735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->pctxt != NULL)
276745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx);
276755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
276765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
276785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSetValidStructuredErrors:
276795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
276805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @serror:  the structured error function
276815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context
276825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
276835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the structured error callback
276845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
276855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
276865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
276875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  xmlStructuredErrorFunc serror, void *ctx)
276885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
276895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
276905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
276915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->serror = serror;
276925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->error = NULL;
276935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->warning = NULL;
276945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errCtxt = ctx;
276955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->pctxt != NULL)
276965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx);
276975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
276985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
277005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaGetValidErrors:
277015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XML-Schema validation context
277025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error function result
277035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @warn: the warning function result
277045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the functions context result
277055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the error and warning callback informations
277075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error and 0 otherwise
277095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
277105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
277115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
277125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaValidityErrorFunc * err,
277135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlSchemaValidityWarningFunc * warn, void **ctx)
277145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
277155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt == NULL)
277165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
277175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (err != NULL)
277185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*err = ctxt->error;
277195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (warn != NULL)
277205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*warn = ctxt->warning;
277215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctx != NULL)
277225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*ctx = ctxt->errCtxt;
277235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
277245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
277255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
277285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSetValidOptions:
277295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:	a schema validation context
277305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlSchemaValidOption
277315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sets the options to be used during the validation.
277335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of an
277355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * API error.
277365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
277375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
277385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
277395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 int options)
277405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
277425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
277435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
277455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
277465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
277475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * WARNING: Change the start value if adding to the
277485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * xmlSchemaValidOption.
277495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Is there an other, more easy to maintain,
277505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * way?
277515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
277525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < (int) sizeof(int) * 8; i++) {
277535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (options & 1<<i)
277545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
277555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
277565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->options = options;
277575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
277585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
277595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
277615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidCtxtGetOptions:
277625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema validation context
277635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the validation context options.
277655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
277665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the option combination or -1 on error.
277675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
277685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
277695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
277705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
277725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
277735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
277745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
277755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ctxt->options);
277765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
277775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
277795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
277805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
277815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
277825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
277835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaNodeInfoPtr ielem = NULL;
277845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node, valRoot;
277855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nsName;
277865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* DOC VAL TODO: Move this to the start function. */
277885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valRoot = xmlDocGetRootElement(vctxt->doc);
277895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (valRoot == NULL) {
277905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* VAL TODO: Error code? */
277915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR(1, NULL, "The document has no document element");
277925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
277935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
277945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->depth = -1;
277955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->validationRoot = valRoot;
277965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = valRoot;
277975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
277985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
277995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_sibling;
278005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ELEMENT_NODE) {
278015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Init the node-info.
278045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->depth++;
278065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSchemaValidatorPushElem(vctxt) == -1)
278075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
278085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem = vctxt->inode;
278095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->node = node;
278105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->nodeLine = node->line;
278115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->localName = node->name;
278125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->ns != NULL)
278135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->nsName = node->ns->href;
278145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
278155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Register attributes.
278175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * DOC VAL TODO: We do not register namespace declaration
278185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * attributes yet.
278195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->nbAttrInfos = 0;
278215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->properties != NULL) {
278225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = node->properties;
278235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
278245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (attr->ns != NULL)
278255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName = attr->ns->href;
278265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
278275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			nsName = NULL;
278285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSchemaValidatorPushAttribute(vctxt,
278295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlNodePtr) attr,
278305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
278315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Note that we give it the line number of the
278325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* parent element.
278335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
278345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ielem->nodeLine,
278355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attr->name, nsName, 0,
278365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNodeListGetString(attr->doc, attr->children, 1), 1);
278375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret == -1) {
278385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			VERROR_INT("xmlSchemaDocWalk",
278395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "calling xmlSchemaValidatorPushAttribute()");
278405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
278415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
278425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attr = attr->next;
278435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (attr);
278445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
278455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Validate the element.
278475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidateElem(vctxt);
278495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
278505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret == -1) {
278515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaDocWalk",
278525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaValidateElem()");
278535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
278545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
278555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
278565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Don't stop validation; just skip the content
278575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* of this element.
278585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
278595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
278605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
278615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((vctxt->skipDepth != -1) &&
278625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(vctxt->depth >= vctxt->skipDepth))
278635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
278645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((node->type == XML_TEXT_NODE) ||
278655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_CDATA_SECTION_NODE)) {
278665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process character content.
278685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
278705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
278715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaVPushText(vctxt, node->type, node->content,
278725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		-1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL);
278735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
278745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVDocWalk",
278755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "calling xmlSchemaVPushText()");
278765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
278775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
278785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * DOC VAL TODO: Should we skip further validation of the
278805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * element content here?
278815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((node->type == XML_ENTITY_NODE) ||
278835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_ENTITY_REF_NODE)) {
278845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * DOC VAL TODO: What to do with entities?
278865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    VERROR_INT("xmlSchemaVDocWalk",
278885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"there is at least one entity reference in the node-tree "
278895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"currently being validated. Processing of entities with "
278905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"this XML Schema processor is not supported (yet). Please "
278915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"substitute entities before validation.");
278925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
278935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
278945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto leave_node;
278955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
278965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * DOC VAL TODO: XInclude nodes, etc.
278975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
278985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
278995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
279005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Walk the doc.
279015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
279025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->children != NULL) {
279035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->children;
279045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
279055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
279065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)leave_node:
279075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ELEMENT_NODE) {
279085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
279095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Leaving the scope of an element.
279105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
279115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node != vctxt->inode->node) {
279125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		VERROR_INT("xmlSchemaVDocWalk",
279135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "element position mismatch");
279145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
279155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
279165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlSchemaValidatorPopElem(vctxt);
279175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0) {
279185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
279195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    VERROR_INT("xmlSchemaVDocWalk",
279205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"calling xmlSchemaValidatorPopElem()");
279215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
279225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
279235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
279245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node == valRoot)
279255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto exit;
279265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
279275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_sibling:
279285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->next != NULL)
279295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->next;
279305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
279315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->parent;
279325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto leave_node;
279335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
279345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
279355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
279375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
279385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
279395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
279405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
279415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
279435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
279445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
279455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Some initialization.
279465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
279475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->err = 0;
279485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->nberrors = 0;
279495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->depth = -1;
279505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->skipDepth = -1;
279515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->xsiAssemble = 0;
279525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->hasKeyrefs = 0;
279535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENABLE_IDC_NODE_TABLES_TEST
279545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->createIDCNodeTables = 1;
279555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
279565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt->createIDCNodeTables = 0;
279575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
279585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
279595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a schema + parser if necessary.
279605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
279615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->schema == NULL) {
279625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParserCtxtPtr pctxt;
279635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->xsiAssemble = 1;
279655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
279665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* If not schema was given then we will create a schema
279675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* dynamically using XSI schema locations.
279685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
279695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the schema parser context.
279705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
279715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((vctxt->pctxt == NULL) &&
279725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
279735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   return (-1);
279745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt = vctxt->pctxt;
279755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->xsiAssemble = 1;
279765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
279775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the schema.
279785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
279795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt->schema = xmlSchemaNewSchema(pctxt);
279805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->schema == NULL)
279815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
279825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
279835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the schema construction context.
279845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
279855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
279865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (pctxt->constructor == NULL)
279875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
279885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->constructor->mainSchema = vctxt->schema;
279895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
279905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Take ownership of the constructor to be able to free it.
279915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
279925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->ownsConstructor = 1;
279935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
279945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
279955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Augment the IDC definitions for the main schema and all imported ones
279965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * NOTE: main schema if the first in the imported list
279975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
279985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
279995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
280015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
280025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
280045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
280055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->xsiAssemble) {
280065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (vctxt->schema != NULL) {
280075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSchemaFree(vctxt->schema);
280085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    vctxt->schema = NULL;
280095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
280105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
280115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaClearValidCtxt(vctxt);
280125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
280135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
280155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
280165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
280175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
280185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlSchemaPreRun(vctxt) < 0)
280205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
280215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (vctxt->doc != NULL) {
280235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
280245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Tree validation.
280255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
280265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVDocWalk(vctxt);
280275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
280285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (vctxt->reader != NULL) {
280295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
280305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * XML Reader validation.
280315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
280325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XML_SCHEMA_READER_ENABLED
280335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaVReaderWalk(vctxt);
280345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
280355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
280365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) {
280375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
280385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * SAX validation.
280395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
280405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlParseDocument(vctxt->parserCtxt);
280415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
280425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	VERROR_INT("xmlSchemaVStart",
280435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "no instance to validate");
280445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = -1;
280455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
280465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPostRun(vctxt);
280485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == 0)
280495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = vctxt->err;
280505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
280515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
280525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
280545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidateOneElement:
280555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
280565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  an element node
280575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
280585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate a branch of a tree, starting with the given @elem.
280595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
280605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the element and its subtree is valid, a positive error
280615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * code number otherwise and -1 in case of an internal or API error.
280625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
280635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
280645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem)
280655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
280665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE))
280675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
280685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->schema == NULL)
280705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
280715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->doc = elem->doc;
280735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = elem;
280745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->validationRoot = elem;
280755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSchemaVStart(ctxt));
280765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
280775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
280795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidateDoc:
280805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
280815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  a parsed document tree
280825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
280835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate a document tree in memory.
280845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
280855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the document is schemas valid, a positive error code
280865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     number otherwise and -1 in case of internal or API error.
280875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
280885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
280895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
280905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
280915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (doc == NULL))
280925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
280935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->doc = doc;
280955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = xmlDocGetRootElement(doc);
280965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->node == NULL) {
280975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaCustomErr(ACTXT_CAST ctxt,
280985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING,
280995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlNodePtr) doc, NULL,
281005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "The document has no document element", NULL, NULL);
281015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (ctxt->err);
281025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
281035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->validationRoot = ctxt->node;
281045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlSchemaVStart(ctxt));
281055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
281095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
281105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 		Function and data for SAX streaming API			*
281115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
281125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
281135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
281145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
281155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaSplitSAXData {
281175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr      user_sax;
281185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void                 *user_data;
281195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr ctxt;
281205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr      schemas_sax;
281215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
281225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SAX_PLUG_MAGIC 0xdc43ba21
281245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlSchemaSAXPlug {
281265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int magic;
281275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* the original callbacks informations */
281295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr     *user_sax_ptr;
281305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr      user_sax;
281315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void                **user_data_ptr;
281325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void                 *user_data;
281335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* the block plugged back and validation informations */
281355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandler         schemas_sax;
281365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaValidCtxtPtr ctxt;
281375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
281385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* All those functions just bounces to the user provided SAX handlers */
281405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
281415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internalSubsetSplit(void *ctx, const xmlChar *name,
281425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       const xmlChar *ExternalID, const xmlChar *SystemID)
281435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->internalSubset != NULL))
281475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID,
281485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                               SystemID);
281495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
281525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)isStandaloneSplit(void *ctx)
281535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->isStandalone != NULL))
281575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->isStandalone(ctxt->user_data));
281585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
281595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
281625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hasInternalSubsetSplit(void *ctx)
281635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->hasInternalSubset != NULL))
281675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
281685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
281695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
281725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hasExternalSubsetSplit(void *ctx)
281735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->hasExternalSubset != NULL))
281775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
281785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
281795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
281825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)externalSubsetSplit(void *ctx, const xmlChar *name,
281835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       const xmlChar *ExternalID, const xmlChar *SystemID)
281845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->externalSubset != NULL))
281885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID,
281895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                               SystemID);
281905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
281915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlParserInputPtr
281935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)resolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
281945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
281955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
281965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
281975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->resolveEntity != NULL))
281985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
281995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                                     systemId));
282005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
282015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
282045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getEntitySplit(void *ctx, const xmlChar *name)
282055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->getEntity != NULL))
282095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->getEntity(ctxt->user_data, name));
282105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
282115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
282145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getParameterEntitySplit(void *ctx, const xmlChar *name)
282155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->getParameterEntity != NULL))
282195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name));
282205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
282215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)entityDeclSplit(void *ctx, const xmlChar *name, int type,
282265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
282275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->entityDecl != NULL))
282315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId,
282325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                           systemId, content);
282335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)attributeDeclSplit(void *ctx, const xmlChar * elem,
282375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * name, int type, int def,
282385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * defaultValue, xmlEnumerationPtr tree)
282395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->attributeDecl != NULL)) {
282435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type,
282445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                              def, defaultValue, tree);
282455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
282465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeEnumeration(tree);
282475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
282485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elementDeclSplit(void *ctx, const xmlChar *name, int type,
282525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlElementContentPtr content)
282535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->elementDecl != NULL))
282575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content);
282585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)notationDeclSplit(void *ctx, const xmlChar *name,
282625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     const xmlChar *publicId, const xmlChar *systemId)
282635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->notationDecl != NULL))
282675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId,
282685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                             systemId);
282695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unparsedEntityDeclSplit(void *ctx, const xmlChar *name,
282735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *publicId, const xmlChar *systemId,
282745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *notationName)
282755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->unparsedEntityDecl != NULL))
282795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId,
282805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                                   systemId, notationName);
282815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)setDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc)
282855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->setDocumentLocator != NULL))
282895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
282905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
282915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
282935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startDocumentSplit(void *ctx)
282945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
282955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
282965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
282975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->startDocument != NULL))
282985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->startDocument(ctxt->user_data);
282995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endDocumentSplit(void *ctx)
283035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->endDocument != NULL))
283075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->endDocument(ctxt->user_data);
283085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)processingInstructionSplit(void *ctx, const xmlChar *target,
283125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const xmlChar *data)
283135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->processingInstruction != NULL))
283175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->processingInstruction(ctxt->user_data, target, data);
283185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)commentSplit(void *ctx, const xmlChar *value)
283225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->comment != NULL))
283265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->comment(ctxt->user_data, value);
283275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
283305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Varargs error callbacks to the user application, harder ...
283315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
283325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
283345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)warningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
283355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->warning != NULL)) {
283385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	TODO
283395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
283405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
283425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)errorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
283435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->error != NULL)) {
283465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	TODO
283475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
283485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
283505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
283515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
283535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->fatalError != NULL)) {
283545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	TODO
283555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
283565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
283595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Those are function where both the user handler and the schemas handler
283605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to be called.
283615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
283625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)charactersSplit(void *ctx, const xmlChar *ch, int len)
283645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
283675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
283685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL))
283695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->characters(ctxt->user_data, ch, len);
283705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
283715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
283725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len)
283765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
283795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
283805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->user_sax != NULL) &&
283815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->ignorableWhitespace != NULL))
283825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len);
283835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
283845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
283855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
283885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdataBlockSplit(void *ctx, const xmlChar *value, int len)
283895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
283915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
283925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
283935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->user_sax != NULL) &&
283945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->cdataBlock != NULL))
283955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->cdataBlock(ctxt->user_data, value, len);
283965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
283975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len);
283985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
283995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
284015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)referenceSplit(void *ctx, const xmlChar *name)
284025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
284035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
284045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
284055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
284065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
284075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->reference != NULL))
284085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->reference(ctxt->user_data, name);
284095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
284105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaSAXHandleReference(ctxt->user_data, name);
284115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
284125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
284145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startElementNsSplit(void *ctx, const xmlChar * localname,
284155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar * prefix, const xmlChar * URI,
284165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int nb_namespaces, const xmlChar ** namespaces,
284175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int nb_attributes, int nb_defaulted,
284185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar ** attributes) {
284195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
284205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
284215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
284225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->user_sax != NULL) &&
284235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->startElementNs != NULL))
284245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix,
284255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                               URI, nb_namespaces, namespaces,
284265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       nb_attributes, nb_defaulted,
284275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       attributes);
284285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
284295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix,
284305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                                 URI, nb_namespaces, namespaces,
284315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 nb_attributes, nb_defaulted,
284325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 attributes);
284335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
284345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
284365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endElementNsSplit(void *ctx, const xmlChar * localname,
284375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar * prefix, const xmlChar * URI) {
284385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
284395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
284405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
284415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->user_sax != NULL) &&
284425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->user_sax->endElementNs != NULL))
284435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI);
284445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->ctxt != NULL)
284455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI);
284465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
284475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
284495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSAXPlug:
284505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
284515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sax:  a pointer to the original xmlSAXHandlerPtr
284525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @user_data:  a pointer to the original SAX user data pointer
284535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
284545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Plug a SAX based validation layer in a SAX parsing event flow.
284555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The original @saxptr and @dataptr data are replaced by new pointers
284565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but the calls to the original will be maintained.
284575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
284585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to a data structure needed to unplug the validation layer
284595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         or NULL in case of errors.
284605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
284615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXPlugPtr
284625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
284635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 xmlSAXHandlerPtr *sax, void **user_data)
284645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
284655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr ret;
284665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr old_sax;
284675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL))
284695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
284705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
284725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * We only allow to plug into SAX2 event streams
284735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
284745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_sax = *sax;
284755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC))
284765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
284775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((old_sax != NULL) &&
284785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) &&
284795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((old_sax->startElement != NULL) || (old_sax->endElement != NULL)))
284805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
284815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
284835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * everything seems right allocate the local data needed for that layer
284845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
284855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct));
284865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
284875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
284885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
284895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct));
284905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->magic = XML_SAX_PLUG_MAGIC;
284915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->schemas_sax.initialized = XML_SAX2_MAGIC;
284925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->ctxt = ctxt;
284935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->user_sax_ptr = sax;
284945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->user_sax = old_sax;
284955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old_sax == NULL) {
284965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
284975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * go direct, no need for the split block and functions.
284985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
284995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
285005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
285015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
285025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Note that we use the same text-function for both, to prevent
285035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * the parser from testing for ignorable whitespace.
285045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
285055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
285065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.characters = xmlSchemaSAXHandleText;
285075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
285095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
285105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->user_data = ctxt;
285125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*user_data = ctxt;
285135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
285145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       /*
285155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        * for each callback unused by Schemas initialize it to the Split
285165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* routine only if non NULL in the user block, this can speed up
285175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* things at the SAX level.
285185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
285195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->internalSubset != NULL)
285205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.internalSubset = internalSubsetSplit;
285215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->isStandalone != NULL)
285225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.isStandalone = isStandaloneSplit;
285235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->hasInternalSubset != NULL)
285245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
285255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->hasExternalSubset != NULL)
285265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
285275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->resolveEntity != NULL)
285285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.resolveEntity = resolveEntitySplit;
285295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->getEntity != NULL)
285305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.getEntity = getEntitySplit;
285315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->entityDecl != NULL)
285325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.entityDecl = entityDeclSplit;
285335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->notationDecl != NULL)
285345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.notationDecl = notationDeclSplit;
285355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->attributeDecl != NULL)
285365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.attributeDecl = attributeDeclSplit;
285375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->elementDecl != NULL)
285385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.elementDecl = elementDeclSplit;
285395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->unparsedEntityDecl != NULL)
285405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
285415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->setDocumentLocator != NULL)
285425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
285435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->startDocument != NULL)
285445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.startDocument = startDocumentSplit;
285455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->endDocument != NULL)
285465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.endDocument = endDocumentSplit;
285475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->processingInstruction != NULL)
285485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.processingInstruction = processingInstructionSplit;
285495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->comment != NULL)
285505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.comment = commentSplit;
285515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->warning != NULL)
285525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.warning = warningSplit;
285535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->error != NULL)
285545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.error = errorSplit;
285555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->fatalError != NULL)
285565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.fatalError = fatalErrorSplit;
285575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->getParameterEntity != NULL)
285585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
285595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (old_sax->externalSubset != NULL)
285605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->schemas_sax.externalSubset = externalSubsetSplit;
285615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
285635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * the 6 schemas callback have to go to the splitter functions
285645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Note that we use the same text-function for ignorableWhitespace
285655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * if possible, to prevent the parser from testing for ignorable
285665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * whitespace.
285675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
285685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->schemas_sax.characters = charactersSplit;
285695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((old_sax->ignorableWhitespace != NULL) &&
285705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (old_sax->ignorableWhitespace != old_sax->characters))
285715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
285725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
285735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->schemas_sax.ignorableWhitespace = charactersSplit;
285745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->schemas_sax.cdataBlock = cdataBlockSplit;
285755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->schemas_sax.reference = referenceSplit;
285765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->schemas_sax.startElementNs = startElementNsSplit;
285775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->schemas_sax.endElementNs = endElementNsSplit;
285785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->user_data_ptr = user_data;
285805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->user_data = *user_data;
285815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*user_data = ret;
285825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
285835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
285855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * plug the pointers back.
285865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
285875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *sax = &(ret->schemas_sax);
285885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->sax = *sax;
285895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
285905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPreRun(ctxt);
285915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
285925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
285955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaSAXUnplug:
285965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @plug:  a data structure returned by xmlSchemaSAXPlug
285975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
285985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unplug a SAX based validation layer in a SAX parsing event flow.
285995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The original pointers used in the call are restored.
286005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
286015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of failure.
286025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
286035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
286045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
286055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
286065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr *sax;
286075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void **user_data;
286085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
286105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
286115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plug->magic = 0;
286125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaPostRun(plug->ctxt);
286145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* restore the data */
286155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sax = plug->user_sax_ptr;
286165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *sax = plug->user_sax;
286175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plug->user_sax != NULL) {
286185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	user_data = plug->user_data_ptr;
286195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*user_data = plug->user_data;
286205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
286215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* free and return */
286235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(plug);
286245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
286255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
286265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
286285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidateStream:
286295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a schema validation context
286305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  the input to use for reading the data
286315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  an optional encoding information
286325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sax:  a SAX handler for the resulting events
286335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @user_data:  the context to provide to the SAX handler.
286345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
286355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate an input based on a flow of SAX event from the parser
286365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and forward the events to the @sax handler with the provided @user_data
286375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the user provided @sax handler must be a SAX2 one.
286385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
286395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the document is schemas valid, a positive error code
286405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     number otherwise and -1 in case of internal or API error.
286415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
286425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
286435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
286445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlParserInputBufferPtr input, xmlCharEncoding enc,
286455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlSAXHandlerPtr sax, void *user_data)
286465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
286475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSchemaSAXPlugPtr plug = NULL;
286485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr old_sax = NULL;
286495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr pctxt = NULL;
286505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr inputStream = NULL;
286515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
286525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (input == NULL))
286545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
286555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
286575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * prepare the parser
286585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
286595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt = xmlNewParserCtxt();
286605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt == NULL)
286615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
286625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_sax = pctxt->sax;
286635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->sax = sax;
286645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->userData = user_data;
286655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
286665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (options)
286675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtUseOptions(pctxt, options);
286685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
286695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pctxt->linenumbers = 1;
286705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream = xmlNewIOInputStream(pctxt, input, enc);;
286725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inputStream == NULL) {
286735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = -1;
286745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
286755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
286765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputPush(pctxt, inputStream);
286775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->parserCtxt = pctxt;
286785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->input = input;
286795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
286815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Plug the validation and launch the parsing
286825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
286835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData));
286845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plug == NULL) {
286855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = -1;
286865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto done;
286875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
286885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->input = input;
286895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->enc = enc;
286905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->sax = pctxt->sax;
286915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
286925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaVStart(ctxt);
286935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
286955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = ctxt->parserCtxt->errNo;
286965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == 0)
286975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
286985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
286995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
287015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->parserCtxt = NULL;
287025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->sax = NULL;
287035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->input = NULL;
287045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plug != NULL) {
287055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSchemaSAXUnplug(plug);
287065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
287075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* cleanup */
287085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pctxt != NULL) {
287095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pctxt->sax = old_sax;
287105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeParserCtxt(pctxt);
287115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
287125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
287135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
287145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
287165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidateFile:
287175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema validation context
287185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename: the URI of the instance
287195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a future set of options, currently unused
287205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
287215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a schemas validation of the given resource, it will use the
287225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SAX streamable validation internally.
287235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
287245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the document is valid, a positive error code
287255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     number otherwise and -1 in case of an internal or API error.
287265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
287275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
287285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
287295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char * filename,
287305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      int options ATTRIBUTE_UNUSED)
287315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
287325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
287335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr input;
287345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (filename == NULL))
287365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
287375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = xmlParserInputBufferCreateFilename(filename,
287395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_CHAR_ENCODING_NONE);
287405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input == NULL)
287415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
287425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE,
287435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NULL, NULL);
287445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
287455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
287465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
287485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSchemaValidCtxtGetParserCtxt:
287495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a schema validation context
287505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
287515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allow access to the parser context of the schema validation context
287525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
287535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the parser context of the schema validation context or NULL
287545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
287555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
287565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserCtxtPtr
287575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
287585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
287595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
287605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
287615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ctxt->parserCtxt);
287625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
287635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_xmlschemas
287655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
287665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SCHEMAS_ENABLED */
28767