Annotation of embedaddon/libxml2/xmlschemas.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * schemas.c : implementation of the XML Schema handling and
        !             3:  *             schema validity checking
        !             4:  *
        !             5:  * See Copyright for the status of this software.
        !             6:  *
        !             7:  * Daniel Veillard <veillard@redhat.com>
        !             8:  */
        !             9: 
        !            10: /*
        !            11:  * TODO:
        !            12:  *   - when types are redefined in includes, check that all
        !            13:  *     types in the redef list are equal
        !            14:  *     -> need a type equality operation.
        !            15:  *   - if we don't intend to use the schema for schemas, we
        !            16:  *     need to validate all schema attributes (ref, type, name)
        !            17:  *     against their types.
        !            18:  *   - Eliminate item creation for: ??
        !            19:  *
        !            20:  * URGENT TODO:
        !            21:  *   - For xsi-driven schema acquisition, augment the IDCs after every
        !            22:  *     acquisition episode (xmlSchemaAugmentIDC).
        !            23:  *
        !            24:  * NOTES:
        !            25:  *   - Elimated item creation for: <restriction>, <extension>,
        !            26:  *     <simpleContent>, <complexContent>, <list>, <union>
        !            27:  *
        !            28:  * PROBLEMS:
        !            29:  *   - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html
        !            30:  *     IDC XPath expression and chameleon includes: the targetNamespace is changed, so
        !            31:  *     XPath will have trouble to resolve to this namespace, since not known.
        !            32:  *
        !            33:  *
        !            34:  * CONSTRAINTS:
        !            35:  *
        !            36:  * Schema Component Constraint:
        !            37:  *   All Group Limited (cos-all-limited)
        !            38:  *   Status: complete
        !            39:  *   (1.2)
        !            40:  *     In xmlSchemaGroupDefReferenceTermFixup() and
        !            41:  *   (2)
        !            42:  *     In xmlSchemaParseModelGroup()
        !            43:  *     TODO: Actually this should go to component-level checks,
        !            44:  *     but is done here due to performance. Move it to an other layer
        !            45:  *     is schema construction via an API is implemented.
        !            46:  */
        !            47: #define IN_LIBXML
        !            48: #include "libxml.h"
        !            49: 
        !            50: #ifdef LIBXML_SCHEMAS_ENABLED
        !            51: 
        !            52: #include <string.h>
        !            53: #include <libxml/xmlmemory.h>
        !            54: #include <libxml/parser.h>
        !            55: #include <libxml/parserInternals.h>
        !            56: #include <libxml/hash.h>
        !            57: #include <libxml/uri.h>
        !            58: #include <libxml/xmlschemas.h>
        !            59: #include <libxml/schemasInternals.h>
        !            60: #include <libxml/xmlschemastypes.h>
        !            61: #include <libxml/xmlautomata.h>
        !            62: #include <libxml/xmlregexp.h>
        !            63: #include <libxml/dict.h>
        !            64: #include <libxml/encoding.h>
        !            65: #include <libxml/xmlIO.h>
        !            66: #ifdef LIBXML_PATTERN_ENABLED
        !            67: #include <libxml/pattern.h>
        !            68: #endif
        !            69: #ifdef LIBXML_READER_ENABLED
        !            70: #include <libxml/xmlreader.h>
        !            71: #endif
        !            72: 
        !            73: /* #define DEBUG 1 */
        !            74: 
        !            75: /* #define DEBUG_CONTENT 1 */
        !            76: 
        !            77: /* #define DEBUG_TYPE 1 */
        !            78: 
        !            79: /* #define DEBUG_CONTENT_REGEXP 1 */
        !            80: 
        !            81: /* #define DEBUG_AUTOMATA 1 */
        !            82: 
        !            83: /* #define DEBUG_IDC */
        !            84: 
        !            85: /* #define DEBUG_IDC_NODE_TABLE */
        !            86: 
        !            87: /* #define WXS_ELEM_DECL_CONS_ENABLED */
        !            88: 
        !            89: #ifdef DEBUG_IDC
        !            90:  #ifndef DEBUG_IDC_NODE_TABLE
        !            91:   #define DEBUG_IDC_NODE_TABLE
        !            92:  #endif
        !            93: #endif
        !            94: 
        !            95: /* #define ENABLE_PARTICLE_RESTRICTION 1 */
        !            96: 
        !            97: #define ENABLE_REDEFINE
        !            98: 
        !            99: /* #define ENABLE_NAMED_LOCALS */
        !           100: 
        !           101: /* #define ENABLE_IDC_NODE_TABLES_TEST */
        !           102: 
        !           103: #define DUMP_CONTENT_MODEL
        !           104: 
        !           105: #ifdef LIBXML_READER_ENABLED
        !           106: /* #define XML_SCHEMA_READER_ENABLED */
        !           107: #endif
        !           108: 
        !           109: #define UNBOUNDED (1 << 30)
        !           110: #define TODO                                                           \
        !           111:     xmlGenericError(xmlGenericErrorContext,                            \
        !           112:            "Unimplemented block at %s:%d\n",                           \
        !           113:             __FILE__, __LINE__);
        !           114: 
        !           115: #define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
        !           116: 
        !           117: /*
        !           118:  * The XML Schemas namespaces
        !           119:  */
        !           120: static const xmlChar *xmlSchemaNs = (const xmlChar *)
        !           121:     "http://www.w3.org/2001/XMLSchema";
        !           122: 
        !           123: static const xmlChar *xmlSchemaInstanceNs = (const xmlChar *)
        !           124:     "http://www.w3.org/2001/XMLSchema-instance";
        !           125: 
        !           126: static const xmlChar *xmlNamespaceNs = (const xmlChar *)
        !           127:     "http://www.w3.org/2000/xmlns/";
        !           128: 
        !           129: /*
        !           130: * Come casting macros.
        !           131: */
        !           132: #define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
        !           133: #define PCTXT_CAST (xmlSchemaParserCtxtPtr)
        !           134: #define VCTXT_CAST (xmlSchemaValidCtxtPtr)
        !           135: #define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
        !           136: #define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
        !           137: #define WXS_PTC_CAST (xmlSchemaParticlePtr)
        !           138: #define WXS_TYPE_CAST (xmlSchemaTypePtr)
        !           139: #define WXS_ELEM_CAST (xmlSchemaElementPtr)
        !           140: #define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
        !           141: #define WXS_ATTR_CAST (xmlSchemaAttributePtr)
        !           142: #define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
        !           143: #define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
        !           144: #define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
        !           145: #define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
        !           146: #define WXS_IDC_CAST (xmlSchemaIDCPtr)
        !           147: #define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
        !           148: #define WXS_LIST_CAST (xmlSchemaItemListPtr)
        !           149: 
        !           150: /*
        !           151: * Macros to query common properties of components.
        !           152: */
        !           153: #define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
        !           154: 
        !           155: #define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
        !           156: /*
        !           157: * Macros for element declarations.
        !           158: */
        !           159: #define WXS_ELEM_TYPEDEF(e) (e)->subtypes
        !           160: 
        !           161: #define WXS_SUBST_HEAD(item) (item)->refDecl
        !           162: /*
        !           163: * Macros for attribute declarations.
        !           164: */
        !           165: #define WXS_ATTR_TYPEDEF(a) (a)->subtypes
        !           166: /*
        !           167: * Macros for attribute uses.
        !           168: */
        !           169: #define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl
        !           170: 
        !           171: #define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
        !           172: 
        !           173: #define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
        !           174: 
        !           175: #define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
        !           176: /*
        !           177: * Macros for attribute groups.
        !           178: */
        !           179: #define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
        !           180: #define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
        !           181: /*
        !           182: * Macros for particles.
        !           183: */
        !           184: #define WXS_PARTICLE(p) WXS_PTC_CAST (p)
        !           185: 
        !           186: #define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
        !           187: 
        !           188: #define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
        !           189: 
        !           190: #define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
        !           191: /*
        !           192: * Macros for model groups definitions.
        !           193: */
        !           194: #define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
        !           195: /*
        !           196: * Macros for model groups.
        !           197: */
        !           198: #define WXS_IS_MODEL_GROUP(i) \
        !           199:     (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
        !           200:      ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
        !           201:      ((i)->type == XML_SCHEMA_TYPE_ALL))
        !           202: 
        !           203: #define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
        !           204: /*
        !           205: * Macros for schema buckets.
        !           206: */
        !           207: #define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
        !           208:     ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
        !           209: 
        !           210: #define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
        !           211:     ((t) == XML_SCHEMA_SCHEMA_IMPORT))
        !           212: 
        !           213: #define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
        !           214: 
        !           215: #define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
        !           216: /*
        !           217: * Macros for complex/simple types.
        !           218: */
        !           219: #define WXS_IS_ANYTYPE(i) \
        !           220:      (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
        !           221:       ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
        !           222: 
        !           223: #define WXS_IS_COMPLEX(i) \
        !           224:     (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
        !           225:      ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
        !           226: 
        !           227: #define WXS_IS_SIMPLE(item) \
        !           228:     ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
        !           229:      ((item->type == XML_SCHEMA_TYPE_BASIC) && \
        !           230:       (item->builtInType != XML_SCHEMAS_ANYTYPE)))
        !           231: 
        !           232: #define WXS_IS_ANY_SIMPLE_TYPE(i) \
        !           233:     (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
        !           234:       ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
        !           235: 
        !           236: #define WXS_IS_RESTRICTION(t) \
        !           237:     ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
        !           238: 
        !           239: #define WXS_IS_EXTENSION(t) \
        !           240:     ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
        !           241: 
        !           242: #define WXS_IS_TYPE_NOT_FIXED(i) \
        !           243:     (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
        !           244:      (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
        !           245: 
        !           246: #define WXS_IS_TYPE_NOT_FIXED_1(item) \
        !           247:     (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
        !           248:      (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
        !           249: 
        !           250: #define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
        !           251: 
        !           252: #define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
        !           253: /*
        !           254: * Macros for exclusively for complex types.
        !           255: */
        !           256: #define WXS_HAS_COMPLEX_CONTENT(item) \
        !           257:     ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
        !           258:      (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
        !           259:      (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
        !           260: 
        !           261: #define WXS_HAS_SIMPLE_CONTENT(item) \
        !           262:     ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
        !           263:      (item->contentType == XML_SCHEMA_CONTENT_BASIC))
        !           264: 
        !           265: #define WXS_HAS_MIXED_CONTENT(item) \
        !           266:     (item->contentType == XML_SCHEMA_CONTENT_MIXED)
        !           267: 
        !           268: #define WXS_EMPTIABLE(t) \
        !           269:     (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
        !           270: 
        !           271: #define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
        !           272: 
        !           273: #define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
        !           274: 
        !           275: #define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
        !           276: /*
        !           277: * Macros for exclusively for simple types.
        !           278: */
        !           279: #define WXS_LIST_ITEMTYPE(t) (t)->subtypes
        !           280: 
        !           281: #define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
        !           282: 
        !           283: #define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
        !           284: 
        !           285: #define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
        !           286: /*
        !           287: * Misc parser context macros.
        !           288: */
        !           289: #define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
        !           290: 
        !           291: #define WXS_HAS_BUCKETS(ctx) \
        !           292: ( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
        !           293: (WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
        !           294: 
        !           295: #define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
        !           296: 
        !           297: #define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
        !           298: 
        !           299: #define WXS_SCHEMA(ctx) (ctx)->schema
        !           300: 
        !           301: #define WXS_ADD_LOCAL(ctx, item) \
        !           302:     xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item)
        !           303: 
        !           304: #define WXS_ADD_GLOBAL(ctx, item) \
        !           305:     xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item)
        !           306: 
        !           307: #define WXS_ADD_PENDING(ctx, item) \
        !           308:     xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
        !           309: /*
        !           310: * xmlSchemaItemList macros.
        !           311: */
        !           312: #define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
        !           313: /*
        !           314: * Misc macros.
        !           315: */
        !           316: #define IS_SCHEMA(node, type) \
        !           317:    ((node != NULL) && (node->ns != NULL) && \
        !           318:     (xmlStrEqual(node->name, (const xmlChar *) type)) && \
        !           319:     (xmlStrEqual(node->ns->href, xmlSchemaNs)))
        !           320: 
        !           321: #define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
        !           322: 
        !           323: /*
        !           324: * Since we put the default/fixed values into the dict, we can
        !           325: * use pointer comparison for those values.
        !           326: * REMOVED: (xmlStrEqual((v1), (v2)))
        !           327: */
        !           328: #define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
        !           329: 
        !           330: #define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
        !           331: 
        !           332: #define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
        !           333: 
        !           334: #define HFAILURE if (res == -1) goto exit_failure;
        !           335: 
        !           336: #define HERROR if (res != 0) goto exit_error;
        !           337: 
        !           338: #define HSTOP(ctx) if ((ctx)->stop) goto exit;
        !           339: /*
        !           340: * Some flags used for various schema constraints.
        !           341: */
        !           342: #define SUBSET_RESTRICTION  1<<0
        !           343: #define SUBSET_EXTENSION    1<<1
        !           344: #define SUBSET_SUBSTITUTION 1<<2
        !           345: #define SUBSET_LIST         1<<3
        !           346: #define SUBSET_UNION        1<<4
        !           347: 
        !           348: typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
        !           349: typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
        !           350: 
        !           351: typedef struct _xmlSchemaItemList xmlSchemaItemList;
        !           352: typedef xmlSchemaItemList *xmlSchemaItemListPtr;
        !           353: struct _xmlSchemaItemList {
        !           354:     void **items;  /* used for dynamic addition of schemata */
        !           355:     int nbItems; /* used for dynamic addition of schemata */
        !           356:     int sizeItems; /* used for dynamic addition of schemata */
        !           357: };
        !           358: 
        !           359: #define XML_SCHEMA_CTXT_PARSER 1
        !           360: #define XML_SCHEMA_CTXT_VALIDATOR 2
        !           361: 
        !           362: typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
        !           363: typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
        !           364: struct _xmlSchemaAbstractCtxt {
        !           365:     int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */
        !           366: };
        !           367: 
        !           368: typedef struct _xmlSchemaBucket xmlSchemaBucket;
        !           369: typedef xmlSchemaBucket *xmlSchemaBucketPtr;
        !           370: 
        !           371: #define XML_SCHEMA_SCHEMA_MAIN 0
        !           372: #define XML_SCHEMA_SCHEMA_IMPORT 1
        !           373: #define XML_SCHEMA_SCHEMA_INCLUDE 2
        !           374: #define XML_SCHEMA_SCHEMA_REDEFINE 3
        !           375: 
        !           376: /**
        !           377:  * xmlSchemaSchemaRelation:
        !           378:  *
        !           379:  * Used to create a graph of schema relationships.
        !           380:  */
        !           381: typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
        !           382: typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
        !           383: struct _xmlSchemaSchemaRelation {
        !           384:     xmlSchemaSchemaRelationPtr next;
        !           385:     int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */
        !           386:     const xmlChar *importNamespace;
        !           387:     xmlSchemaBucketPtr bucket;
        !           388: };
        !           389: 
        !           390: #define XML_SCHEMA_BUCKET_MARKED 1<<0
        !           391: #define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
        !           392: 
        !           393: struct _xmlSchemaBucket {
        !           394:     int type;
        !           395:     int flags;
        !           396:     const xmlChar *schemaLocation;
        !           397:     const xmlChar *origTargetNamespace;
        !           398:     const xmlChar *targetNamespace;
        !           399:     xmlDocPtr doc;
        !           400:     xmlSchemaSchemaRelationPtr relations;
        !           401:     int located;
        !           402:     int parsed;
        !           403:     int imported;
        !           404:     int preserveDoc;
        !           405:     xmlSchemaItemListPtr globals; /* Global components. */
        !           406:     xmlSchemaItemListPtr locals; /* Local components. */
        !           407: };
        !           408: 
        !           409: /**
        !           410:  * xmlSchemaImport:
        !           411:  * (extends xmlSchemaBucket)
        !           412:  *
        !           413:  * Reflects a schema. Holds some information
        !           414:  * about the schema and its toplevel components. Duplicate
        !           415:  * toplevel components are not checked at this level.
        !           416:  */
        !           417: typedef struct _xmlSchemaImport xmlSchemaImport;
        !           418: typedef xmlSchemaImport *xmlSchemaImportPtr;
        !           419: struct _xmlSchemaImport {
        !           420:     int type; /* Main OR import OR include. */
        !           421:     int flags;
        !           422:     const xmlChar *schemaLocation; /* The URI of the schema document. */
        !           423:     /* For chameleon includes, @origTargetNamespace will be NULL */
        !           424:     const xmlChar *origTargetNamespace;
        !           425:     /*
        !           426:     * For chameleon includes, @targetNamespace will be the
        !           427:     * targetNamespace of the including schema.
        !           428:     */
        !           429:     const xmlChar *targetNamespace;
        !           430:     xmlDocPtr doc; /* The schema node-tree. */
        !           431:     /* @relations will hold any included/imported/redefined schemas. */
        !           432:     xmlSchemaSchemaRelationPtr relations;
        !           433:     int located;
        !           434:     int parsed;
        !           435:     int imported;
        !           436:     int preserveDoc;
        !           437:     xmlSchemaItemListPtr globals;
        !           438:     xmlSchemaItemListPtr locals;
        !           439:     /* The imported schema. */
        !           440:     xmlSchemaPtr schema;
        !           441: };
        !           442: 
        !           443: /*
        !           444: * (extends xmlSchemaBucket)
        !           445: */
        !           446: typedef struct _xmlSchemaInclude xmlSchemaInclude;
        !           447: typedef xmlSchemaInclude *xmlSchemaIncludePtr;
        !           448: struct _xmlSchemaInclude {
        !           449:     int type;
        !           450:     int flags;
        !           451:     const xmlChar *schemaLocation;
        !           452:     const xmlChar *origTargetNamespace;
        !           453:     const xmlChar *targetNamespace;
        !           454:     xmlDocPtr doc;
        !           455:     xmlSchemaSchemaRelationPtr relations;
        !           456:     int located;
        !           457:     int parsed;
        !           458:     int imported;
        !           459:     int preserveDoc;
        !           460:     xmlSchemaItemListPtr globals; /* Global components. */
        !           461:     xmlSchemaItemListPtr locals; /* Local components. */
        !           462: 
        !           463:     /* The owning main or import schema bucket. */
        !           464:     xmlSchemaImportPtr ownerImport;
        !           465: };
        !           466: 
        !           467: /**
        !           468:  * xmlSchemaBasicItem:
        !           469:  *
        !           470:  * The abstract base type for schema components.
        !           471:  */
        !           472: typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
        !           473: typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
        !           474: struct _xmlSchemaBasicItem {
        !           475:     xmlSchemaTypeType type;
        !           476: };
        !           477: 
        !           478: /**
        !           479:  * xmlSchemaAnnotItem:
        !           480:  *
        !           481:  * The abstract base type for annotated schema components.
        !           482:  * (Extends xmlSchemaBasicItem)
        !           483:  */
        !           484: typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
        !           485: typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
        !           486: struct _xmlSchemaAnnotItem {
        !           487:     xmlSchemaTypeType type;
        !           488:     xmlSchemaAnnotPtr annot;
        !           489: };
        !           490: 
        !           491: /**
        !           492:  * xmlSchemaTreeItem:
        !           493:  *
        !           494:  * The abstract base type for tree-like structured schema components.
        !           495:  * (Extends xmlSchemaAnnotItem)
        !           496:  */
        !           497: typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
        !           498: typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
        !           499: struct _xmlSchemaTreeItem {
        !           500:     xmlSchemaTypeType type;
        !           501:     xmlSchemaAnnotPtr annot;
        !           502:     xmlSchemaTreeItemPtr next;
        !           503:     xmlSchemaTreeItemPtr children;
        !           504: };
        !           505: 
        !           506: 
        !           507: #define XML_SCHEMA_ATTR_USE_FIXED 1<<0
        !           508: /**
        !           509:  * xmlSchemaAttributeUsePtr:
        !           510:  *
        !           511:  * The abstract base type for tree-like structured schema components.
        !           512:  * (Extends xmlSchemaTreeItem)
        !           513:  */
        !           514: typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
        !           515: typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
        !           516: struct _xmlSchemaAttributeUse {
        !           517:     xmlSchemaTypeType type;
        !           518:     xmlSchemaAnnotPtr annot;
        !           519:     xmlSchemaAttributeUsePtr next; /* The next attr. use. */
        !           520:     /*
        !           521:     * The attr. decl. OR a QName-ref. to an attr. decl. OR
        !           522:     * a QName-ref. to an attribute group definition.
        !           523:     */
        !           524:     xmlSchemaAttributePtr attrDecl;
        !           525: 
        !           526:     int flags;
        !           527:     xmlNodePtr node;
        !           528:     int occurs; /* required, optional */
        !           529:     const xmlChar * defValue;
        !           530:     xmlSchemaValPtr defVal;
        !           531: };
        !           532: 
        !           533: /**
        !           534:  * xmlSchemaAttributeUseProhibPtr:
        !           535:  *
        !           536:  * A helper component to reflect attribute prohibitions.
        !           537:  * (Extends xmlSchemaBasicItem)
        !           538:  */
        !           539: typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
        !           540: typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
        !           541: struct _xmlSchemaAttributeUseProhib {
        !           542:     xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */
        !           543:     xmlNodePtr node;
        !           544:     const xmlChar *name;
        !           545:     const xmlChar *targetNamespace;
        !           546:     int isRef;
        !           547: };
        !           548: 
        !           549: /**
        !           550:  * xmlSchemaRedef:
        !           551:  */
        !           552: typedef struct _xmlSchemaRedef xmlSchemaRedef;
        !           553: typedef xmlSchemaRedef *xmlSchemaRedefPtr;
        !           554: struct _xmlSchemaRedef {
        !           555:     xmlSchemaRedefPtr next;
        !           556:     xmlSchemaBasicItemPtr item; /* The redefining component. */
        !           557:     xmlSchemaBasicItemPtr reference; /* The referencing component. */
        !           558:     xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */
        !           559:     const xmlChar *refName; /* The name of the to-be-redefined component. */
        !           560:     const xmlChar *refTargetNs; /* The target namespace of the
        !           561:                                    to-be-redefined comp. */
        !           562:     xmlSchemaBucketPtr targetBucket; /* The redefined schema. */
        !           563: };
        !           564: 
        !           565: /**
        !           566:  * xmlSchemaConstructionCtxt:
        !           567:  */
        !           568: typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
        !           569: typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
        !           570: struct _xmlSchemaConstructionCtxt {
        !           571:     xmlSchemaPtr mainSchema; /* The main schema. */
        !           572:     xmlSchemaBucketPtr mainBucket; /* The main schema bucket */
        !           573:     xmlDictPtr dict;
        !           574:     xmlSchemaItemListPtr buckets; /* List of schema buckets. */
        !           575:     /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */
        !           576:     xmlSchemaBucketPtr bucket; /* The current schema bucket */
        !           577:     xmlSchemaItemListPtr pending; /* All Components of all schemas that
        !           578:                                      need to be fixed. */
        !           579:     xmlHashTablePtr substGroups;
        !           580:     xmlSchemaRedefPtr redefs;
        !           581:     xmlSchemaRedefPtr lastRedef;
        !           582: };
        !           583: 
        !           584: #define XML_SCHEMAS_PARSE_ERROR                1
        !           585: #define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
        !           586: 
        !           587: struct _xmlSchemaParserCtxt {
        !           588:     int type;
        !           589:     void *errCtxt;             /* user specific error context */
        !           590:     xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
        !           591:     xmlSchemaValidityWarningFunc warning;       /* the callback in case of warning */
        !           592:     int err;
        !           593:     int nberrors;
        !           594:     xmlStructuredErrorFunc serror;
        !           595: 
        !           596:     xmlSchemaConstructionCtxtPtr constructor;
        !           597:     int ownsConstructor; /* TODO: Move this to parser *flags*. */
        !           598: 
        !           599:     /* xmlSchemaPtr topschema; */
        !           600:     /* xmlHashTablePtr namespaces;  */
        !           601: 
        !           602:     xmlSchemaPtr schema;        /* The main schema in use */
        !           603:     int counter;
        !           604: 
        !           605:     const xmlChar *URL;
        !           606:     xmlDocPtr doc;
        !           607:     int preserve;              /* Whether the doc should be freed  */
        !           608: 
        !           609:     const char *buffer;
        !           610:     int size;
        !           611: 
        !           612:     /*
        !           613:      * Used to build complex element content models
        !           614:      */
        !           615:     xmlAutomataPtr am;
        !           616:     xmlAutomataStatePtr start;
        !           617:     xmlAutomataStatePtr end;
        !           618:     xmlAutomataStatePtr state;
        !           619: 
        !           620:     xmlDictPtr dict;           /* dictionnary for interned string names */
        !           621:     xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */
        !           622:     int options;
        !           623:     xmlSchemaValidCtxtPtr vctxt;
        !           624:     int isS4S;
        !           625:     int isRedefine;
        !           626:     int xsiAssemble;
        !           627:     int stop; /* If the parser should stop; i.e. a critical error. */
        !           628:     const xmlChar *targetNamespace;
        !           629:     xmlSchemaBucketPtr redefined; /* The schema to be redefined. */
        !           630: 
        !           631:     xmlSchemaRedefPtr redef; /* Used for redefinitions. */
        !           632:     int redefCounter; /* Used for redefinitions. */
        !           633:     xmlSchemaItemListPtr attrProhibs;
        !           634: };
        !           635: 
        !           636: /**
        !           637:  * xmlSchemaQNameRef:
        !           638:  *
        !           639:  * A component reference item (not a schema component)
        !           640:  * (Extends xmlSchemaBasicItem)
        !           641:  */
        !           642: typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
        !           643: typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
        !           644: struct _xmlSchemaQNameRef {
        !           645:     xmlSchemaTypeType type;
        !           646:     xmlSchemaBasicItemPtr item; /* The resolved referenced item. */
        !           647:     xmlSchemaTypeType itemType;
        !           648:     const xmlChar *name;
        !           649:     const xmlChar *targetNamespace;
        !           650:     xmlNodePtr node;
        !           651: };
        !           652: 
        !           653: /**
        !           654:  * xmlSchemaParticle:
        !           655:  *
        !           656:  * A particle component.
        !           657:  * (Extends xmlSchemaTreeItem)
        !           658:  */
        !           659: typedef struct _xmlSchemaParticle xmlSchemaParticle;
        !           660: typedef xmlSchemaParticle *xmlSchemaParticlePtr;
        !           661: struct _xmlSchemaParticle {
        !           662:     xmlSchemaTypeType type;
        !           663:     xmlSchemaAnnotPtr annot;
        !           664:     xmlSchemaTreeItemPtr next; /* next particle */
        !           665:     xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group,
        !           666:        a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference),
        !           667:         etc.) */
        !           668:     int minOccurs;
        !           669:     int maxOccurs;
        !           670:     xmlNodePtr node;
        !           671: };
        !           672: 
        !           673: /**
        !           674:  * xmlSchemaModelGroup:
        !           675:  *
        !           676:  * A model group component.
        !           677:  * (Extends xmlSchemaTreeItem)
        !           678:  */
        !           679: typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
        !           680: typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
        !           681: struct _xmlSchemaModelGroup {
        !           682:     xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */
        !           683:     xmlSchemaAnnotPtr annot;
        !           684:     xmlSchemaTreeItemPtr next; /* not used */
        !           685:     xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */
        !           686:     xmlNodePtr node;
        !           687: };
        !           688: 
        !           689: #define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
        !           690: #define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
        !           691: /**
        !           692:  * xmlSchemaModelGroupDef:
        !           693:  *
        !           694:  * A model group definition component.
        !           695:  * (Extends xmlSchemaTreeItem)
        !           696:  */
        !           697: typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
        !           698: typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
        !           699: struct _xmlSchemaModelGroupDef {
        !           700:     xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */
        !           701:     xmlSchemaAnnotPtr annot;
        !           702:     xmlSchemaTreeItemPtr next; /* not used */
        !           703:     xmlSchemaTreeItemPtr children; /* the "model group" */
        !           704:     const xmlChar *name;
        !           705:     const xmlChar *targetNamespace;
        !           706:     xmlNodePtr node;
        !           707:     int flags;
        !           708: };
        !           709: 
        !           710: typedef struct _xmlSchemaIDC xmlSchemaIDC;
        !           711: typedef xmlSchemaIDC *xmlSchemaIDCPtr;
        !           712: 
        !           713: /**
        !           714:  * xmlSchemaIDCSelect:
        !           715:  *
        !           716:  * The identity-constraint "field" and "selector" item, holding the
        !           717:  * XPath expression.
        !           718:  */
        !           719: typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
        !           720: typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
        !           721: struct _xmlSchemaIDCSelect {
        !           722:     xmlSchemaIDCSelectPtr next;
        !           723:     xmlSchemaIDCPtr idc;
        !           724:     int index; /* an index position if significant for IDC key-sequences */
        !           725:     const xmlChar *xpath; /* the XPath expression */
        !           726:     void *xpathComp; /* the compiled XPath expression */
        !           727: };
        !           728: 
        !           729: /**
        !           730:  * xmlSchemaIDC:
        !           731:  *
        !           732:  * The identity-constraint definition component.
        !           733:  * (Extends xmlSchemaAnnotItem)
        !           734:  */
        !           735: 
        !           736: struct _xmlSchemaIDC {
        !           737:     xmlSchemaTypeType type;
        !           738:     xmlSchemaAnnotPtr annot;
        !           739:     xmlSchemaIDCPtr next;
        !           740:     xmlNodePtr node;
        !           741:     const xmlChar *name;
        !           742:     const xmlChar *targetNamespace;
        !           743:     xmlSchemaIDCSelectPtr selector;
        !           744:     xmlSchemaIDCSelectPtr fields;
        !           745:     int nbFields;
        !           746:     xmlSchemaQNameRefPtr ref;
        !           747: };
        !           748: 
        !           749: /**
        !           750:  * xmlSchemaIDCAug:
        !           751:  *
        !           752:  * The augmented IDC information used for validation.
        !           753:  */
        !           754: typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
        !           755: typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
        !           756: struct _xmlSchemaIDCAug {
        !           757:     xmlSchemaIDCAugPtr next; /* next in a list */
        !           758:     xmlSchemaIDCPtr def; /* the IDC definition */
        !           759:     int keyrefDepth; /* the lowest tree level to which IDC
        !           760:                         tables need to be bubbled upwards */
        !           761: };
        !           762: 
        !           763: /**
        !           764:  * xmlSchemaPSVIIDCKeySequence:
        !           765:  *
        !           766:  * The key sequence of a node table item.
        !           767:  */
        !           768: typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
        !           769: typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
        !           770: struct _xmlSchemaPSVIIDCKey {
        !           771:     xmlSchemaTypePtr type;
        !           772:     xmlSchemaValPtr val;
        !           773: };
        !           774: 
        !           775: /**
        !           776:  * xmlSchemaPSVIIDCNode:
        !           777:  *
        !           778:  * The node table item of a node table.
        !           779:  */
        !           780: typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
        !           781: typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
        !           782: struct _xmlSchemaPSVIIDCNode {
        !           783:     xmlNodePtr node;
        !           784:     xmlSchemaPSVIIDCKeyPtr *keys;
        !           785:     int nodeLine;
        !           786:     int nodeQNameID;
        !           787: 
        !           788: };
        !           789: 
        !           790: /**
        !           791:  * xmlSchemaPSVIIDCBinding:
        !           792:  *
        !           793:  * The identity-constraint binding item of the [identity-constraint table].
        !           794:  */
        !           795: typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
        !           796: typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
        !           797: struct _xmlSchemaPSVIIDCBinding {
        !           798:     xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */
        !           799:     xmlSchemaIDCPtr definition; /* the IDC definition */
        !           800:     xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */
        !           801:     int nbNodes; /* number of entries in the node table */
        !           802:     int sizeNodes; /* size of the node table */
        !           803:     xmlSchemaItemListPtr dupls;
        !           804: };
        !           805: 
        !           806: 
        !           807: #define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
        !           808: #define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
        !           809: 
        !           810: #define XPATH_STATE_OBJ_MATCHES -2
        !           811: #define XPATH_STATE_OBJ_BLOCKED -3
        !           812: 
        !           813: typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
        !           814: typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
        !           815: 
        !           816: /**
        !           817:  * xmlSchemaIDCStateObj:
        !           818:  *
        !           819:  * The state object used to evaluate XPath expressions.
        !           820:  */
        !           821: typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
        !           822: typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
        !           823: struct _xmlSchemaIDCStateObj {
        !           824:     int type;
        !           825:     xmlSchemaIDCStateObjPtr next; /* next if in a list */
        !           826:     int depth; /* depth of creation */
        !           827:     int *history; /* list of (depth, state-id) tuples */
        !           828:     int nbHistory;
        !           829:     int sizeHistory;
        !           830:     xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector
        !           831:                                        matcher */
        !           832:     xmlSchemaIDCSelectPtr sel;
        !           833:     void *xpathCtxt;
        !           834: };
        !           835: 
        !           836: #define IDC_MATCHER 0
        !           837: 
        !           838: /**
        !           839:  * xmlSchemaIDCMatcher:
        !           840:  *
        !           841:  * Used to evaluate IDC selectors (and fields).
        !           842:  */
        !           843: struct _xmlSchemaIDCMatcher {
        !           844:     int type;
        !           845:     int depth; /* the tree depth at creation time */
        !           846:     xmlSchemaIDCMatcherPtr next; /* next in the list */
        !           847:     xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */
        !           848:     xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */
        !           849:     int idcType;
        !           850:     xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target
        !           851:                                          elements */
        !           852:     int sizeKeySeqs;
        !           853:     xmlSchemaItemListPtr targets; /* list of target-node
        !           854:                                      (xmlSchemaPSVIIDCNodePtr) entries */
        !           855: };
        !           856: 
        !           857: /*
        !           858: * Element info flags.
        !           859: */
        !           860: #define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES  1<<0
        !           861: #define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
        !           862: #define XML_SCHEMA_ELEM_INFO_NILLED           1<<2
        !           863: #define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE               1<<3
        !           864: 
        !           865: #define XML_SCHEMA_NODE_INFO_VALUE_NEEDED      1<<4
        !           866: #define XML_SCHEMA_ELEM_INFO_EMPTY             1<<5
        !           867: #define XML_SCHEMA_ELEM_INFO_HAS_CONTENT       1<<6
        !           868: 
        !           869: #define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT  1<<7
        !           870: #define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT  1<<8
        !           871: #define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED  1<<9
        !           872: #define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE  1<<10
        !           873: 
        !           874: /**
        !           875:  * xmlSchemaNodeInfo:
        !           876:  *
        !           877:  * Holds information of an element node.
        !           878:  */
        !           879: struct _xmlSchemaNodeInfo {
        !           880:     int nodeType;
        !           881:     xmlNodePtr node;
        !           882:     int nodeLine;
        !           883:     const xmlChar *localName;
        !           884:     const xmlChar *nsName;
        !           885:     const xmlChar *value;
        !           886:     xmlSchemaValPtr val; /* the pre-computed value if any */
        !           887:     xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
        !           888: 
        !           889:     int flags; /* combination of node info flags */
        !           890: 
        !           891:     int valNeeded;
        !           892:     int normVal;
        !           893: 
        !           894:     xmlSchemaElementPtr decl; /* the element/attribute declaration */
        !           895:     int depth;
        !           896:     xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings
        !           897:                                             for the scope element*/
        !           898:     xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope
        !           899:                                            element */
        !           900:     xmlRegExecCtxtPtr regexCtxt;
        !           901: 
        !           902:     const xmlChar **nsBindings; /* Namespace bindings on this element */
        !           903:     int nbNsBindings;
        !           904:     int sizeNsBindings;
        !           905: 
        !           906:     int hasKeyrefs;
        !           907:     int appliedXPath; /* Indicates that an XPath has been applied. */
        !           908: };
        !           909: 
        !           910: #define XML_SCHEMAS_ATTR_UNKNOWN 1
        !           911: #define XML_SCHEMAS_ATTR_ASSESSED 2
        !           912: #define XML_SCHEMAS_ATTR_PROHIBITED 3
        !           913: #define XML_SCHEMAS_ATTR_ERR_MISSING 4
        !           914: #define XML_SCHEMAS_ATTR_INVALID_VALUE 5
        !           915: #define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
        !           916: #define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
        !           917: #define XML_SCHEMAS_ATTR_DEFAULT 8
        !           918: #define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
        !           919: #define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
        !           920: #define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
        !           921: #define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
        !           922: #define XML_SCHEMAS_ATTR_WILD_SKIP 13
        !           923: #define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
        !           924: #define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
        !           925: #define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
        !           926: #define XML_SCHEMAS_ATTR_META 17
        !           927: /*
        !           928: * @metaType values of xmlSchemaAttrInfo.
        !           929: */
        !           930: #define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
        !           931: #define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
        !           932: #define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
        !           933: #define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
        !           934: #define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
        !           935: 
        !           936: typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
        !           937: typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
        !           938: struct _xmlSchemaAttrInfo {
        !           939:     int nodeType;
        !           940:     xmlNodePtr node;
        !           941:     int nodeLine;
        !           942:     const xmlChar *localName;
        !           943:     const xmlChar *nsName;
        !           944:     const xmlChar *value;
        !           945:     xmlSchemaValPtr val; /* the pre-computed value if any */
        !           946:     xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
        !           947:     int flags; /* combination of node info flags */
        !           948: 
        !           949:     xmlSchemaAttributePtr decl; /* the attribute declaration */
        !           950:     xmlSchemaAttributeUsePtr use;  /* the attribute use */
        !           951:     int state;
        !           952:     int metaType;
        !           953:     const xmlChar *vcValue; /* the value constraint value */
        !           954:     xmlSchemaNodeInfoPtr parent;
        !           955: };
        !           956: 
        !           957: 
        !           958: #define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
        !           959: /**
        !           960:  * xmlSchemaValidCtxt:
        !           961:  *
        !           962:  * A Schemas validation context
        !           963:  */
        !           964: struct _xmlSchemaValidCtxt {
        !           965:     int type;
        !           966:     void *errCtxt;             /* user specific data block */
        !           967:     xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
        !           968:     xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */
        !           969:     xmlStructuredErrorFunc serror;
        !           970: 
        !           971:     xmlSchemaPtr schema;        /* The schema in use */
        !           972:     xmlDocPtr doc;
        !           973:     xmlParserInputBufferPtr input;
        !           974:     xmlCharEncoding enc;
        !           975:     xmlSAXHandlerPtr sax;
        !           976:     xmlParserCtxtPtr parserCtxt;
        !           977:     void *user_data; /* TODO: What is this for? */
        !           978: 
        !           979:     int err;
        !           980:     int nberrors;
        !           981: 
        !           982:     xmlNodePtr node;
        !           983:     xmlNodePtr cur;
        !           984:     /* xmlSchemaTypePtr type; */
        !           985: 
        !           986:     xmlRegExecCtxtPtr regexp;
        !           987:     xmlSchemaValPtr value;
        !           988: 
        !           989:     int valueWS;
        !           990:     int options;
        !           991:     xmlNodePtr validationRoot;
        !           992:     xmlSchemaParserCtxtPtr pctxt;
        !           993:     int xsiAssemble;
        !           994: 
        !           995:     int depth;
        !           996:     xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */
        !           997:     int sizeElemInfos;
        !           998:     xmlSchemaNodeInfoPtr inode; /* the current element information */
        !           999: 
        !          1000:     xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */
        !          1001: 
        !          1002:     xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */
        !          1003:     xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */
        !          1004:     xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */
        !          1005: 
        !          1006:     xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/
        !          1007:     int nbIdcNodes;
        !          1008:     int sizeIdcNodes;
        !          1009: 
        !          1010:     xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */
        !          1011:     int nbIdcKeys;
        !          1012:     int sizeIdcKeys;
        !          1013: 
        !          1014:     int flags;
        !          1015: 
        !          1016:     xmlDictPtr dict;
        !          1017: 
        !          1018: #ifdef LIBXML_READER_ENABLED
        !          1019:     xmlTextReaderPtr reader;
        !          1020: #endif
        !          1021: 
        !          1022:     xmlSchemaAttrInfoPtr *attrInfos;
        !          1023:     int nbAttrInfos;
        !          1024:     int sizeAttrInfos;
        !          1025: 
        !          1026:     int skipDepth;
        !          1027:     xmlSchemaItemListPtr nodeQNames;
        !          1028:     int hasKeyrefs;
        !          1029:     int createIDCNodeTables;
        !          1030:     int psviExposeIDCNodeTables;
        !          1031: };
        !          1032: 
        !          1033: /**
        !          1034:  * xmlSchemaSubstGroup:
        !          1035:  *
        !          1036:  *
        !          1037:  */
        !          1038: typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
        !          1039: typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
        !          1040: struct _xmlSchemaSubstGroup {
        !          1041:     xmlSchemaElementPtr head;
        !          1042:     xmlSchemaItemListPtr members;
        !          1043: };
        !          1044: 
        !          1045: /************************************************************************
        !          1046:  *                                                                     *
        !          1047:  *                     Some predeclarations                            *
        !          1048:  *                                                                     *
        !          1049:  ************************************************************************/
        !          1050: 
        !          1051: static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
        !          1052:                                  xmlSchemaPtr schema,
        !          1053:                                  xmlNodePtr node);
        !          1054: static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
        !          1055:                                  xmlSchemaPtr schema,
        !          1056:                                  xmlNodePtr node);
        !          1057: static int
        !          1058: xmlSchemaTypeFixup(xmlSchemaTypePtr type,
        !          1059:                    xmlSchemaAbstractCtxtPtr ctxt);
        !          1060: static const xmlChar *
        !          1061: xmlSchemaFacetTypeToString(xmlSchemaTypeType type);
        !          1062: static int
        !          1063: xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          1064:                      xmlNodePtr node);
        !          1065: static int
        !          1066: xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
        !          1067:                        xmlSchemaParserCtxtPtr ctxt);
        !          1068: static void
        !          1069: xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
        !          1070: static xmlSchemaWhitespaceValueType
        !          1071: xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type);
        !          1072: static xmlSchemaTreeItemPtr
        !          1073: xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          1074:                         xmlNodePtr node, xmlSchemaTypeType type,
        !          1075:                         int withParticle);
        !          1076: static const xmlChar *
        !          1077: xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item);
        !          1078: static xmlSchemaTypeLinkPtr
        !          1079: xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type);
        !          1080: static void
        !          1081: xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
        !          1082:                     const char *funcName,
        !          1083:                     const char *message);
        !          1084: static int
        !          1085: xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
        !          1086:                             xmlSchemaTypePtr type,
        !          1087:                             xmlSchemaTypePtr baseType,
        !          1088:                             int subset);
        !          1089: static void
        !          1090: xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
        !          1091:                                   xmlSchemaParserCtxtPtr ctxt);
        !          1092: static void
        !          1093: xmlSchemaComponentListFree(xmlSchemaItemListPtr list);
        !          1094: static xmlSchemaQNameRefPtr
        !          1095: xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
        !          1096:                                xmlSchemaPtr schema,
        !          1097:                                xmlNodePtr node);
        !          1098: 
        !          1099: /************************************************************************
        !          1100:  *                                                                     *
        !          1101:  *                     Helper functions                                *
        !          1102:  *                                                                     *
        !          1103:  ************************************************************************/
        !          1104: 
        !          1105: /**
        !          1106:  * xmlSchemaItemTypeToStr:
        !          1107:  * @type: the type of the schema item
        !          1108:  *
        !          1109:  * Returns the component name of a schema item.
        !          1110:  */
        !          1111: static const xmlChar *
        !          1112: xmlSchemaItemTypeToStr(xmlSchemaTypeType type)
        !          1113: {
        !          1114:     switch (type) {
        !          1115:        case XML_SCHEMA_TYPE_BASIC:
        !          1116:            return(BAD_CAST "simple type definition");
        !          1117:        case XML_SCHEMA_TYPE_SIMPLE:
        !          1118:            return(BAD_CAST "simple type definition");
        !          1119:        case XML_SCHEMA_TYPE_COMPLEX:
        !          1120:            return(BAD_CAST "complex type definition");
        !          1121:        case XML_SCHEMA_TYPE_ELEMENT:
        !          1122:            return(BAD_CAST "element declaration");
        !          1123:        case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          1124:            return(BAD_CAST "attribute use");
        !          1125:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          1126:            return(BAD_CAST "attribute declaration");
        !          1127:        case XML_SCHEMA_TYPE_GROUP:
        !          1128:            return(BAD_CAST "model group definition");
        !          1129:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1130:            return(BAD_CAST "attribute group definition");
        !          1131:        case XML_SCHEMA_TYPE_NOTATION:
        !          1132:            return(BAD_CAST "notation declaration");
        !          1133:        case XML_SCHEMA_TYPE_SEQUENCE:
        !          1134:            return(BAD_CAST "model group (sequence)");
        !          1135:        case XML_SCHEMA_TYPE_CHOICE:
        !          1136:            return(BAD_CAST "model group (choice)");
        !          1137:        case XML_SCHEMA_TYPE_ALL:
        !          1138:            return(BAD_CAST "model group (all)");
        !          1139:        case XML_SCHEMA_TYPE_PARTICLE:
        !          1140:            return(BAD_CAST "particle");
        !          1141:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1142:            return(BAD_CAST "unique identity-constraint");
        !          1143:            /* return(BAD_CAST "IDC (unique)"); */
        !          1144:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1145:            return(BAD_CAST "key identity-constraint");
        !          1146:            /* return(BAD_CAST "IDC (key)"); */
        !          1147:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1148:            return(BAD_CAST "keyref identity-constraint");
        !          1149:            /* return(BAD_CAST "IDC (keyref)"); */
        !          1150:        case XML_SCHEMA_TYPE_ANY:
        !          1151:            return(BAD_CAST "wildcard (any)");
        !          1152:        case XML_SCHEMA_EXTRA_QNAMEREF:
        !          1153:            return(BAD_CAST "[helper component] QName reference");
        !          1154:        case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
        !          1155:            return(BAD_CAST "[helper component] attribute use prohibition");
        !          1156:        default:
        !          1157:            return(BAD_CAST "Not a schema component");
        !          1158:     }
        !          1159: }
        !          1160: 
        !          1161: /**
        !          1162:  * xmlSchemaGetComponentTypeStr:
        !          1163:  * @type: the type of the schema item
        !          1164:  *
        !          1165:  * Returns the component name of a schema item.
        !          1166:  */
        !          1167: static const xmlChar *
        !          1168: xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item)
        !          1169: {
        !          1170:     switch (item->type) {
        !          1171:        case XML_SCHEMA_TYPE_BASIC:
        !          1172:            if (WXS_IS_COMPLEX(WXS_TYPE_CAST item))
        !          1173:                return(BAD_CAST "complex type definition");
        !          1174:            else
        !          1175:                return(BAD_CAST "simple type definition");
        !          1176:        default:
        !          1177:            return(xmlSchemaItemTypeToStr(item->type));
        !          1178:     }
        !          1179: }
        !          1180: 
        !          1181: /**
        !          1182:  * xmlSchemaGetComponentNode:
        !          1183:  * @item: a schema component
        !          1184:  *
        !          1185:  * Returns node associated with the schema component.
        !          1186:  * NOTE that such a node need not be available; plus, a component's
        !          1187:  * node need not to reflect the component directly, since there is no
        !          1188:  * one-to-one relationship between the XML Schema representation and
        !          1189:  * the component representation.
        !          1190:  */
        !          1191: static xmlNodePtr
        !          1192: xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item)
        !          1193: {
        !          1194:     switch (item->type) {
        !          1195:        case XML_SCHEMA_TYPE_ELEMENT:
        !          1196:            return (((xmlSchemaElementPtr) item)->node);
        !          1197:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          1198:            return (((xmlSchemaAttributePtr) item)->node);
        !          1199:        case XML_SCHEMA_TYPE_COMPLEX:
        !          1200:        case XML_SCHEMA_TYPE_SIMPLE:
        !          1201:            return (((xmlSchemaTypePtr) item)->node);
        !          1202:        case XML_SCHEMA_TYPE_ANY:
        !          1203:        case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
        !          1204:            return (((xmlSchemaWildcardPtr) item)->node);
        !          1205:        case XML_SCHEMA_TYPE_PARTICLE:
        !          1206:            return (((xmlSchemaParticlePtr) item)->node);
        !          1207:        case XML_SCHEMA_TYPE_SEQUENCE:
        !          1208:        case XML_SCHEMA_TYPE_CHOICE:
        !          1209:        case XML_SCHEMA_TYPE_ALL:
        !          1210:            return (((xmlSchemaModelGroupPtr) item)->node);
        !          1211:        case XML_SCHEMA_TYPE_GROUP:
        !          1212:            return (((xmlSchemaModelGroupDefPtr) item)->node);
        !          1213:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1214:            return (((xmlSchemaAttributeGroupPtr) item)->node);
        !          1215:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1216:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1217:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1218:            return (((xmlSchemaIDCPtr) item)->node);
        !          1219:        case XML_SCHEMA_EXTRA_QNAMEREF:
        !          1220:            return(((xmlSchemaQNameRefPtr) item)->node);
        !          1221:        /* TODO: What to do with NOTATIONs?
        !          1222:        case XML_SCHEMA_TYPE_NOTATION:
        !          1223:            return (((xmlSchemaNotationPtr) item)->node);
        !          1224:        */
        !          1225:        case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          1226:            return (((xmlSchemaAttributeUsePtr) item)->node);
        !          1227:        default:
        !          1228:            return (NULL);
        !          1229:     }
        !          1230: }
        !          1231: 
        !          1232: #if 0
        !          1233: /**
        !          1234:  * xmlSchemaGetNextComponent:
        !          1235:  * @item: a schema component
        !          1236:  *
        !          1237:  * Returns the next sibling of the schema component.
        !          1238:  */
        !          1239: static xmlSchemaBasicItemPtr
        !          1240: xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item)
        !          1241: {
        !          1242:     switch (item->type) {
        !          1243:        case XML_SCHEMA_TYPE_ELEMENT:
        !          1244:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next);
        !          1245:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          1246:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next);
        !          1247:        case XML_SCHEMA_TYPE_COMPLEX:
        !          1248:        case XML_SCHEMA_TYPE_SIMPLE:
        !          1249:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next);
        !          1250:        case XML_SCHEMA_TYPE_ANY:
        !          1251:        case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
        !          1252:            return (NULL);
        !          1253:        case XML_SCHEMA_TYPE_PARTICLE:
        !          1254:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next);
        !          1255:        case XML_SCHEMA_TYPE_SEQUENCE:
        !          1256:        case XML_SCHEMA_TYPE_CHOICE:
        !          1257:        case XML_SCHEMA_TYPE_ALL:
        !          1258:            return (NULL);
        !          1259:        case XML_SCHEMA_TYPE_GROUP:
        !          1260:            return (NULL);
        !          1261:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1262:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next);
        !          1263:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1264:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1265:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1266:            return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next);
        !          1267:        default:
        !          1268:            return (NULL);
        !          1269:     }
        !          1270: }
        !          1271: #endif
        !          1272: 
        !          1273: 
        !          1274: /**
        !          1275:  * xmlSchemaFormatQName:
        !          1276:  * @buf: the string buffer
        !          1277:  * @namespaceName:  the namespace name
        !          1278:  * @localName: the local name
        !          1279:  *
        !          1280:  * Returns the given QName in the format "{namespaceName}localName" or
        !          1281:  * just "localName" if @namespaceName is NULL.
        !          1282:  *
        !          1283:  * Returns the localName if @namespaceName is NULL, a formatted
        !          1284:  * string otherwise.
        !          1285:  */
        !          1286: static const xmlChar*
        !          1287: xmlSchemaFormatQName(xmlChar **buf,
        !          1288:                     const xmlChar *namespaceName,
        !          1289:                     const xmlChar *localName)
        !          1290: {
        !          1291:     FREE_AND_NULL(*buf)
        !          1292:     if (namespaceName != NULL) {
        !          1293:        *buf = xmlStrdup(BAD_CAST "{");
        !          1294:        *buf = xmlStrcat(*buf, namespaceName);
        !          1295:        *buf = xmlStrcat(*buf, BAD_CAST "}");
        !          1296:     }
        !          1297:     if (localName != NULL) {
        !          1298:        if (namespaceName == NULL)
        !          1299:            return(localName);
        !          1300:        *buf = xmlStrcat(*buf, localName);
        !          1301:     } else {
        !          1302:        *buf = xmlStrcat(*buf, BAD_CAST "(NULL)");
        !          1303:     }
        !          1304:     return ((const xmlChar *) *buf);
        !          1305: }
        !          1306: 
        !          1307: static const xmlChar*
        !          1308: xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName)
        !          1309: {
        !          1310:     if (ns != NULL)
        !          1311:        return (xmlSchemaFormatQName(buf, ns->href, localName));
        !          1312:     else
        !          1313:        return (xmlSchemaFormatQName(buf, NULL, localName));
        !          1314: }
        !          1315: 
        !          1316: static const xmlChar *
        !          1317: xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item)
        !          1318: {
        !          1319:     switch (item->type) {
        !          1320:        case XML_SCHEMA_TYPE_ELEMENT:
        !          1321:            return (((xmlSchemaElementPtr) item)->name);
        !          1322:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          1323:            return (((xmlSchemaAttributePtr) item)->name);
        !          1324:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1325:            return (((xmlSchemaAttributeGroupPtr) item)->name);
        !          1326:        case XML_SCHEMA_TYPE_BASIC:
        !          1327:        case XML_SCHEMA_TYPE_SIMPLE:
        !          1328:        case XML_SCHEMA_TYPE_COMPLEX:
        !          1329:            return (((xmlSchemaTypePtr) item)->name);
        !          1330:        case XML_SCHEMA_TYPE_GROUP:
        !          1331:            return (((xmlSchemaModelGroupDefPtr) item)->name);
        !          1332:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1333:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1334:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1335:            return (((xmlSchemaIDCPtr) item)->name);
        !          1336:        case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          1337:            if (WXS_ATTRUSE_DECL(item) != NULL) {
        !          1338:                return(xmlSchemaGetComponentName(
        !          1339:                    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
        !          1340:            } else
        !          1341:                return(NULL);
        !          1342:        case XML_SCHEMA_EXTRA_QNAMEREF:
        !          1343:            return (((xmlSchemaQNameRefPtr) item)->name);
        !          1344:        case XML_SCHEMA_TYPE_NOTATION:
        !          1345:            return (((xmlSchemaNotationPtr) item)->name);
        !          1346:        default:
        !          1347:            /*
        !          1348:            * Other components cannot have names.
        !          1349:            */
        !          1350:            break;
        !          1351:     }
        !          1352:     return (NULL);
        !          1353: }
        !          1354: 
        !          1355: #define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
        !          1356: #define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
        !          1357: /*
        !          1358: static const xmlChar *
        !          1359: xmlSchemaGetQNameRefName(void *ref)
        !          1360: {
        !          1361:     return(((xmlSchemaQNameRefPtr) ref)->name);
        !          1362: }
        !          1363: 
        !          1364: static const xmlChar *
        !          1365: xmlSchemaGetQNameRefTargetNs(void *ref)
        !          1366: {
        !          1367:     return(((xmlSchemaQNameRefPtr) ref)->targetNamespace);
        !          1368: }
        !          1369: */
        !          1370: 
        !          1371: static const xmlChar *
        !          1372: xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item)
        !          1373: {
        !          1374:     switch (item->type) {
        !          1375:        case XML_SCHEMA_TYPE_ELEMENT:
        !          1376:            return (((xmlSchemaElementPtr) item)->targetNamespace);
        !          1377:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          1378:            return (((xmlSchemaAttributePtr) item)->targetNamespace);
        !          1379:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1380:            return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace);
        !          1381:        case XML_SCHEMA_TYPE_BASIC:
        !          1382:            return (BAD_CAST "http://www.w3.org/2001/XMLSchema");
        !          1383:        case XML_SCHEMA_TYPE_SIMPLE:
        !          1384:        case XML_SCHEMA_TYPE_COMPLEX:
        !          1385:            return (((xmlSchemaTypePtr) item)->targetNamespace);
        !          1386:        case XML_SCHEMA_TYPE_GROUP:
        !          1387:            return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace);
        !          1388:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1389:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1390:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1391:            return (((xmlSchemaIDCPtr) item)->targetNamespace);
        !          1392:        case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          1393:            if (WXS_ATTRUSE_DECL(item) != NULL) {
        !          1394:                return(xmlSchemaGetComponentTargetNs(
        !          1395:                    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
        !          1396:            }
        !          1397:            /* TODO: Will returning NULL break something? */
        !          1398:            break;
        !          1399:        case XML_SCHEMA_EXTRA_QNAMEREF:
        !          1400:            return (((xmlSchemaQNameRefPtr) item)->targetNamespace);
        !          1401:        case XML_SCHEMA_TYPE_NOTATION:
        !          1402:            return (((xmlSchemaNotationPtr) item)->targetNamespace);
        !          1403:        default:
        !          1404:            /*
        !          1405:            * Other components cannot have names.
        !          1406:            */
        !          1407:            break;
        !          1408:     }
        !          1409:     return (NULL);
        !          1410: }
        !          1411: 
        !          1412: static const xmlChar*
        !          1413: xmlSchemaGetComponentQName(xmlChar **buf,
        !          1414:                           void *item)
        !          1415: {
        !          1416:     return (xmlSchemaFormatQName(buf,
        !          1417:        xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item),
        !          1418:        xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item)));
        !          1419: }
        !          1420: 
        !          1421: static const xmlChar*
        !          1422: xmlSchemaGetComponentDesignation(xmlChar **buf, void *item)
        !          1423: {
        !          1424:     xmlChar *str = NULL;
        !          1425: 
        !          1426:     *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item));
        !          1427:     *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1428:     *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str,
        !          1429:        (xmlSchemaBasicItemPtr) item));
        !          1430:     *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1431:     FREE_AND_NULL(str);
        !          1432:     return(*buf);
        !          1433: }
        !          1434: 
        !          1435: static const xmlChar*
        !          1436: xmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc)
        !          1437: {
        !          1438:     return(xmlSchemaGetComponentDesignation(buf, idc));
        !          1439: }
        !          1440: 
        !          1441: /**
        !          1442:  * xmlSchemaWildcardPCToString:
        !          1443:  * @pc: the type of processContents
        !          1444:  *
        !          1445:  * Returns a string representation of the type of
        !          1446:  * processContents.
        !          1447:  */
        !          1448: static const xmlChar *
        !          1449: xmlSchemaWildcardPCToString(int pc)
        !          1450: {
        !          1451:     switch (pc) {
        !          1452:        case XML_SCHEMAS_ANY_SKIP:
        !          1453:            return (BAD_CAST "skip");
        !          1454:        case XML_SCHEMAS_ANY_LAX:
        !          1455:            return (BAD_CAST "lax");
        !          1456:        case XML_SCHEMAS_ANY_STRICT:
        !          1457:            return (BAD_CAST "strict");
        !          1458:        default:
        !          1459:            return (BAD_CAST "invalid process contents");
        !          1460:     }
        !          1461: }
        !          1462: 
        !          1463: /**
        !          1464:  * xmlSchemaGetCanonValueWhtspExt:
        !          1465:  * @val: the precomputed value
        !          1466:  * @retValue: the returned value
        !          1467:  * @ws: the whitespace type of the value
        !          1468:  *
        !          1469:  * Get a the cononical representation of the value.
        !          1470:  * The caller has to free the returned retValue.
        !          1471:  *
        !          1472:  * Returns 0 if the value could be built and -1 in case of
        !          1473:  *         API errors or if the value type is not supported yet.
        !          1474:  */
        !          1475: static int
        !          1476: xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val,
        !          1477:                               xmlSchemaWhitespaceValueType ws,
        !          1478:                               xmlChar **retValue)
        !          1479: {
        !          1480:     int list;
        !          1481:     xmlSchemaValType valType;
        !          1482:     const xmlChar *value, *value2 = NULL;
        !          1483: 
        !          1484: 
        !          1485:     if ((retValue == NULL) || (val == NULL))
        !          1486:        return (-1);
        !          1487:     list = xmlSchemaValueGetNext(val) ? 1 : 0;
        !          1488:     *retValue = NULL;
        !          1489:     do {
        !          1490:        value = NULL;
        !          1491:        valType = xmlSchemaGetValType(val);
        !          1492:        switch (valType) {
        !          1493:            case XML_SCHEMAS_STRING:
        !          1494:            case XML_SCHEMAS_NORMSTRING:
        !          1495:            case XML_SCHEMAS_ANYSIMPLETYPE:
        !          1496:                value = xmlSchemaValueGetAsString(val);
        !          1497:                if (value != NULL) {
        !          1498:                    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
        !          1499:                        value2 = xmlSchemaCollapseString(value);
        !          1500:                    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
        !          1501:                        value2 = xmlSchemaWhiteSpaceReplace(value);
        !          1502:                    if (value2 != NULL)
        !          1503:                        value = value2;
        !          1504:                }
        !          1505:                break;
        !          1506:            default:
        !          1507:                if (xmlSchemaGetCanonValue(val, &value2) == -1) {
        !          1508:                    if (value2 != NULL)
        !          1509:                        xmlFree((xmlChar *) value2);
        !          1510:                    goto internal_error;
        !          1511:                }
        !          1512:                value = value2;
        !          1513:        }
        !          1514:        if (*retValue == NULL)
        !          1515:            if (value == NULL) {
        !          1516:                if (! list)
        !          1517:                    *retValue = xmlStrdup(BAD_CAST "");
        !          1518:            } else
        !          1519:                *retValue = xmlStrdup(value);
        !          1520:        else if (value != NULL) {
        !          1521:            /* List. */
        !          1522:            *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " ");
        !          1523:            *retValue = xmlStrcat((xmlChar *) *retValue, value);
        !          1524:        }
        !          1525:        FREE_AND_NULL(value2)
        !          1526:        val = xmlSchemaValueGetNext(val);
        !          1527:     } while (val != NULL);
        !          1528: 
        !          1529:     return (0);
        !          1530: internal_error:
        !          1531:     if (*retValue != NULL)
        !          1532:        xmlFree((xmlChar *) (*retValue));
        !          1533:     if (value2 != NULL)
        !          1534:        xmlFree((xmlChar *) value2);
        !          1535:     return (-1);
        !          1536: }
        !          1537: 
        !          1538: /**
        !          1539:  * xmlSchemaFormatItemForReport:
        !          1540:  * @buf: the string buffer
        !          1541:  * @itemDes: the designation of the item
        !          1542:  * @itemName: the name of the item
        !          1543:  * @item: the item as an object
        !          1544:  * @itemNode: the node of the item
        !          1545:  * @local: the local name
        !          1546:  * @parsing: if the function is used during the parse
        !          1547:  *
        !          1548:  * Returns a representation of the given item used
        !          1549:  * for error reports.
        !          1550:  *
        !          1551:  * The following order is used to build the resulting
        !          1552:  * designation if the arguments are not NULL:
        !          1553:  * 1a. If itemDes not NULL -> itemDes
        !          1554:  * 1b. If (itemDes not NULL) and (itemName not NULL)
        !          1555:  *     -> itemDes + itemName
        !          1556:  * 2. If the preceding was NULL and (item not NULL) -> item
        !          1557:  * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode
        !          1558:  *
        !          1559:  * If the itemNode is an attribute node, the name of the attribute
        !          1560:  * will be appended to the result.
        !          1561:  *
        !          1562:  * Returns the formatted string and sets @buf to the resulting value.
        !          1563:  */
        !          1564: static xmlChar*
        !          1565: xmlSchemaFormatItemForReport(xmlChar **buf,
        !          1566:                     const xmlChar *itemDes,
        !          1567:                     xmlSchemaBasicItemPtr item,
        !          1568:                     xmlNodePtr itemNode)
        !          1569: {
        !          1570:     xmlChar *str = NULL;
        !          1571:     int named = 1;
        !          1572: 
        !          1573:     if (*buf != NULL) {
        !          1574:        xmlFree(*buf);
        !          1575:        *buf = NULL;
        !          1576:     }
        !          1577: 
        !          1578:     if (itemDes != NULL) {
        !          1579:        *buf = xmlStrdup(itemDes);
        !          1580:     } else if (item != NULL) {
        !          1581:        switch (item->type) {
        !          1582:        case XML_SCHEMA_TYPE_BASIC: {
        !          1583:            xmlSchemaTypePtr type = WXS_TYPE_CAST item;
        !          1584: 
        !          1585:            if (WXS_IS_ATOMIC(type))
        !          1586:                *buf = xmlStrdup(BAD_CAST "atomic type 'xs:");
        !          1587:            else if (WXS_IS_LIST(type))
        !          1588:                *buf = xmlStrdup(BAD_CAST "list type 'xs:");
        !          1589:            else if (WXS_IS_UNION(type))
        !          1590:                *buf = xmlStrdup(BAD_CAST "union type 'xs:");
        !          1591:            else
        !          1592:                *buf = xmlStrdup(BAD_CAST "simple type 'xs:");
        !          1593:            *buf = xmlStrcat(*buf, type->name);
        !          1594:            *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1595:            }
        !          1596:            break;
        !          1597:        case XML_SCHEMA_TYPE_SIMPLE: {
        !          1598:            xmlSchemaTypePtr type = WXS_TYPE_CAST item;
        !          1599: 
        !          1600:            if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
        !          1601:                *buf = xmlStrdup(BAD_CAST"");
        !          1602:            } else {
        !          1603:                *buf = xmlStrdup(BAD_CAST "local ");
        !          1604:            }
        !          1605:            if (WXS_IS_ATOMIC(type))
        !          1606:                *buf = xmlStrcat(*buf, BAD_CAST "atomic type");
        !          1607:            else if (WXS_IS_LIST(type))
        !          1608:                *buf = xmlStrcat(*buf, BAD_CAST "list type");
        !          1609:            else if (WXS_IS_UNION(type))
        !          1610:                *buf = xmlStrcat(*buf, BAD_CAST "union type");
        !          1611:            else
        !          1612:                *buf = xmlStrcat(*buf, BAD_CAST "simple type");
        !          1613:            if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
        !          1614:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1615:                *buf = xmlStrcat(*buf, type->name);
        !          1616:                *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1617:            }
        !          1618:            }
        !          1619:            break;
        !          1620:        case XML_SCHEMA_TYPE_COMPLEX: {
        !          1621:            xmlSchemaTypePtr type = WXS_TYPE_CAST item;
        !          1622: 
        !          1623:            if (type->flags & XML_SCHEMAS_TYPE_GLOBAL)
        !          1624:                *buf = xmlStrdup(BAD_CAST "");
        !          1625:            else
        !          1626:                *buf = xmlStrdup(BAD_CAST "local ");
        !          1627:            *buf = xmlStrcat(*buf, BAD_CAST "complex type");
        !          1628:            if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
        !          1629:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1630:                *buf = xmlStrcat(*buf, type->name);
        !          1631:                *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1632:            }
        !          1633:            }
        !          1634:            break;
        !          1635:        case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
        !          1636:                xmlSchemaAttributeUsePtr ause;
        !          1637: 
        !          1638:                ause = WXS_ATTR_USE_CAST item;
        !          1639:                *buf = xmlStrdup(BAD_CAST "attribute use ");
        !          1640:                if (WXS_ATTRUSE_DECL(ause) != NULL) {
        !          1641:                    *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1642:                    *buf = xmlStrcat(*buf,
        !          1643:                        xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause)));
        !          1644:                    FREE_AND_NULL(str)
        !          1645:                        *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1646:                } else {
        !          1647:                    *buf = xmlStrcat(*buf, BAD_CAST "(unknown)");
        !          1648:                }
        !          1649:            }
        !          1650:            break;
        !          1651:        case XML_SCHEMA_TYPE_ATTRIBUTE: {
        !          1652:                xmlSchemaAttributePtr attr;
        !          1653: 
        !          1654:                attr = (xmlSchemaAttributePtr) item;
        !          1655:                *buf = xmlStrdup(BAD_CAST "attribute decl.");
        !          1656:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1657:                *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
        !          1658:                    attr->targetNamespace, attr->name));
        !          1659:                FREE_AND_NULL(str)
        !          1660:                    *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1661:            }
        !          1662:            break;
        !          1663:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          1664:            xmlSchemaGetComponentDesignation(buf, item);
        !          1665:            break;
        !          1666:        case XML_SCHEMA_TYPE_ELEMENT: {
        !          1667:                xmlSchemaElementPtr elem;
        !          1668: 
        !          1669:                elem = (xmlSchemaElementPtr) item;
        !          1670:                *buf = xmlStrdup(BAD_CAST "element decl.");
        !          1671:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1672:                *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
        !          1673:                    elem->targetNamespace, elem->name));
        !          1674:                *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1675:            }
        !          1676:            break;
        !          1677:        case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          1678:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          1679:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          1680:            if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE)
        !          1681:                *buf = xmlStrdup(BAD_CAST "unique '");
        !          1682:            else if (item->type == XML_SCHEMA_TYPE_IDC_KEY)
        !          1683:                *buf = xmlStrdup(BAD_CAST "key '");
        !          1684:            else
        !          1685:                *buf = xmlStrdup(BAD_CAST "keyRef '");
        !          1686:            *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name);
        !          1687:            *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1688:            break;
        !          1689:        case XML_SCHEMA_TYPE_ANY:
        !          1690:        case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
        !          1691:            *buf = xmlStrdup(xmlSchemaWildcardPCToString(
        !          1692:                    ((xmlSchemaWildcardPtr) item)->processContents));
        !          1693:            *buf = xmlStrcat(*buf, BAD_CAST " wildcard");
        !          1694:            break;
        !          1695:        case XML_SCHEMA_FACET_MININCLUSIVE:
        !          1696:        case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          1697:        case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          1698:        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          1699:        case XML_SCHEMA_FACET_TOTALDIGITS:
        !          1700:        case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          1701:        case XML_SCHEMA_FACET_PATTERN:
        !          1702:        case XML_SCHEMA_FACET_ENUMERATION:
        !          1703:        case XML_SCHEMA_FACET_WHITESPACE:
        !          1704:        case XML_SCHEMA_FACET_LENGTH:
        !          1705:        case XML_SCHEMA_FACET_MAXLENGTH:
        !          1706:        case XML_SCHEMA_FACET_MINLENGTH:
        !          1707:            *buf = xmlStrdup(BAD_CAST "facet '");
        !          1708:            *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type));
        !          1709:            *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1710:            break;
        !          1711:        case XML_SCHEMA_TYPE_GROUP: {
        !          1712:                *buf = xmlStrdup(BAD_CAST "model group def.");
        !          1713:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1714:                *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
        !          1715:                *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1716:                FREE_AND_NULL(str)
        !          1717:            }
        !          1718:            break;
        !          1719:        case XML_SCHEMA_TYPE_SEQUENCE:
        !          1720:        case XML_SCHEMA_TYPE_CHOICE:
        !          1721:        case XML_SCHEMA_TYPE_ALL:
        !          1722:        case XML_SCHEMA_TYPE_PARTICLE:
        !          1723:            *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
        !          1724:            break;
        !          1725:        case XML_SCHEMA_TYPE_NOTATION: {
        !          1726:                *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
        !          1727:                *buf = xmlStrcat(*buf, BAD_CAST " '");
        !          1728:                *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
        !          1729:                *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1730:                FREE_AND_NULL(str);
        !          1731:            }
        !          1732:        default:
        !          1733:            named = 0;
        !          1734:        }
        !          1735:     } else
        !          1736:        named = 0;
        !          1737: 
        !          1738:     if ((named == 0) && (itemNode != NULL)) {
        !          1739:        xmlNodePtr elem;
        !          1740: 
        !          1741:        if (itemNode->type == XML_ATTRIBUTE_NODE)
        !          1742:            elem = itemNode->parent;
        !          1743:        else
        !          1744:            elem = itemNode;
        !          1745:        *buf = xmlStrdup(BAD_CAST "Element '");
        !          1746:        if (elem->ns != NULL) {
        !          1747:            *buf = xmlStrcat(*buf,
        !          1748:                xmlSchemaFormatQName(&str, elem->ns->href, elem->name));
        !          1749:            FREE_AND_NULL(str)
        !          1750:        } else
        !          1751:            *buf = xmlStrcat(*buf, elem->name);
        !          1752:        *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1753: 
        !          1754:     }
        !          1755:     if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
        !          1756:        *buf = xmlStrcat(*buf, BAD_CAST ", attribute '");
        !          1757:        if (itemNode->ns != NULL) {
        !          1758:            *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
        !          1759:                itemNode->ns->href, itemNode->name));
        !          1760:            FREE_AND_NULL(str)
        !          1761:        } else
        !          1762:            *buf = xmlStrcat(*buf, itemNode->name);
        !          1763:        *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1764:     }
        !          1765:     FREE_AND_NULL(str)
        !          1766: 
        !          1767:     return (*buf);
        !          1768: }
        !          1769: 
        !          1770: /**
        !          1771:  * xmlSchemaFormatFacetEnumSet:
        !          1772:  * @buf: the string buffer
        !          1773:  * @type: the type holding the enumeration facets
        !          1774:  *
        !          1775:  * Builds a string consisting of all enumeration elements.
        !          1776:  *
        !          1777:  * Returns a string of all enumeration elements.
        !          1778:  */
        !          1779: static const xmlChar *
        !          1780: xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
        !          1781:                            xmlChar **buf, xmlSchemaTypePtr type)
        !          1782: {
        !          1783:     xmlSchemaFacetPtr facet;
        !          1784:     xmlSchemaWhitespaceValueType ws;
        !          1785:     xmlChar *value = NULL;
        !          1786:     int res, found = 0;
        !          1787: 
        !          1788:     if (*buf != NULL)
        !          1789:        xmlFree(*buf);
        !          1790:     *buf = NULL;
        !          1791: 
        !          1792:     do {
        !          1793:        /*
        !          1794:        * Use the whitespace type of the base type.
        !          1795:        */
        !          1796:        ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType);
        !          1797:        for (facet = type->facets; facet != NULL; facet = facet->next) {
        !          1798:            if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
        !          1799:                continue;
        !          1800:            found = 1;
        !          1801:            res = xmlSchemaGetCanonValueWhtspExt(facet->val,
        !          1802:                ws, &value);
        !          1803:            if (res == -1) {
        !          1804:                xmlSchemaInternalErr(actxt,
        !          1805:                    "xmlSchemaFormatFacetEnumSet",
        !          1806:                    "compute the canonical lexical representation");
        !          1807:                if (*buf != NULL)
        !          1808:                    xmlFree(*buf);
        !          1809:                *buf = NULL;
        !          1810:                return (NULL);
        !          1811:            }
        !          1812:            if (*buf == NULL)
        !          1813:                *buf = xmlStrdup(BAD_CAST "'");
        !          1814:            else
        !          1815:                *buf = xmlStrcat(*buf, BAD_CAST ", '");
        !          1816:            *buf = xmlStrcat(*buf, BAD_CAST value);
        !          1817:            *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          1818:            if (value != NULL) {
        !          1819:                xmlFree((xmlChar *)value);
        !          1820:                value = NULL;
        !          1821:            }
        !          1822:        }
        !          1823:        /*
        !          1824:        * The enumeration facet of a type restricts the enumeration
        !          1825:        * facet of the ancestor type; i.e., such restricted enumerations
        !          1826:        * do not belong to the set of the given type. Thus we break
        !          1827:        * on the first found enumeration.
        !          1828:        */
        !          1829:        if (found)
        !          1830:            break;
        !          1831:        type = type->baseType;
        !          1832:     } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC));
        !          1833: 
        !          1834:     return ((const xmlChar *) *buf);
        !          1835: }
        !          1836: 
        !          1837: /************************************************************************
        !          1838:  *                                                                     *
        !          1839:  *                     Error functions                                 *
        !          1840:  *                                                                     *
        !          1841:  ************************************************************************/
        !          1842: 
        !          1843: #if 0
        !          1844: static void
        !          1845: xmlSchemaErrMemory(const char *msg)
        !          1846: {
        !          1847:     __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
        !          1848:                      msg);
        !          1849: }
        !          1850: #endif
        !          1851: 
        !          1852: static void
        !          1853: xmlSchemaPSimpleErr(const char *msg)
        !          1854: {
        !          1855:     __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
        !          1856:                      msg);
        !          1857: }
        !          1858: 
        !          1859: /**
        !          1860:  * xmlSchemaPErrMemory:
        !          1861:  * @node: a context node
        !          1862:  * @extra:  extra informations
        !          1863:  *
        !          1864:  * Handle an out of memory condition
        !          1865:  */
        !          1866: static void
        !          1867: xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
        !          1868:                     const char *extra, xmlNodePtr node)
        !          1869: {
        !          1870:     if (ctxt != NULL)
        !          1871:         ctxt->nberrors++;
        !          1872:     __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL,
        !          1873:                      extra);
        !          1874: }
        !          1875: 
        !          1876: /**
        !          1877:  * xmlSchemaPErr:
        !          1878:  * @ctxt: the parsing context
        !          1879:  * @node: the context node
        !          1880:  * @error: the error code
        !          1881:  * @msg: the error message
        !          1882:  * @str1: extra data
        !          1883:  * @str2: extra data
        !          1884:  *
        !          1885:  * Handle a parser error
        !          1886:  */
        !          1887: static void
        !          1888: xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
        !          1889:               const char *msg, const xmlChar * str1, const xmlChar * str2)
        !          1890: {
        !          1891:     xmlGenericErrorFunc channel = NULL;
        !          1892:     xmlStructuredErrorFunc schannel = NULL;
        !          1893:     void *data = NULL;
        !          1894: 
        !          1895:     if (ctxt != NULL) {
        !          1896:         ctxt->nberrors++;
        !          1897:        ctxt->err = error;
        !          1898:         channel = ctxt->error;
        !          1899:         data = ctxt->errCtxt;
        !          1900:        schannel = ctxt->serror;
        !          1901:     }
        !          1902:     __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
        !          1903:                     error, XML_ERR_ERROR, NULL, 0,
        !          1904:                     (const char *) str1, (const char *) str2, NULL, 0, 0,
        !          1905:                     msg, str1, str2);
        !          1906: }
        !          1907: 
        !          1908: /**
        !          1909:  * xmlSchemaPErr2:
        !          1910:  * @ctxt: the parsing context
        !          1911:  * @node: the context node
        !          1912:  * @node: the current child
        !          1913:  * @error: the error code
        !          1914:  * @msg: the error message
        !          1915:  * @str1: extra data
        !          1916:  * @str2: extra data
        !          1917:  *
        !          1918:  * Handle a parser error
        !          1919:  */
        !          1920: static void
        !          1921: xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
        !          1922:                xmlNodePtr child, int error,
        !          1923:                const char *msg, const xmlChar * str1, const xmlChar * str2)
        !          1924: {
        !          1925:     if (child != NULL)
        !          1926:         xmlSchemaPErr(ctxt, child, error, msg, str1, str2);
        !          1927:     else
        !          1928:         xmlSchemaPErr(ctxt, node, error, msg, str1, str2);
        !          1929: }
        !          1930: 
        !          1931: 
        !          1932: /**
        !          1933:  * xmlSchemaPErrExt:
        !          1934:  * @ctxt: the parsing context
        !          1935:  * @node: the context node
        !          1936:  * @error: the error code
        !          1937:  * @strData1: extra data
        !          1938:  * @strData2: extra data
        !          1939:  * @strData3: extra data
        !          1940:  * @msg: the message
        !          1941:  * @str1:  extra parameter for the message display
        !          1942:  * @str2:  extra parameter for the message display
        !          1943:  * @str3:  extra parameter for the message display
        !          1944:  * @str4:  extra parameter for the message display
        !          1945:  * @str5:  extra parameter for the message display
        !          1946:  *
        !          1947:  * Handle a parser error
        !          1948:  */
        !          1949: static void
        !          1950: xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
        !          1951:                const xmlChar * strData1, const xmlChar * strData2,
        !          1952:                const xmlChar * strData3, const char *msg, const xmlChar * str1,
        !          1953:                const xmlChar * str2, const xmlChar * str3, const xmlChar * str4,
        !          1954:                const xmlChar * str5)
        !          1955: {
        !          1956: 
        !          1957:     xmlGenericErrorFunc channel = NULL;
        !          1958:     xmlStructuredErrorFunc schannel = NULL;
        !          1959:     void *data = NULL;
        !          1960: 
        !          1961:     if (ctxt != NULL) {
        !          1962:         ctxt->nberrors++;
        !          1963:        ctxt->err = error;
        !          1964:         channel = ctxt->error;
        !          1965:         data = ctxt->errCtxt;
        !          1966:        schannel = ctxt->serror;
        !          1967:     }
        !          1968:     __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
        !          1969:                     error, XML_ERR_ERROR, NULL, 0,
        !          1970:                     (const char *) strData1, (const char *) strData2,
        !          1971:                    (const char *) strData3, 0, 0, msg, str1, str2,
        !          1972:                    str3, str4, str5);
        !          1973: }
        !          1974: 
        !          1975: /************************************************************************
        !          1976:  *                                                                     *
        !          1977:  *                     Allround error functions                        *
        !          1978:  *                                                                     *
        !          1979:  ************************************************************************/
        !          1980: 
        !          1981: /**
        !          1982:  * xmlSchemaVTypeErrMemory:
        !          1983:  * @node: a context node
        !          1984:  * @extra:  extra informations
        !          1985:  *
        !          1986:  * Handle an out of memory condition
        !          1987:  */
        !          1988: static void
        !          1989: xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
        !          1990:                     const char *extra, xmlNodePtr node)
        !          1991: {
        !          1992:     if (ctxt != NULL) {
        !          1993:         ctxt->nberrors++;
        !          1994:         ctxt->err = XML_SCHEMAV_INTERNAL;
        !          1995:     }
        !          1996:     __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL,
        !          1997:                      extra);
        !          1998: }
        !          1999: 
        !          2000: static void
        !          2001: xmlSchemaPSimpleInternalErr(xmlNodePtr node,
        !          2002:                            const char *msg, const xmlChar *str)
        !          2003: {
        !          2004:      __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node,
        !          2005:         msg, (const char *) str);
        !          2006: }
        !          2007: 
        !          2008: #define WXS_ERROR_TYPE_ERROR 1
        !          2009: #define WXS_ERROR_TYPE_WARNING 2
        !          2010: /**
        !          2011:  * xmlSchemaErr3:
        !          2012:  * @ctxt: the validation context
        !          2013:  * @node: the context node
        !          2014:  * @error: the error code
        !          2015:  * @msg: the error message
        !          2016:  * @str1: extra data
        !          2017:  * @str2: extra data
        !          2018:  * @str3: extra data
        !          2019:  *
        !          2020:  * Handle a validation error
        !          2021:  */
        !          2022: static void
        !          2023: xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
        !          2024:                  xmlErrorLevel errorLevel,
        !          2025:                  int error, xmlNodePtr node, int line, const char *msg,
        !          2026:                  const xmlChar *str1, const xmlChar *str2,
        !          2027:                  const xmlChar *str3, const xmlChar *str4)
        !          2028: {
        !          2029:     xmlStructuredErrorFunc schannel = NULL;
        !          2030:     xmlGenericErrorFunc channel = NULL;
        !          2031:     void *data = NULL;
        !          2032: 
        !          2033:     if (ctxt != NULL) {
        !          2034:        if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
        !          2035:            xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
        !          2036:            const char *file = NULL;
        !          2037:            if (errorLevel != XML_ERR_WARNING) {
        !          2038:                vctxt->nberrors++;
        !          2039:                vctxt->err = error;
        !          2040:                channel = vctxt->error;
        !          2041:            } else {
        !          2042:                channel = vctxt->warning;
        !          2043:            }
        !          2044:            schannel = vctxt->serror;
        !          2045:            data = vctxt->errCtxt;
        !          2046: 
        !          2047:            /*
        !          2048:            * Error node. If we specify a line number, then
        !          2049:            * do not channel any node to the error function.
        !          2050:            */
        !          2051:            if (line == 0) {
        !          2052:                if ((node == NULL) &&
        !          2053:                    (vctxt->depth >= 0) &&
        !          2054:                    (vctxt->inode != NULL)) {
        !          2055:                    node = vctxt->inode->node;
        !          2056:                }
        !          2057:                /*
        !          2058:                * Get filename and line if no node-tree.
        !          2059:                */
        !          2060:                if ((node == NULL) &&
        !          2061:                    (vctxt->parserCtxt != NULL) &&
        !          2062:                    (vctxt->parserCtxt->input != NULL)) {
        !          2063:                    file = vctxt->parserCtxt->input->filename;
        !          2064:                    line = vctxt->parserCtxt->input->line;
        !          2065:                }
        !          2066:            } else {
        !          2067:                /*
        !          2068:                * Override the given node's (if any) position
        !          2069:                * and channel only the given line number.
        !          2070:                */
        !          2071:                node = NULL;
        !          2072:                /*
        !          2073:                * Get filename.
        !          2074:                */
        !          2075:                if (vctxt->doc != NULL)
        !          2076:                    file = (const char *) vctxt->doc->URL;
        !          2077:                else if ((vctxt->parserCtxt != NULL) &&
        !          2078:                    (vctxt->parserCtxt->input != NULL))
        !          2079:                    file = vctxt->parserCtxt->input->filename;
        !          2080:            }
        !          2081:            __xmlRaiseError(schannel, channel, data, ctxt,
        !          2082:                node, XML_FROM_SCHEMASV,
        !          2083:                error, errorLevel, file, line,
        !          2084:                (const char *) str1, (const char *) str2,
        !          2085:                (const char *) str3, 0, 0, msg, str1, str2, str3, str4);
        !          2086: 
        !          2087:        } else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
        !          2088:            xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
        !          2089:            if (errorLevel != XML_ERR_WARNING) {
        !          2090:                pctxt->nberrors++;
        !          2091:                pctxt->err = error;
        !          2092:                channel = pctxt->error;
        !          2093:            } else {
        !          2094:                channel = pctxt->warning;
        !          2095:            }
        !          2096:            schannel = pctxt->serror;
        !          2097:            data = pctxt->errCtxt;
        !          2098:            __xmlRaiseError(schannel, channel, data, ctxt,
        !          2099:                node, XML_FROM_SCHEMASP, error,
        !          2100:                errorLevel, NULL, 0,
        !          2101:                (const char *) str1, (const char *) str2,
        !          2102:                (const char *) str3, 0, 0, msg, str1, str2, str3, str4);
        !          2103:        } else {
        !          2104:            TODO
        !          2105:        }
        !          2106:     }
        !          2107: }
        !          2108: 
        !          2109: /**
        !          2110:  * xmlSchemaErr3:
        !          2111:  * @ctxt: the validation context
        !          2112:  * @node: the context node
        !          2113:  * @error: the error code
        !          2114:  * @msg: the error message
        !          2115:  * @str1: extra data
        !          2116:  * @str2: extra data
        !          2117:  * @str3: extra data
        !          2118:  *
        !          2119:  * Handle a validation error
        !          2120:  */
        !          2121: static void
        !          2122: xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
        !          2123:              int error, xmlNodePtr node, const char *msg,
        !          2124:              const xmlChar *str1, const xmlChar *str2, const xmlChar *str3)
        !          2125: {
        !          2126:     xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
        !          2127:        msg, str1, str2, str3, NULL);
        !          2128: }
        !          2129: 
        !          2130: static void
        !          2131: xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
        !          2132:              int error, xmlNodePtr node, const char *msg,
        !          2133:              const xmlChar *str1, const xmlChar *str2,
        !          2134:              const xmlChar *str3, const xmlChar *str4)
        !          2135: {
        !          2136:     xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
        !          2137:        msg, str1, str2, str3, str4);
        !          2138: }
        !          2139: 
        !          2140: static void
        !          2141: xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2142:             int error, xmlNodePtr node, const char *msg,
        !          2143:             const xmlChar *str1, const xmlChar *str2)
        !          2144: {
        !          2145:     xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL);
        !          2146: }
        !          2147: 
        !          2148: static xmlChar *
        !          2149: xmlSchemaFormatNodeForError(xmlChar ** msg,
        !          2150:                            xmlSchemaAbstractCtxtPtr actxt,
        !          2151:                            xmlNodePtr node)
        !          2152: {
        !          2153:     xmlChar *str = NULL;
        !          2154: 
        !          2155:     *msg = NULL;
        !          2156:     if ((node != NULL) &&
        !          2157:        (node->type != XML_ELEMENT_NODE) &&
        !          2158:        (node->type != XML_ATTRIBUTE_NODE))
        !          2159:     {
        !          2160:        /*
        !          2161:        * Don't try to format other nodes than element and
        !          2162:        * attribute nodes.
        !          2163:        * Play save and return an empty string.
        !          2164:        */
        !          2165:        *msg = xmlStrdup(BAD_CAST "");
        !          2166:        return(*msg);
        !          2167:     }
        !          2168:     if (node != NULL) {
        !          2169:        /*
        !          2170:        * Work on tree nodes.
        !          2171:        */
        !          2172:        if (node->type == XML_ATTRIBUTE_NODE) {
        !          2173:            xmlNodePtr elem = node->parent;
        !          2174: 
        !          2175:            *msg = xmlStrdup(BAD_CAST "Element '");
        !          2176:            if (elem->ns != NULL)
        !          2177:                *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2178:                    elem->ns->href, elem->name));
        !          2179:            else
        !          2180:                *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2181:                    NULL, elem->name));
        !          2182:            FREE_AND_NULL(str);
        !          2183:            *msg = xmlStrcat(*msg, BAD_CAST "', ");
        !          2184:            *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
        !          2185:        } else {
        !          2186:            *msg = xmlStrdup(BAD_CAST "Element '");
        !          2187:        }
        !          2188:        if (node->ns != NULL)
        !          2189:            *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2190:            node->ns->href, node->name));
        !          2191:        else
        !          2192:            *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2193:            NULL, node->name));
        !          2194:        FREE_AND_NULL(str);
        !          2195:        *msg = xmlStrcat(*msg, BAD_CAST "': ");
        !          2196:     } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
        !          2197:        xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
        !          2198:        /*
        !          2199:        * Work on node infos.
        !          2200:        */
        !          2201:        if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
        !          2202:            xmlSchemaNodeInfoPtr ielem =
        !          2203:                vctxt->elemInfos[vctxt->depth];
        !          2204: 
        !          2205:            *msg = xmlStrdup(BAD_CAST "Element '");
        !          2206:            *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2207:                ielem->nsName, ielem->localName));
        !          2208:            FREE_AND_NULL(str);
        !          2209:            *msg = xmlStrcat(*msg, BAD_CAST "', ");
        !          2210:            *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
        !          2211:        } else {
        !          2212:            *msg = xmlStrdup(BAD_CAST "Element '");
        !          2213:        }
        !          2214:        *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
        !          2215:            vctxt->inode->nsName, vctxt->inode->localName));
        !          2216:        FREE_AND_NULL(str);
        !          2217:        *msg = xmlStrcat(*msg, BAD_CAST "': ");
        !          2218:     } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
        !          2219:        /*
        !          2220:        * Hmm, no node while parsing?
        !          2221:        * Return an empty string, in case NULL will break something.
        !          2222:        */
        !          2223:        *msg = xmlStrdup(BAD_CAST "");
        !          2224:     } else {
        !          2225:        TODO
        !          2226:        return (NULL);
        !          2227:     }
        !          2228:     /*
        !          2229:     * VAL TODO: The output of the given schema component is currently
        !          2230:     * disabled.
        !          2231:     */
        !          2232: #if 0
        !          2233:     if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) {
        !          2234:        *msg = xmlStrcat(*msg, BAD_CAST " [");
        !          2235:        *msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str,
        !          2236:            NULL, type, NULL, 0));
        !          2237:        FREE_AND_NULL(str)
        !          2238:        *msg = xmlStrcat(*msg, BAD_CAST "]");
        !          2239:     }
        !          2240: #endif
        !          2241:     return (*msg);
        !          2242: }
        !          2243: 
        !          2244: static void
        !          2245: xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
        !          2246:                     const char *funcName,
        !          2247:                     const char *message,
        !          2248:                     const xmlChar *str1,
        !          2249:                     const xmlChar *str2)
        !          2250: {
        !          2251:     xmlChar *msg = NULL;
        !          2252: 
        !          2253:     if (actxt == NULL)
        !          2254:         return;
        !          2255:     msg = xmlStrdup(BAD_CAST "Internal error: ");
        !          2256:     msg = xmlStrcat(msg, BAD_CAST funcName);
        !          2257:     msg = xmlStrcat(msg, BAD_CAST ", ");
        !          2258:     msg = xmlStrcat(msg, BAD_CAST message);
        !          2259:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2260: 
        !          2261:     if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
        !          2262:        xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL,
        !          2263:            (const char *) msg, str1, str2);
        !          2264: 
        !          2265:     else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
        !          2266:        xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL,
        !          2267:            (const char *) msg, str1, str2);
        !          2268: 
        !          2269:     FREE_AND_NULL(msg)
        !          2270: }
        !          2271: 
        !          2272: static void
        !          2273: xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2274:                     const char *funcName,
        !          2275:                     const char *message)
        !          2276: {
        !          2277:     xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL);
        !          2278: }
        !          2279: 
        !          2280: #if 0
        !          2281: static void
        !          2282: xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
        !          2283:                     const char *funcName,
        !          2284:                     const char *message,
        !          2285:                     const xmlChar *str1,
        !          2286:                     const xmlChar *str2)
        !          2287: {
        !          2288:     xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message,
        !          2289:        str1, str2);
        !          2290: }
        !          2291: #endif
        !          2292: 
        !          2293: static void
        !          2294: xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
        !          2295:                   xmlParserErrors error,
        !          2296:                   xmlNodePtr node,
        !          2297:                   xmlSchemaBasicItemPtr item,
        !          2298:                   const char *message,
        !          2299:                   const xmlChar *str1, const xmlChar *str2,
        !          2300:                   const xmlChar *str3, const xmlChar *str4)
        !          2301: {
        !          2302:     xmlChar *msg = NULL;
        !          2303: 
        !          2304:     if ((node == NULL) && (item != NULL) &&
        !          2305:        (actxt->type == XML_SCHEMA_CTXT_PARSER)) {
        !          2306:        node = WXS_ITEM_NODE(item);
        !          2307:        xmlSchemaFormatItemForReport(&msg, NULL, item, NULL);
        !          2308:        msg = xmlStrcat(msg, BAD_CAST ": ");
        !          2309:     } else
        !          2310:        xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2311:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2312:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2313:     xmlSchemaErr4(actxt, error, node,
        !          2314:        (const char *) msg, str1, str2, str3, str4);
        !          2315:     FREE_AND_NULL(msg)
        !          2316: }
        !          2317: 
        !          2318: static void
        !          2319: xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2320:                   xmlParserErrors error,
        !          2321:                   xmlNodePtr node,
        !          2322:                   xmlSchemaBasicItemPtr item,
        !          2323:                   const char *message,
        !          2324:                   const xmlChar *str1,
        !          2325:                   const xmlChar *str2)
        !          2326: {
        !          2327:     xmlSchemaCustomErr4(actxt, error, node, item,
        !          2328:        message, str1, str2, NULL, NULL);
        !          2329: }
        !          2330: 
        !          2331: 
        !          2332: 
        !          2333: static void
        !          2334: xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
        !          2335:                   xmlParserErrors error,
        !          2336:                   xmlNodePtr node,
        !          2337:                   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
        !          2338:                   const char *message,
        !          2339:                   const xmlChar *str1,
        !          2340:                   const xmlChar *str2,
        !          2341:                   const xmlChar *str3)
        !          2342: {
        !          2343:     xmlChar *msg = NULL;
        !          2344: 
        !          2345:     xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2346:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2347:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2348: 
        !          2349:     /* URGENT TODO: Set the error code to something sane. */
        !          2350:     xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0,
        !          2351:        (const char *) msg, str1, str2, str3, NULL);
        !          2352: 
        !          2353:     FREE_AND_NULL(msg)
        !          2354: }
        !          2355: 
        !          2356: 
        !          2357: 
        !          2358: static void
        !          2359: xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
        !          2360:                   xmlParserErrors error,
        !          2361:                   xmlSchemaPSVIIDCNodePtr idcNode,
        !          2362:                   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
        !          2363:                   const char *message,
        !          2364:                   const xmlChar *str1,
        !          2365:                   const xmlChar *str2)
        !          2366: {
        !          2367:     xmlChar *msg = NULL, *qname = NULL;
        !          2368: 
        !          2369:     msg = xmlStrdup(BAD_CAST "Element '%s': ");
        !          2370:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2371:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2372:     xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR,
        !          2373:        error, NULL, idcNode->nodeLine, (const char *) msg,
        !          2374:        xmlSchemaFormatQName(&qname,
        !          2375:            vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
        !          2376:            vctxt->nodeQNames->items[idcNode->nodeQNameID]),
        !          2377:        str1, str2, NULL);
        !          2378:     FREE_AND_NULL(qname);
        !          2379:     FREE_AND_NULL(msg);
        !          2380: }
        !          2381: 
        !          2382: static int
        !          2383: xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
        !          2384:                           xmlNodePtr node)
        !          2385: {
        !          2386:     if (node != NULL)
        !          2387:        return (node->type);
        !          2388:     if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
        !          2389:        (((xmlSchemaValidCtxtPtr) actxt)->inode != NULL))
        !          2390:        return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType);
        !          2391:     return (-1);
        !          2392: }
        !          2393: 
        !          2394: static int
        !          2395: xmlSchemaIsGlobalItem(xmlSchemaTypePtr item)
        !          2396: {
        !          2397:     switch (item->type) {
        !          2398:        case XML_SCHEMA_TYPE_COMPLEX:
        !          2399:        case XML_SCHEMA_TYPE_SIMPLE:
        !          2400:            if (item->flags & XML_SCHEMAS_TYPE_GLOBAL)
        !          2401:                return(1);
        !          2402:            break;
        !          2403:        case XML_SCHEMA_TYPE_GROUP:
        !          2404:            return (1);
        !          2405:        case XML_SCHEMA_TYPE_ELEMENT:
        !          2406:            if ( ((xmlSchemaElementPtr) item)->flags &
        !          2407:                XML_SCHEMAS_ELEM_GLOBAL)
        !          2408:                return(1);
        !          2409:            break;
        !          2410:        case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          2411:            if ( ((xmlSchemaAttributePtr) item)->flags &
        !          2412:                XML_SCHEMAS_ATTR_GLOBAL)
        !          2413:                return(1);
        !          2414:            break;
        !          2415:        /* Note that attribute groups are always global. */
        !          2416:        default:
        !          2417:            return(1);
        !          2418:     }
        !          2419:     return (0);
        !          2420: }
        !          2421: 
        !          2422: static void
        !          2423: xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2424:                       xmlParserErrors error,
        !          2425:                       xmlNodePtr node,
        !          2426:                       const xmlChar *value,
        !          2427:                       xmlSchemaTypePtr type,
        !          2428:                       int displayValue)
        !          2429: {
        !          2430:     xmlChar *msg = NULL;
        !          2431: 
        !          2432:     xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2433: 
        !          2434:     if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
        !          2435:            XML_ATTRIBUTE_NODE))
        !          2436:        msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
        !          2437:     else
        !          2438:        msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid "
        !          2439:            "value of ");
        !          2440: 
        !          2441:     if (! xmlSchemaIsGlobalItem(type))
        !          2442:        msg = xmlStrcat(msg, BAD_CAST "the local ");
        !          2443:     else
        !          2444:        msg = xmlStrcat(msg, BAD_CAST "the ");
        !          2445: 
        !          2446:     if (WXS_IS_ATOMIC(type))
        !          2447:        msg = xmlStrcat(msg, BAD_CAST "atomic type");
        !          2448:     else if (WXS_IS_LIST(type))
        !          2449:        msg = xmlStrcat(msg, BAD_CAST "list type");
        !          2450:     else if (WXS_IS_UNION(type))
        !          2451:        msg = xmlStrcat(msg, BAD_CAST "union type");
        !          2452: 
        !          2453:     if (xmlSchemaIsGlobalItem(type)) {
        !          2454:        xmlChar *str = NULL;
        !          2455:        msg = xmlStrcat(msg, BAD_CAST " '");
        !          2456:        if (type->builtInType != 0) {
        !          2457:            msg = xmlStrcat(msg, BAD_CAST "xs:");
        !          2458:            msg = xmlStrcat(msg, type->name);
        !          2459:        } else
        !          2460:            msg = xmlStrcat(msg,
        !          2461:                xmlSchemaFormatQName(&str,
        !          2462:                    type->targetNamespace, type->name));
        !          2463:        msg = xmlStrcat(msg, BAD_CAST "'");
        !          2464:        FREE_AND_NULL(str);
        !          2465:     }
        !          2466:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2467:     if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
        !          2468:            XML_ATTRIBUTE_NODE))
        !          2469:        xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
        !          2470:     else
        !          2471:        xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
        !          2472:     FREE_AND_NULL(msg)
        !          2473: }
        !          2474: 
        !          2475: static const xmlChar *
        !          2476: xmlSchemaFormatErrorNodeQName(xmlChar ** str,
        !          2477:                              xmlSchemaNodeInfoPtr ni,
        !          2478:                              xmlNodePtr node)
        !          2479: {
        !          2480:     if (node != NULL) {
        !          2481:        if (node->ns != NULL)
        !          2482:            return (xmlSchemaFormatQName(str, node->ns->href, node->name));
        !          2483:        else
        !          2484:            return (xmlSchemaFormatQName(str, NULL, node->name));
        !          2485:     } else if (ni != NULL)
        !          2486:        return (xmlSchemaFormatQName(str, ni->nsName, ni->localName));
        !          2487:     return (NULL);
        !          2488: }
        !          2489: 
        !          2490: static void
        !          2491: xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2492:                        xmlParserErrors error,
        !          2493:                        xmlSchemaAttrInfoPtr ni,
        !          2494:                        xmlNodePtr node)
        !          2495: {
        !          2496:     xmlChar *msg = NULL, *str = NULL;
        !          2497: 
        !          2498:     xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2499:     msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n");
        !          2500:     xmlSchemaErr(actxt, error, node, (const char *) msg,
        !          2501:        xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node),
        !          2502:        NULL);
        !          2503:     FREE_AND_NULL(str)
        !          2504:     FREE_AND_NULL(msg)
        !          2505: }
        !          2506: 
        !          2507: static void
        !          2508: xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2509:                        xmlParserErrors error,
        !          2510:                        xmlNodePtr node,
        !          2511:                        xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
        !          2512:                        const char *message,
        !          2513:                        int nbval,
        !          2514:                        int nbneg,
        !          2515:                        xmlChar **values)
        !          2516: {
        !          2517:     xmlChar *str = NULL, *msg = NULL;
        !          2518:     xmlChar *localName, *nsName;
        !          2519:     const xmlChar *cur, *end;
        !          2520:     int i;
        !          2521: 
        !          2522:     xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2523:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2524:     msg = xmlStrcat(msg, BAD_CAST ".");
        !          2525:     /*
        !          2526:     * Note that is does not make sense to report that we have a
        !          2527:     * wildcard here, since the wildcard might be unfolded into
        !          2528:     * multiple transitions.
        !          2529:     */
        !          2530:     if (nbval + nbneg > 0) {
        !          2531:        if (nbval + nbneg > 1) {
        !          2532:            str = xmlStrdup(BAD_CAST " Expected is one of ( ");
        !          2533:        } else
        !          2534:            str = xmlStrdup(BAD_CAST " Expected is ( ");
        !          2535:        nsName = NULL;
        !          2536: 
        !          2537:        for (i = 0; i < nbval + nbneg; i++) {
        !          2538:            cur = values[i];
        !          2539:            if (cur == NULL)
        !          2540:                continue;
        !          2541:            if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') &&
        !          2542:                (cur[3] == ' ')) {
        !          2543:                cur += 4;
        !          2544:                str = xmlStrcat(str, BAD_CAST "##other");
        !          2545:            }
        !          2546:            /*
        !          2547:            * Get the local name.
        !          2548:            */
        !          2549:            localName = NULL;
        !          2550: 
        !          2551:            end = cur;
        !          2552:            if (*end == '*') {
        !          2553:                localName = xmlStrdup(BAD_CAST "*");
        !          2554:                end++;
        !          2555:            } else {
        !          2556:                while ((*end != 0) && (*end != '|'))
        !          2557:                    end++;
        !          2558:                localName = xmlStrncat(localName, BAD_CAST cur, end - cur);
        !          2559:            }
        !          2560:            if (*end != 0) {
        !          2561:                end++;
        !          2562:                /*
        !          2563:                * Skip "*|*" if they come with negated expressions, since
        !          2564:                * they represent the same negated wildcard.
        !          2565:                */
        !          2566:                if ((nbneg == 0) || (*end != '*') || (*localName != '*')) {
        !          2567:                    /*
        !          2568:                    * Get the namespace name.
        !          2569:                    */
        !          2570:                    cur = end;
        !          2571:                    if (*end == '*') {
        !          2572:                        nsName = xmlStrdup(BAD_CAST "{*}");
        !          2573:                    } else {
        !          2574:                        while (*end != 0)
        !          2575:                            end++;
        !          2576: 
        !          2577:                        if (i >= nbval)
        !          2578:                            nsName = xmlStrdup(BAD_CAST "{##other:");
        !          2579:                        else
        !          2580:                            nsName = xmlStrdup(BAD_CAST "{");
        !          2581: 
        !          2582:                        nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur);
        !          2583:                        nsName = xmlStrcat(nsName, BAD_CAST "}");
        !          2584:                    }
        !          2585:                    str = xmlStrcat(str, BAD_CAST nsName);
        !          2586:                    FREE_AND_NULL(nsName)
        !          2587:                } else {
        !          2588:                    FREE_AND_NULL(localName);
        !          2589:                    continue;
        !          2590:                }
        !          2591:            }
        !          2592:            str = xmlStrcat(str, BAD_CAST localName);
        !          2593:            FREE_AND_NULL(localName);
        !          2594: 
        !          2595:            if (i < nbval + nbneg -1)
        !          2596:                str = xmlStrcat(str, BAD_CAST ", ");
        !          2597:        }
        !          2598:        str = xmlStrcat(str, BAD_CAST " ).\n");
        !          2599:        msg = xmlStrcat(msg, BAD_CAST str);
        !          2600:        FREE_AND_NULL(str)
        !          2601:     } else
        !          2602:       msg = xmlStrcat(msg, BAD_CAST "\n");
        !          2603:     xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
        !          2604:     xmlFree(msg);
        !          2605: }
        !          2606: 
        !          2607: static void
        !          2608: xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
        !          2609:                  xmlParserErrors error,
        !          2610:                  xmlNodePtr node,
        !          2611:                  const xmlChar *value,
        !          2612:                  unsigned long length,
        !          2613:                  xmlSchemaTypePtr type,
        !          2614:                  xmlSchemaFacetPtr facet,
        !          2615:                  const char *message,
        !          2616:                  const xmlChar *str1,
        !          2617:                  const xmlChar *str2)
        !          2618: {
        !          2619:     xmlChar *str = NULL, *msg = NULL;
        !          2620:     xmlSchemaTypeType facetType;
        !          2621:     int nodeType = xmlSchemaEvalErrorNodeType(actxt, node);
        !          2622: 
        !          2623:     xmlSchemaFormatNodeForError(&msg, actxt, node);
        !          2624:     if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) {
        !          2625:        facetType = XML_SCHEMA_FACET_ENUMERATION;
        !          2626:        /*
        !          2627:        * If enumerations are validated, one must not expect the
        !          2628:        * facet to be given.
        !          2629:        */
        !          2630:     } else
        !          2631:        facetType = facet->type;
        !          2632:     msg = xmlStrcat(msg, BAD_CAST "[");
        !          2633:     msg = xmlStrcat(msg, BAD_CAST "facet '");
        !          2634:     msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType));
        !          2635:     msg = xmlStrcat(msg, BAD_CAST "'] ");
        !          2636:     if (message == NULL) {
        !          2637:        /*
        !          2638:        * Use a default message.
        !          2639:        */
        !          2640:        if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
        !          2641:            (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
        !          2642:            (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
        !          2643: 
        !          2644:            char len[25], actLen[25];
        !          2645: 
        !          2646:            /* FIXME, TODO: What is the max expected string length of the
        !          2647:            * this value?
        !          2648:            */
        !          2649:            if (nodeType == XML_ATTRIBUTE_NODE)
        !          2650:                msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; ");
        !          2651:            else
        !          2652:                msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; ");
        !          2653: 
        !          2654:            snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet));
        !          2655:            snprintf(actLen, 24, "%lu", length);
        !          2656: 
        !          2657:            if (facetType == XML_SCHEMA_FACET_LENGTH)
        !          2658:                msg = xmlStrcat(msg,
        !          2659:                BAD_CAST "this differs from the allowed length of '%s'.\n");
        !          2660:            else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
        !          2661:                msg = xmlStrcat(msg,
        !          2662:                BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
        !          2663:            else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
        !          2664:                msg = xmlStrcat(msg,
        !          2665:                BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
        !          2666: 
        !          2667:            if (nodeType == XML_ATTRIBUTE_NODE)
        !          2668:                xmlSchemaErr3(actxt, error, node, (const char *) msg,
        !          2669:                    value, (const xmlChar *) actLen, (const xmlChar *) len);
        !          2670:            else
        !          2671:                xmlSchemaErr(actxt, error, node, (const char *) msg,
        !          2672:                    (const xmlChar *) actLen, (const xmlChar *) len);
        !          2673: 
        !          2674:        } else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
        !          2675:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element "
        !          2676:                "of the set {%s}.\n");
        !          2677:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2678:                xmlSchemaFormatFacetEnumSet(actxt, &str, type));
        !          2679:        } else if (facetType == XML_SCHEMA_FACET_PATTERN) {
        !          2680:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted "
        !          2681:                "by the pattern '%s'.\n");
        !          2682:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2683:                facet->value);
        !          2684:        } else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
        !          2685:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the "
        !          2686:                "minimum value allowed ('%s').\n");
        !          2687:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2688:                facet->value);
        !          2689:        } else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
        !          2690:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the "
        !          2691:                "maximum value allowed ('%s').\n");
        !          2692:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2693:                facet->value);
        !          2694:        } else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
        !          2695:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than "
        !          2696:                "'%s'.\n");
        !          2697:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2698:                facet->value);
        !          2699:        } else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
        !          2700:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than "
        !          2701:                "'%s'.\n");
        !          2702:            xmlSchemaErr(actxt, error, node, (const char *) msg, value,
        !          2703:                facet->value);
        !          2704:        } else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
        !          2705:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more "
        !          2706:                "digits than are allowed ('%s').\n");
        !          2707:            xmlSchemaErr(actxt, error, node, (const char*) msg, value,
        !          2708:                facet->value);
        !          2709:        } else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
        !          2710:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional "
        !          2711:                "digits than are allowed ('%s').\n");
        !          2712:            xmlSchemaErr(actxt, error, node, (const char*) msg, value,
        !          2713:                facet->value);
        !          2714:        } else if (nodeType == XML_ATTRIBUTE_NODE) {
        !          2715:            msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n");
        !          2716:            xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
        !          2717:        } else {
        !          2718:            msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n");
        !          2719:            xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
        !          2720:        }
        !          2721:     } else {
        !          2722:        msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2723:        msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2724:        xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2);
        !          2725:     }
        !          2726:     FREE_AND_NULL(str)
        !          2727:     xmlFree(msg);
        !          2728: }
        !          2729: 
        !          2730: #define VERROR(err, type, msg) \
        !          2731:     xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
        !          2732: 
        !          2733: #define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
        !          2734: 
        !          2735: #define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
        !          2736: #define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
        !          2737: 
        !          2738: #define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
        !          2739: 
        !          2740: 
        !          2741: /**
        !          2742:  * xmlSchemaPMissingAttrErr:
        !          2743:  * @ctxt: the schema validation context
        !          2744:  * @ownerDes: the designation of  the owner
        !          2745:  * @ownerName: the name of the owner
        !          2746:  * @ownerItem: the owner as a schema object
        !          2747:  * @ownerElem: the owner as an element node
        !          2748:  * @node: the parent element node of the missing attribute node
        !          2749:  * @type: the corresponding type of the attribute node
        !          2750:  *
        !          2751:  * Reports an illegal attribute.
        !          2752:  */
        !          2753: static void
        !          2754: xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
        !          2755:                         xmlParserErrors error,
        !          2756:                         xmlSchemaBasicItemPtr ownerItem,
        !          2757:                         xmlNodePtr ownerElem,
        !          2758:                         const char *name,
        !          2759:                         const char *message)
        !          2760: {
        !          2761:     xmlChar *des = NULL;
        !          2762: 
        !          2763:     xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
        !          2764: 
        !          2765:     if (message != NULL)
        !          2766:        xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message);
        !          2767:     else
        !          2768:        xmlSchemaPErr(ctxt, ownerElem, error,
        !          2769:            "%s: The attribute '%s' is required but missing.\n",
        !          2770:            BAD_CAST des, BAD_CAST name);
        !          2771:     FREE_AND_NULL(des);
        !          2772: }
        !          2773: 
        !          2774: 
        !          2775: /**
        !          2776:  * xmlSchemaPResCompAttrErr:
        !          2777:  * @ctxt: the schema validation context
        !          2778:  * @error: the error code
        !          2779:  * @ownerDes: the designation of  the owner
        !          2780:  * @ownerItem: the owner as a schema object
        !          2781:  * @ownerElem: the owner as an element node
        !          2782:  * @name: the name of the attribute holding the QName
        !          2783:  * @refName: the referenced local name
        !          2784:  * @refURI: the referenced namespace URI
        !          2785:  * @message: optional message
        !          2786:  *
        !          2787:  * Used to report QName attribute values that failed to resolve
        !          2788:  * to schema components.
        !          2789:  */
        !          2790: static void
        !          2791: xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
        !          2792:                         xmlParserErrors error,
        !          2793:                         xmlSchemaBasicItemPtr ownerItem,
        !          2794:                         xmlNodePtr ownerElem,
        !          2795:                         const char *name,
        !          2796:                         const xmlChar *refName,
        !          2797:                         const xmlChar *refURI,
        !          2798:                         xmlSchemaTypeType refType,
        !          2799:                         const char *refTypeStr)
        !          2800: {
        !          2801:     xmlChar *des = NULL, *strA = NULL;
        !          2802: 
        !          2803:     xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
        !          2804:     if (refTypeStr == NULL)
        !          2805:        refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType);
        !          2806:        xmlSchemaPErrExt(ctxt, ownerElem, error,
        !          2807:            NULL, NULL, NULL,
        !          2808:            "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
        !          2809:            "%s.\n", BAD_CAST des, BAD_CAST name,
        !          2810:            xmlSchemaFormatQName(&strA, refURI, refName),
        !          2811:            BAD_CAST refTypeStr, NULL);
        !          2812:     FREE_AND_NULL(des)
        !          2813:     FREE_AND_NULL(strA)
        !          2814: }
        !          2815: 
        !          2816: /**
        !          2817:  * xmlSchemaPCustomAttrErr:
        !          2818:  * @ctxt: the schema parser context
        !          2819:  * @error: the error code
        !          2820:  * @ownerDes: the designation of the owner
        !          2821:  * @ownerItem: the owner as a schema object
        !          2822:  * @attr: the illegal attribute node
        !          2823:  *
        !          2824:  * Reports an illegal attribute during the parse.
        !          2825:  */
        !          2826: static void
        !          2827: xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
        !          2828:                        xmlParserErrors error,
        !          2829:                        xmlChar **ownerDes,
        !          2830:                        xmlSchemaBasicItemPtr ownerItem,
        !          2831:                        xmlAttrPtr attr,
        !          2832:                        const char *msg)
        !          2833: {
        !          2834:     xmlChar *des = NULL;
        !          2835: 
        !          2836:     if (ownerDes == NULL)
        !          2837:        xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent);
        !          2838:     else if (*ownerDes == NULL) {
        !          2839:        xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent);
        !          2840:        des = *ownerDes;
        !          2841:     } else
        !          2842:        des = *ownerDes;
        !          2843:     if (attr == NULL) {
        !          2844:        xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL,
        !          2845:            "%s, attribute '%s': %s.\n",
        !          2846:            BAD_CAST des, (const xmlChar *) "Unknown",
        !          2847:            (const xmlChar *) msg, NULL, NULL);
        !          2848:     } else {
        !          2849:        xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
        !          2850:            "%s, attribute '%s': %s.\n",
        !          2851:            BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL);
        !          2852:     }
        !          2853:     if (ownerDes == NULL)
        !          2854:        FREE_AND_NULL(des);
        !          2855: }
        !          2856: 
        !          2857: /**
        !          2858:  * xmlSchemaPIllegalAttrErr:
        !          2859:  * @ctxt: the schema parser context
        !          2860:  * @error: the error code
        !          2861:  * @ownerDes: the designation of the attribute's owner
        !          2862:  * @ownerItem: the attribute's owner item
        !          2863:  * @attr: the illegal attribute node
        !          2864:  *
        !          2865:  * Reports an illegal attribute during the parse.
        !          2866:  */
        !          2867: static void
        !          2868: xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
        !          2869:                         xmlParserErrors error,
        !          2870:                         xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED,
        !          2871:                         xmlAttrPtr attr)
        !          2872: {
        !          2873:     xmlChar *strA = NULL, *strB = NULL;
        !          2874: 
        !          2875:     xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent);
        !          2876:     xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr,
        !          2877:        "%sThe attribute '%s' is not allowed.\n", BAD_CAST strA,
        !          2878:        xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name),
        !          2879:        NULL, NULL);
        !          2880:     FREE_AND_NULL(strA);
        !          2881:     FREE_AND_NULL(strB);
        !          2882: }
        !          2883: 
        !          2884: /**
        !          2885:  * xmlSchemaPCustomErr:
        !          2886:  * @ctxt: the schema parser context
        !          2887:  * @error: the error code
        !          2888:  * @itemDes: the designation of the schema item
        !          2889:  * @item: the schema item
        !          2890:  * @itemElem: the node of the schema item
        !          2891:  * @message: the error message
        !          2892:  * @str1: an optional param for the error message
        !          2893:  * @str2: an optional param for the error message
        !          2894:  * @str3: an optional param for the error message
        !          2895:  *
        !          2896:  * Reports an error during parsing.
        !          2897:  */
        !          2898: static void
        !          2899: xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
        !          2900:                    xmlParserErrors error,
        !          2901:                    xmlSchemaBasicItemPtr item,
        !          2902:                    xmlNodePtr itemElem,
        !          2903:                    const char *message,
        !          2904:                    const xmlChar *str1,
        !          2905:                    const xmlChar *str2,
        !          2906:                    const xmlChar *str3)
        !          2907: {
        !          2908:     xmlChar *des = NULL, *msg = NULL;
        !          2909: 
        !          2910:     xmlSchemaFormatItemForReport(&des, NULL, item, itemElem);
        !          2911:     msg = xmlStrdup(BAD_CAST "%s: ");
        !          2912:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2913:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2914:     if ((itemElem == NULL) && (item != NULL))
        !          2915:        itemElem = WXS_ITEM_NODE(item);
        !          2916:     xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL,
        !          2917:        (const char *) msg, BAD_CAST des, str1, str2, str3, NULL);
        !          2918:     FREE_AND_NULL(des);
        !          2919:     FREE_AND_NULL(msg);
        !          2920: }
        !          2921: 
        !          2922: /**
        !          2923:  * xmlSchemaPCustomErr:
        !          2924:  * @ctxt: the schema parser context
        !          2925:  * @error: the error code
        !          2926:  * @itemDes: the designation of the schema item
        !          2927:  * @item: the schema item
        !          2928:  * @itemElem: the node of the schema item
        !          2929:  * @message: the error message
        !          2930:  * @str1: the optional param for the error message
        !          2931:  *
        !          2932:  * Reports an error during parsing.
        !          2933:  */
        !          2934: static void
        !          2935: xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
        !          2936:                    xmlParserErrors error,
        !          2937:                    xmlSchemaBasicItemPtr item,
        !          2938:                    xmlNodePtr itemElem,
        !          2939:                    const char *message,
        !          2940:                    const xmlChar *str1)
        !          2941: {
        !          2942:     xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message,
        !          2943:        str1, NULL, NULL);
        !          2944: }
        !          2945: 
        !          2946: /**
        !          2947:  * xmlSchemaPAttrUseErr:
        !          2948:  * @ctxt: the schema parser context
        !          2949:  * @error: the error code
        !          2950:  * @itemDes: the designation of the schema type
        !          2951:  * @item: the schema type
        !          2952:  * @itemElem: the node of the schema type
        !          2953:  * @attr: the invalid schema attribute
        !          2954:  * @message: the error message
        !          2955:  * @str1: the optional param for the error message
        !          2956:  *
        !          2957:  * Reports an attribute use error during parsing.
        !          2958:  */
        !          2959: static void
        !          2960: xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
        !          2961:                    xmlParserErrors error,
        !          2962:                    xmlNodePtr node,
        !          2963:                    xmlSchemaBasicItemPtr ownerItem,
        !          2964:                    const xmlSchemaAttributeUsePtr attruse,
        !          2965:                    const char *message,
        !          2966:                    const xmlChar *str1, const xmlChar *str2,
        !          2967:                    const xmlChar *str3,const xmlChar *str4)
        !          2968: {
        !          2969:     xmlChar *str = NULL, *msg = NULL;
        !          2970: 
        !          2971:     xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL);
        !          2972:     msg = xmlStrcat(msg, BAD_CAST ", ");
        !          2973:     msg = xmlStrcat(msg,
        !          2974:        BAD_CAST xmlSchemaFormatItemForReport(&str, NULL,
        !          2975:        WXS_BASIC_CAST attruse, NULL));
        !          2976:     FREE_AND_NULL(str);
        !          2977:     msg = xmlStrcat(msg, BAD_CAST ": ");
        !          2978:     msg = xmlStrcat(msg, (const xmlChar *) message);
        !          2979:     msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          2980:     xmlSchemaErr4(ACTXT_CAST ctxt, error, node,
        !          2981:        (const char *) msg, str1, str2, str3, str4);
        !          2982:     xmlFree(msg);
        !          2983: }
        !          2984: 
        !          2985: /**
        !          2986:  * xmlSchemaPIllegalFacetAtomicErr:
        !          2987:  * @ctxt: the schema parser context
        !          2988:  * @error: the error code
        !          2989:  * @type: the schema type
        !          2990:  * @baseType: the base type of type
        !          2991:  * @facet: the illegal facet
        !          2992:  *
        !          2993:  * Reports an illegal facet for atomic simple types.
        !          2994:  */
        !          2995: static void
        !          2996: xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
        !          2997:                          xmlParserErrors error,
        !          2998:                          xmlSchemaTypePtr type,
        !          2999:                          xmlSchemaTypePtr baseType,
        !          3000:                          xmlSchemaFacetPtr facet)
        !          3001: {
        !          3002:     xmlChar *des = NULL, *strT = NULL;
        !          3003: 
        !          3004:     xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node);
        !          3005:     xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL,
        !          3006:        "%s: The facet '%s' is not allowed on types derived from the "
        !          3007:        "type %s.\n",
        !          3008:        BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
        !          3009:        xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL),
        !          3010:        NULL, NULL);
        !          3011:     FREE_AND_NULL(des);
        !          3012:     FREE_AND_NULL(strT);
        !          3013: }
        !          3014: 
        !          3015: /**
        !          3016:  * xmlSchemaPIllegalFacetListUnionErr:
        !          3017:  * @ctxt: the schema parser context
        !          3018:  * @error: the error code
        !          3019:  * @itemDes: the designation of the schema item involved
        !          3020:  * @item: the schema item involved
        !          3021:  * @facet: the illegal facet
        !          3022:  *
        !          3023:  * Reports an illegal facet for <list> and <union>.
        !          3024:  */
        !          3025: static void
        !          3026: xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
        !          3027:                          xmlParserErrors error,
        !          3028:                          xmlSchemaTypePtr type,
        !          3029:                          xmlSchemaFacetPtr facet)
        !          3030: {
        !          3031:     xmlChar *des = NULL;
        !          3032: 
        !          3033:     xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type,
        !          3034:        type->node);
        !          3035:     xmlSchemaPErr(ctxt, type->node, error,
        !          3036:        "%s: The facet '%s' is not allowed.\n",
        !          3037:        BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
        !          3038:     FREE_AND_NULL(des);
        !          3039: }
        !          3040: 
        !          3041: /**
        !          3042:  * xmlSchemaPMutualExclAttrErr:
        !          3043:  * @ctxt: the schema validation context
        !          3044:  * @error: the error code
        !          3045:  * @elemDes: the designation of the parent element node
        !          3046:  * @attr: the bad attribute node
        !          3047:  * @type: the corresponding type of the attribute node
        !          3048:  *
        !          3049:  * Reports an illegal attribute.
        !          3050:  */
        !          3051: static void
        !          3052: xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
        !          3053:                         xmlParserErrors error,
        !          3054:                         xmlSchemaBasicItemPtr ownerItem,
        !          3055:                         xmlAttrPtr attr,
        !          3056:                         const char *name1,
        !          3057:                         const char *name2)
        !          3058: {
        !          3059:     xmlChar *des = NULL;
        !          3060: 
        !          3061:     xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent);
        !          3062:     xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
        !          3063:        "%s: The attributes '%s' and '%s' are mutually exclusive.\n",
        !          3064:        BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL);
        !          3065:     FREE_AND_NULL(des);
        !          3066: }
        !          3067: 
        !          3068: /**
        !          3069:  * xmlSchemaPSimpleTypeErr:
        !          3070:  * @ctxt:  the schema validation context
        !          3071:  * @error: the error code
        !          3072:  * @type: the type specifier
        !          3073:  * @ownerDes: the designation of the owner
        !          3074:  * @ownerItem: the schema object if existent
        !          3075:  * @node: the validated node
        !          3076:  * @value: the validated value
        !          3077:  *
        !          3078:  * Reports a simple type validation error.
        !          3079:  * TODO: Should this report the value of an element as well?
        !          3080:  */
        !          3081: static void
        !          3082: xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
        !          3083:                        xmlParserErrors error,
        !          3084:                        xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED,
        !          3085:                        xmlNodePtr node,
        !          3086:                        xmlSchemaTypePtr type,
        !          3087:                        const char *expected,
        !          3088:                        const xmlChar *value,
        !          3089:                        const char *message,
        !          3090:                        const xmlChar *str1,
        !          3091:                        const xmlChar *str2)
        !          3092: {
        !          3093:     xmlChar *msg = NULL;
        !          3094: 
        !          3095:     xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node);
        !          3096:     if (message == NULL) {
        !          3097:        /*
        !          3098:        * Use default messages.
        !          3099:        */
        !          3100:        if (type != NULL) {
        !          3101:            if (node->type == XML_ATTRIBUTE_NODE)
        !          3102:                msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
        !          3103:            else
        !          3104:                msg = xmlStrcat(msg, BAD_CAST "The character content is not a "
        !          3105:                "valid value of ");
        !          3106:            if (! xmlSchemaIsGlobalItem(type))
        !          3107:                msg = xmlStrcat(msg, BAD_CAST "the local ");
        !          3108:            else
        !          3109:                msg = xmlStrcat(msg, BAD_CAST "the ");
        !          3110: 
        !          3111:            if (WXS_IS_ATOMIC(type))
        !          3112:                msg = xmlStrcat(msg, BAD_CAST "atomic type");
        !          3113:            else if (WXS_IS_LIST(type))
        !          3114:                msg = xmlStrcat(msg, BAD_CAST "list type");
        !          3115:            else if (WXS_IS_UNION(type))
        !          3116:                msg = xmlStrcat(msg, BAD_CAST "union type");
        !          3117: 
        !          3118:            if (xmlSchemaIsGlobalItem(type)) {
        !          3119:                xmlChar *str = NULL;
        !          3120:                msg = xmlStrcat(msg, BAD_CAST " '");
        !          3121:                if (type->builtInType != 0) {
        !          3122:                    msg = xmlStrcat(msg, BAD_CAST "xs:");
        !          3123:                    msg = xmlStrcat(msg, type->name);
        !          3124:                } else
        !          3125:                    msg = xmlStrcat(msg,
        !          3126:                        xmlSchemaFormatQName(&str,
        !          3127:                            type->targetNamespace, type->name));
        !          3128:                msg = xmlStrcat(msg, BAD_CAST "'.");
        !          3129:                FREE_AND_NULL(str);
        !          3130:            }
        !          3131:        } else {
        !          3132:            if (node->type == XML_ATTRIBUTE_NODE)
        !          3133:                msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid.");
        !          3134:            else
        !          3135:                msg = xmlStrcat(msg, BAD_CAST "The character content is not "
        !          3136:                "valid.");
        !          3137:        }
        !          3138:        if (expected) {
        !          3139:            msg = xmlStrcat(msg, BAD_CAST " Expected is '");
        !          3140:            msg = xmlStrcat(msg, BAD_CAST expected);
        !          3141:            msg = xmlStrcat(msg, BAD_CAST "'.\n");
        !          3142:        } else
        !          3143:            msg = xmlStrcat(msg, BAD_CAST "\n");
        !          3144:        if (node->type == XML_ATTRIBUTE_NODE)
        !          3145:            xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL);
        !          3146:        else
        !          3147:            xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL);
        !          3148:     } else {
        !          3149:        msg = xmlStrcat(msg, BAD_CAST message);
        !          3150:        msg = xmlStrcat(msg, BAD_CAST ".\n");
        !          3151:        xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL,
        !          3152:             (const char*) msg, str1, str2, NULL, NULL, NULL);
        !          3153:     }
        !          3154:     /* Cleanup. */
        !          3155:     FREE_AND_NULL(msg)
        !          3156: }
        !          3157: 
        !          3158: /**
        !          3159:  * xmlSchemaPContentErr:
        !          3160:  * @ctxt: the schema parser context
        !          3161:  * @error: the error code
        !          3162:  * @onwerDes: the designation of the holder of the content
        !          3163:  * @ownerItem: the owner item of the holder of the content
        !          3164:  * @ownerElem: the node of the holder of the content
        !          3165:  * @child: the invalid child node
        !          3166:  * @message: the optional error message
        !          3167:  * @content: the optional string describing the correct content
        !          3168:  *
        !          3169:  * Reports an error concerning the content of a schema element.
        !          3170:  */
        !          3171: static void
        !          3172: xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
        !          3173:                     xmlParserErrors error,
        !          3174:                     xmlSchemaBasicItemPtr ownerItem,
        !          3175:                     xmlNodePtr ownerElem,
        !          3176:                     xmlNodePtr child,
        !          3177:                     const char *message,
        !          3178:                     const char *content)
        !          3179: {
        !          3180:     xmlChar *des = NULL;
        !          3181: 
        !          3182:     xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
        !          3183:     if (message != NULL)
        !          3184:        xmlSchemaPErr2(ctxt, ownerElem, child, error,
        !          3185:            "%s: %s.\n",
        !          3186:            BAD_CAST des, BAD_CAST message);
        !          3187:     else {
        !          3188:        if (content != NULL) {
        !          3189:            xmlSchemaPErr2(ctxt, ownerElem, child, error,
        !          3190:                "%s: The content is not valid. Expected is %s.\n",
        !          3191:                BAD_CAST des, BAD_CAST content);
        !          3192:        } else {
        !          3193:            xmlSchemaPErr2(ctxt, ownerElem, child, error,
        !          3194:                "%s: The content is not valid.\n",
        !          3195:                BAD_CAST des, NULL);
        !          3196:        }
        !          3197:     }
        !          3198:     FREE_AND_NULL(des)
        !          3199: }
        !          3200: 
        !          3201: /************************************************************************
        !          3202:  *                                                                     *
        !          3203:  *                     Streamable error functions                      *
        !          3204:  *                                                                     *
        !          3205:  ************************************************************************/
        !          3206: 
        !          3207: 
        !          3208: 
        !          3209: 
        !          3210: /************************************************************************
        !          3211:  *                                                                     *
        !          3212:  *                     Validation helper functions                     *
        !          3213:  *                                                                     *
        !          3214:  ************************************************************************/
        !          3215: 
        !          3216: 
        !          3217: /************************************************************************
        !          3218:  *                                                                     *
        !          3219:  *                     Allocation functions                            *
        !          3220:  *                                                                     *
        !          3221:  ************************************************************************/
        !          3222: 
        !          3223: /**
        !          3224:  * xmlSchemaNewSchemaForParserCtxt:
        !          3225:  * @ctxt:  a schema validation context
        !          3226:  *
        !          3227:  * Allocate a new Schema structure.
        !          3228:  *
        !          3229:  * Returns the newly allocated structure or NULL in case or error
        !          3230:  */
        !          3231: static xmlSchemaPtr
        !          3232: xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
        !          3233: {
        !          3234:     xmlSchemaPtr ret;
        !          3235: 
        !          3236:     ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema));
        !          3237:     if (ret == NULL) {
        !          3238:         xmlSchemaPErrMemory(ctxt, "allocating schema", NULL);
        !          3239:         return (NULL);
        !          3240:     }
        !          3241:     memset(ret, 0, sizeof(xmlSchema));
        !          3242:     ret->dict = ctxt->dict;
        !          3243:     xmlDictReference(ret->dict);
        !          3244: 
        !          3245:     return (ret);
        !          3246: }
        !          3247: 
        !          3248: /**
        !          3249:  * xmlSchemaNewFacet:
        !          3250:  *
        !          3251:  * Allocate a new Facet structure.
        !          3252:  *
        !          3253:  * Returns the newly allocated structure or NULL in case or error
        !          3254:  */
        !          3255: xmlSchemaFacetPtr
        !          3256: xmlSchemaNewFacet(void)
        !          3257: {
        !          3258:     xmlSchemaFacetPtr ret;
        !          3259: 
        !          3260:     ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet));
        !          3261:     if (ret == NULL) {
        !          3262:         return (NULL);
        !          3263:     }
        !          3264:     memset(ret, 0, sizeof(xmlSchemaFacet));
        !          3265: 
        !          3266:     return (ret);
        !          3267: }
        !          3268: 
        !          3269: /**
        !          3270:  * xmlSchemaNewAnnot:
        !          3271:  * @ctxt:  a schema validation context
        !          3272:  * @node:  a node
        !          3273:  *
        !          3274:  * Allocate a new annotation structure.
        !          3275:  *
        !          3276:  * Returns the newly allocated structure or NULL in case or error
        !          3277:  */
        !          3278: static xmlSchemaAnnotPtr
        !          3279: xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
        !          3280: {
        !          3281:     xmlSchemaAnnotPtr ret;
        !          3282: 
        !          3283:     ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot));
        !          3284:     if (ret == NULL) {
        !          3285:         xmlSchemaPErrMemory(ctxt, "allocating annotation", node);
        !          3286:         return (NULL);
        !          3287:     }
        !          3288:     memset(ret, 0, sizeof(xmlSchemaAnnot));
        !          3289:     ret->content = node;
        !          3290:     return (ret);
        !          3291: }
        !          3292: 
        !          3293: static xmlSchemaItemListPtr
        !          3294: xmlSchemaItemListCreate(void)
        !          3295: {
        !          3296:     xmlSchemaItemListPtr ret;
        !          3297: 
        !          3298:     ret = xmlMalloc(sizeof(xmlSchemaItemList));
        !          3299:     if (ret == NULL) {
        !          3300:        xmlSchemaPErrMemory(NULL,
        !          3301:            "allocating an item list structure", NULL);
        !          3302:        return (NULL);
        !          3303:     }
        !          3304:     memset(ret, 0, sizeof(xmlSchemaItemList));
        !          3305:     return (ret);
        !          3306: }
        !          3307: 
        !          3308: static void
        !          3309: xmlSchemaItemListClear(xmlSchemaItemListPtr list)
        !          3310: {
        !          3311:     if (list->items != NULL) {
        !          3312:        xmlFree(list->items);
        !          3313:        list->items = NULL;
        !          3314:     }
        !          3315:     list->nbItems = 0;
        !          3316:     list->sizeItems = 0;
        !          3317: }
        !          3318: 
        !          3319: static int
        !          3320: xmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item)
        !          3321: {
        !          3322:     if (list->items == NULL) {
        !          3323:        list->items = (void **) xmlMalloc(
        !          3324:            20 * sizeof(void *));
        !          3325:        if (list->items == NULL) {
        !          3326:            xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
        !          3327:            return(-1);
        !          3328:        }
        !          3329:        list->sizeItems = 20;
        !          3330:     } else if (list->sizeItems <= list->nbItems) {
        !          3331:        list->sizeItems *= 2;
        !          3332:        list->items = (void **) xmlRealloc(list->items,
        !          3333:            list->sizeItems * sizeof(void *));
        !          3334:        if (list->items == NULL) {
        !          3335:            xmlSchemaPErrMemory(NULL, "growing item list", NULL);
        !          3336:            list->sizeItems = 0;
        !          3337:            return(-1);
        !          3338:        }
        !          3339:     }
        !          3340:     list->items[list->nbItems++] = item;
        !          3341:     return(0);
        !          3342: }
        !          3343: 
        !          3344: static int
        !          3345: xmlSchemaItemListAddSize(xmlSchemaItemListPtr list,
        !          3346:                         int initialSize,
        !          3347:                         void *item)
        !          3348: {
        !          3349:     if (list->items == NULL) {
        !          3350:        if (initialSize <= 0)
        !          3351:            initialSize = 1;
        !          3352:        list->items = (void **) xmlMalloc(
        !          3353:            initialSize * sizeof(void *));
        !          3354:        if (list->items == NULL) {
        !          3355:            xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
        !          3356:            return(-1);
        !          3357:        }
        !          3358:        list->sizeItems = initialSize;
        !          3359:     } else if (list->sizeItems <= list->nbItems) {
        !          3360:        list->sizeItems *= 2;
        !          3361:        list->items = (void **) xmlRealloc(list->items,
        !          3362:            list->sizeItems * sizeof(void *));
        !          3363:        if (list->items == NULL) {
        !          3364:            xmlSchemaPErrMemory(NULL, "growing item list", NULL);
        !          3365:            list->sizeItems = 0;
        !          3366:            return(-1);
        !          3367:        }
        !          3368:     }
        !          3369:     list->items[list->nbItems++] = item;
        !          3370:     return(0);
        !          3371: }
        !          3372: 
        !          3373: static int
        !          3374: xmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx)
        !          3375: {
        !          3376:     if (list->items == NULL) {
        !          3377:        list->items = (void **) xmlMalloc(
        !          3378:            20 * sizeof(void *));
        !          3379:        if (list->items == NULL) {
        !          3380:            xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
        !          3381:            return(-1);
        !          3382:        }
        !          3383:        list->sizeItems = 20;
        !          3384:     } else if (list->sizeItems <= list->nbItems) {
        !          3385:        list->sizeItems *= 2;
        !          3386:        list->items = (void **) xmlRealloc(list->items,
        !          3387:            list->sizeItems * sizeof(void *));
        !          3388:        if (list->items == NULL) {
        !          3389:            xmlSchemaPErrMemory(NULL, "growing item list", NULL);
        !          3390:            list->sizeItems = 0;
        !          3391:            return(-1);
        !          3392:        }
        !          3393:     }
        !          3394:     /*
        !          3395:     * Just append if the index is greater/equal than the item count.
        !          3396:     */
        !          3397:     if (idx >= list->nbItems) {
        !          3398:        list->items[list->nbItems++] = item;
        !          3399:     } else {
        !          3400:        int i;
        !          3401:        for (i = list->nbItems; i > idx; i--)
        !          3402:            list->items[i] = list->items[i-1];
        !          3403:        list->items[idx] = item;
        !          3404:        list->nbItems++;
        !          3405:     }
        !          3406:     return(0);
        !          3407: }
        !          3408: 
        !          3409: #if 0 /* enable if ever needed */
        !          3410: static int
        !          3411: xmlSchemaItemListInsertSize(xmlSchemaItemListPtr list,
        !          3412:                            int initialSize,
        !          3413:                            void *item,
        !          3414:                            int idx)
        !          3415: {
        !          3416:     if (list->items == NULL) {
        !          3417:        if (initialSize <= 0)
        !          3418:            initialSize = 1;
        !          3419:        list->items = (void **) xmlMalloc(
        !          3420:            initialSize * sizeof(void *));
        !          3421:        if (list->items == NULL) {
        !          3422:            xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
        !          3423:            return(-1);
        !          3424:        }
        !          3425:        list->sizeItems = initialSize;
        !          3426:     } else if (list->sizeItems <= list->nbItems) {
        !          3427:        list->sizeItems *= 2;
        !          3428:        list->items = (void **) xmlRealloc(list->items,
        !          3429:            list->sizeItems * sizeof(void *));
        !          3430:        if (list->items == NULL) {
        !          3431:            xmlSchemaPErrMemory(NULL, "growing item list", NULL);
        !          3432:            list->sizeItems = 0;
        !          3433:            return(-1);
        !          3434:        }
        !          3435:     }
        !          3436:     /*
        !          3437:     * Just append if the index is greater/equal than the item count.
        !          3438:     */
        !          3439:     if (idx >= list->nbItems) {
        !          3440:        list->items[list->nbItems++] = item;
        !          3441:     } else {
        !          3442:        int i;
        !          3443:        for (i = list->nbItems; i > idx; i--)
        !          3444:            list->items[i] = list->items[i-1];
        !          3445:        list->items[idx] = item;
        !          3446:        list->nbItems++;
        !          3447:     }
        !          3448:     return(0);
        !          3449: }
        !          3450: #endif
        !          3451: 
        !          3452: static int
        !          3453: xmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx)
        !          3454: {
        !          3455:     int i;
        !          3456:     if ((list->items == NULL) || (idx >= list->nbItems)) {
        !          3457:        xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, "
        !          3458:            "index error.\n");
        !          3459:        return(-1);
        !          3460:     }
        !          3461: 
        !          3462:     if (list->nbItems == 1) {
        !          3463:        /* TODO: Really free the list? */
        !          3464:        xmlFree(list->items);
        !          3465:        list->items = NULL;
        !          3466:        list->nbItems = 0;
        !          3467:        list->sizeItems = 0;
        !          3468:     } else if (list->nbItems -1 == idx) {
        !          3469:        list->nbItems--;
        !          3470:     } else {
        !          3471:        for (i = idx; i < list->nbItems -1; i++)
        !          3472:            list->items[i] = list->items[i+1];
        !          3473:        list->nbItems--;
        !          3474:     }
        !          3475:     return(0);
        !          3476: }
        !          3477: 
        !          3478: /**
        !          3479:  * xmlSchemaItemListFree:
        !          3480:  * @annot:  a schema type structure
        !          3481:  *
        !          3482:  * Deallocate a annotation structure
        !          3483:  */
        !          3484: static void
        !          3485: xmlSchemaItemListFree(xmlSchemaItemListPtr list)
        !          3486: {
        !          3487:     if (list == NULL)
        !          3488:        return;
        !          3489:     if (list->items != NULL)
        !          3490:        xmlFree(list->items);
        !          3491:     xmlFree(list);
        !          3492: }
        !          3493: 
        !          3494: static void
        !          3495: xmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
        !          3496: {
        !          3497:     if (bucket == NULL)
        !          3498:        return;
        !          3499:     if (bucket->globals != NULL) {
        !          3500:        xmlSchemaComponentListFree(bucket->globals);
        !          3501:        xmlSchemaItemListFree(bucket->globals);
        !          3502:     }
        !          3503:     if (bucket->locals != NULL) {
        !          3504:        xmlSchemaComponentListFree(bucket->locals);
        !          3505:        xmlSchemaItemListFree(bucket->locals);
        !          3506:     }
        !          3507:     if (bucket->relations != NULL) {
        !          3508:        xmlSchemaSchemaRelationPtr prev, cur = bucket->relations;
        !          3509:        do {
        !          3510:            prev = cur;
        !          3511:            cur = cur->next;
        !          3512:            xmlFree(prev);
        !          3513:        } while (cur != NULL);
        !          3514:     }
        !          3515:     if ((! bucket->preserveDoc) && (bucket->doc != NULL)) {
        !          3516:        xmlFreeDoc(bucket->doc);
        !          3517:     }
        !          3518:     if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
        !          3519:        if (WXS_IMPBUCKET(bucket)->schema != NULL)
        !          3520:            xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema);
        !          3521:     }
        !          3522:     xmlFree(bucket);
        !          3523: }
        !          3524: 
        !          3525: static xmlSchemaBucketPtr
        !          3526: xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
        !          3527:                         int type, const xmlChar *targetNamespace)
        !          3528: {
        !          3529:     xmlSchemaBucketPtr ret;
        !          3530:     int size;
        !          3531:     xmlSchemaPtr mainSchema;
        !          3532: 
        !          3533:     if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) {
        !          3534:        PERROR_INT("xmlSchemaBucketCreate",
        !          3535:            "no main schema on constructor");
        !          3536:        return(NULL);
        !          3537:     }
        !          3538:     mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
        !          3539:     /* Create the schema bucket. */
        !          3540:     if (WXS_IS_BUCKET_INCREDEF(type))
        !          3541:        size = sizeof(xmlSchemaInclude);
        !          3542:     else
        !          3543:        size = sizeof(xmlSchemaImport);
        !          3544:     ret = (xmlSchemaBucketPtr) xmlMalloc(size);
        !          3545:     if (ret == NULL) {
        !          3546:        xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL);
        !          3547:        return(NULL);
        !          3548:     }
        !          3549:     memset(ret, 0, size);
        !          3550:     ret->targetNamespace = targetNamespace;
        !          3551:     ret->type = type;
        !          3552:     ret->globals = xmlSchemaItemListCreate();
        !          3553:     if (ret->globals == NULL) {
        !          3554:        xmlFree(ret);
        !          3555:        return(NULL);
        !          3556:     }
        !          3557:     ret->locals = xmlSchemaItemListCreate();
        !          3558:     if (ret->locals == NULL) {
        !          3559:        xmlFree(ret);
        !          3560:        return(NULL);
        !          3561:     }
        !          3562:     /*
        !          3563:     * The following will assure that only the first bucket is marked as
        !          3564:     * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema.
        !          3565:     * For each following import buckets an xmlSchema will be created.
        !          3566:     * An xmlSchema will be created for every distinct targetNamespace.
        !          3567:     * We assign the targetNamespace to the schemata here.
        !          3568:     */
        !          3569:     if (! WXS_HAS_BUCKETS(pctxt)) {
        !          3570:        if (WXS_IS_BUCKET_INCREDEF(type)) {
        !          3571:            PERROR_INT("xmlSchemaBucketCreate",
        !          3572:                "first bucket but it's an include or redefine");
        !          3573:            xmlSchemaBucketFree(ret);
        !          3574:            return(NULL);
        !          3575:        }
        !          3576:        /* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */
        !          3577:        ret->type = XML_SCHEMA_SCHEMA_MAIN;
        !          3578:        /* Point to the *main* schema. */
        !          3579:        WXS_CONSTRUCTOR(pctxt)->mainBucket = ret;
        !          3580:        WXS_IMPBUCKET(ret)->schema = mainSchema;
        !          3581:        /*
        !          3582:        * Ensure that the main schema gets a targetNamespace.
        !          3583:        */
        !          3584:        mainSchema->targetNamespace = targetNamespace;
        !          3585:     } else {
        !          3586:        if (type == XML_SCHEMA_SCHEMA_MAIN) {
        !          3587:            PERROR_INT("xmlSchemaBucketCreate",
        !          3588:                "main bucket but it's not the first one");
        !          3589:            xmlSchemaBucketFree(ret);
        !          3590:            return(NULL);
        !          3591:        } else if (type == XML_SCHEMA_SCHEMA_IMPORT) {
        !          3592:            /*
        !          3593:            * Create a schema for imports and assign the
        !          3594:            * targetNamespace.
        !          3595:            */
        !          3596:            WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt);
        !          3597:            if (WXS_IMPBUCKET(ret)->schema == NULL) {
        !          3598:                xmlSchemaBucketFree(ret);
        !          3599:                return(NULL);
        !          3600:            }
        !          3601:            WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace;
        !          3602:        }
        !          3603:     }
        !          3604:     if (WXS_IS_BUCKET_IMPMAIN(type)) {
        !          3605:        int res;
        !          3606:        /*
        !          3607:        * Imports go into the "schemasImports" slot of the main *schema*.
        !          3608:        * Note that we create an import entry for the main schema as well; i.e.,
        !          3609:        * even if there's only one schema, we'll get an import.
        !          3610:        */
        !          3611:        if (mainSchema->schemasImports == NULL) {
        !          3612:            mainSchema->schemasImports = xmlHashCreateDict(5,
        !          3613:                WXS_CONSTRUCTOR(pctxt)->dict);
        !          3614:            if (mainSchema->schemasImports == NULL) {
        !          3615:                xmlSchemaBucketFree(ret);
        !          3616:                return(NULL);
        !          3617:            }
        !          3618:        }
        !          3619:        if (targetNamespace == NULL)
        !          3620:            res = xmlHashAddEntry(mainSchema->schemasImports,
        !          3621:                XML_SCHEMAS_NO_NAMESPACE, ret);
        !          3622:        else
        !          3623:            res = xmlHashAddEntry(mainSchema->schemasImports,
        !          3624:                targetNamespace, ret);
        !          3625:        if (res != 0) {
        !          3626:            PERROR_INT("xmlSchemaBucketCreate",
        !          3627:                "failed to add the schema bucket to the hash");
        !          3628:            xmlSchemaBucketFree(ret);
        !          3629:            return(NULL);
        !          3630:        }
        !          3631:     } else {
        !          3632:        /* Set the @ownerImport of an include bucket. */
        !          3633:        if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
        !          3634:            WXS_INCBUCKET(ret)->ownerImport =
        !          3635:                WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
        !          3636:        else
        !          3637:            WXS_INCBUCKET(ret)->ownerImport =
        !          3638:                WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
        !          3639: 
        !          3640:        /* Includes got into the "includes" slot of the *main* schema. */
        !          3641:        if (mainSchema->includes == NULL) {
        !          3642:            mainSchema->includes = xmlSchemaItemListCreate();
        !          3643:            if (mainSchema->includes == NULL) {
        !          3644:                xmlSchemaBucketFree(ret);
        !          3645:                return(NULL);
        !          3646:            }
        !          3647:        }
        !          3648:        xmlSchemaItemListAdd(mainSchema->includes, ret);
        !          3649:     }
        !          3650:     /*
        !          3651:     * Add to list of all buckets; this is used for lookup
        !          3652:     * during schema construction time only.
        !          3653:     */
        !          3654:     if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1)
        !          3655:        return(NULL);
        !          3656:     return(ret);
        !          3657: }
        !          3658: 
        !          3659: static int
        !          3660: xmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item)
        !          3661: {
        !          3662:     if (*list == NULL) {
        !          3663:        *list = xmlSchemaItemListCreate();
        !          3664:        if (*list == NULL)
        !          3665:            return(-1);
        !          3666:     }
        !          3667:     xmlSchemaItemListAddSize(*list, initialSize, item);
        !          3668:     return(0);
        !          3669: }
        !          3670: 
        !          3671: /**
        !          3672:  * xmlSchemaFreeAnnot:
        !          3673:  * @annot:  a schema type structure
        !          3674:  *
        !          3675:  * Deallocate a annotation structure
        !          3676:  */
        !          3677: static void
        !          3678: xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
        !          3679: {
        !          3680:     if (annot == NULL)
        !          3681:         return;
        !          3682:     if (annot->next == NULL) {
        !          3683:        xmlFree(annot);
        !          3684:     } else {
        !          3685:        xmlSchemaAnnotPtr prev;
        !          3686: 
        !          3687:        do {
        !          3688:            prev = annot;
        !          3689:            annot = annot->next;
        !          3690:            xmlFree(prev);
        !          3691:        } while (annot != NULL);
        !          3692:     }
        !          3693: }
        !          3694: 
        !          3695: /**
        !          3696:  * xmlSchemaFreeNotation:
        !          3697:  * @schema:  a schema notation structure
        !          3698:  *
        !          3699:  * Deallocate a Schema Notation structure.
        !          3700:  */
        !          3701: static void
        !          3702: xmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
        !          3703: {
        !          3704:     if (nota == NULL)
        !          3705:         return;
        !          3706:     xmlFree(nota);
        !          3707: }
        !          3708: 
        !          3709: /**
        !          3710:  * xmlSchemaFreeAttribute:
        !          3711:  * @attr:  an attribute declaration
        !          3712:  *
        !          3713:  * Deallocates an attribute declaration structure.
        !          3714:  */
        !          3715: static void
        !          3716: xmlSchemaFreeAttribute(xmlSchemaAttributePtr attr)
        !          3717: {
        !          3718:     if (attr == NULL)
        !          3719:         return;
        !          3720:     if (attr->annot != NULL)
        !          3721:        xmlSchemaFreeAnnot(attr->annot);
        !          3722:     if (attr->defVal != NULL)
        !          3723:        xmlSchemaFreeValue(attr->defVal);
        !          3724:     xmlFree(attr);
        !          3725: }
        !          3726: 
        !          3727: /**
        !          3728:  * xmlSchemaFreeAttributeUse:
        !          3729:  * @use:  an attribute use
        !          3730:  *
        !          3731:  * Deallocates an attribute use structure.
        !          3732:  */
        !          3733: static void
        !          3734: xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
        !          3735: {
        !          3736:     if (use == NULL)
        !          3737:         return;
        !          3738:     if (use->annot != NULL)
        !          3739:        xmlSchemaFreeAnnot(use->annot);
        !          3740:     if (use->defVal != NULL)
        !          3741:        xmlSchemaFreeValue(use->defVal);
        !          3742:     xmlFree(use);
        !          3743: }
        !          3744: 
        !          3745: /**
        !          3746:  * xmlSchemaFreeAttributeUseProhib:
        !          3747:  * @prohib:  an attribute use prohibition
        !          3748:  *
        !          3749:  * Deallocates an attribute use structure.
        !          3750:  */
        !          3751: static void
        !          3752: xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
        !          3753: {
        !          3754:     if (prohib == NULL)
        !          3755:         return;
        !          3756:     xmlFree(prohib);
        !          3757: }
        !          3758: 
        !          3759: /**
        !          3760:  * xmlSchemaFreeWildcardNsSet:
        !          3761:  * set:  a schema wildcard namespace
        !          3762:  *
        !          3763:  * Deallocates a list of wildcard constraint structures.
        !          3764:  */
        !          3765: static void
        !          3766: xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set)
        !          3767: {
        !          3768:     xmlSchemaWildcardNsPtr next;
        !          3769: 
        !          3770:     while (set != NULL) {
        !          3771:        next = set->next;
        !          3772:        xmlFree(set);
        !          3773:        set = next;
        !          3774:     }
        !          3775: }
        !          3776: 
        !          3777: /**
        !          3778:  * xmlSchemaFreeWildcard:
        !          3779:  * @wildcard:  a wildcard structure
        !          3780:  *
        !          3781:  * Deallocates a wildcard structure.
        !          3782:  */
        !          3783: void
        !          3784: xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
        !          3785: {
        !          3786:     if (wildcard == NULL)
        !          3787:         return;
        !          3788:     if (wildcard->annot != NULL)
        !          3789:         xmlSchemaFreeAnnot(wildcard->annot);
        !          3790:     if (wildcard->nsSet != NULL)
        !          3791:        xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
        !          3792:     if (wildcard->negNsSet != NULL)
        !          3793:        xmlFree(wildcard->negNsSet);
        !          3794:     xmlFree(wildcard);
        !          3795: }
        !          3796: 
        !          3797: /**
        !          3798:  * xmlSchemaFreeAttributeGroup:
        !          3799:  * @schema:  a schema attribute group structure
        !          3800:  *
        !          3801:  * Deallocate a Schema Attribute Group structure.
        !          3802:  */
        !          3803: static void
        !          3804: xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
        !          3805: {
        !          3806:     if (attrGr == NULL)
        !          3807:         return;
        !          3808:     if (attrGr->annot != NULL)
        !          3809:         xmlSchemaFreeAnnot(attrGr->annot);
        !          3810:     if (attrGr->attrUses != NULL)
        !          3811:        xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
        !          3812:     xmlFree(attrGr);
        !          3813: }
        !          3814: 
        !          3815: /**
        !          3816:  * xmlSchemaFreeQNameRef:
        !          3817:  * @item: a QName reference structure
        !          3818:  *
        !          3819:  * Deallocatea a QName reference structure.
        !          3820:  */
        !          3821: static void
        !          3822: xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item)
        !          3823: {
        !          3824:     xmlFree(item);
        !          3825: }
        !          3826: 
        !          3827: /**
        !          3828:  * xmlSchemaFreeTypeLinkList:
        !          3829:  * @alink: a type link
        !          3830:  *
        !          3831:  * Deallocate a list of types.
        !          3832:  */
        !          3833: static void
        !          3834: xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link)
        !          3835: {
        !          3836:     xmlSchemaTypeLinkPtr next;
        !          3837: 
        !          3838:     while (link != NULL) {
        !          3839:        next = link->next;
        !          3840:        xmlFree(link);
        !          3841:        link = next;
        !          3842:     }
        !          3843: }
        !          3844: 
        !          3845: static void
        !          3846: xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
        !          3847: {
        !          3848:     xmlSchemaIDCStateObjPtr next;
        !          3849:     while (sto != NULL) {
        !          3850:        next = sto->next;
        !          3851:        if (sto->history != NULL)
        !          3852:            xmlFree(sto->history);
        !          3853:        if (sto->xpathCtxt != NULL)
        !          3854:            xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
        !          3855:        xmlFree(sto);
        !          3856:        sto = next;
        !          3857:     }
        !          3858: }
        !          3859: 
        !          3860: /**
        !          3861:  * xmlSchemaFreeIDC:
        !          3862:  * @idc: a identity-constraint definition
        !          3863:  *
        !          3864:  * Deallocates an identity-constraint definition.
        !          3865:  */
        !          3866: static void
        !          3867: xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
        !          3868: {
        !          3869:     xmlSchemaIDCSelectPtr cur, prev;
        !          3870: 
        !          3871:     if (idcDef == NULL)
        !          3872:        return;
        !          3873:     if (idcDef->annot != NULL)
        !          3874:         xmlSchemaFreeAnnot(idcDef->annot);
        !          3875:     /* Selector */
        !          3876:     if (idcDef->selector != NULL) {
        !          3877:        if (idcDef->selector->xpathComp != NULL)
        !          3878:            xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
        !          3879:        xmlFree(idcDef->selector);
        !          3880:     }
        !          3881:     /* Fields */
        !          3882:     if (idcDef->fields != NULL) {
        !          3883:        cur = idcDef->fields;
        !          3884:        do {
        !          3885:            prev = cur;
        !          3886:            cur = cur->next;
        !          3887:            if (prev->xpathComp != NULL)
        !          3888:                xmlFreePattern((xmlPatternPtr) prev->xpathComp);
        !          3889:            xmlFree(prev);
        !          3890:        } while (cur != NULL);
        !          3891:     }
        !          3892:     xmlFree(idcDef);
        !          3893: }
        !          3894: 
        !          3895: /**
        !          3896:  * xmlSchemaFreeElement:
        !          3897:  * @schema:  a schema element structure
        !          3898:  *
        !          3899:  * Deallocate a Schema Element structure.
        !          3900:  */
        !          3901: static void
        !          3902: xmlSchemaFreeElement(xmlSchemaElementPtr elem)
        !          3903: {
        !          3904:     if (elem == NULL)
        !          3905:         return;
        !          3906:     if (elem->annot != NULL)
        !          3907:         xmlSchemaFreeAnnot(elem->annot);
        !          3908:     if (elem->contModel != NULL)
        !          3909:         xmlRegFreeRegexp(elem->contModel);
        !          3910:     if (elem->defVal != NULL)
        !          3911:        xmlSchemaFreeValue(elem->defVal);
        !          3912:     xmlFree(elem);
        !          3913: }
        !          3914: 
        !          3915: /**
        !          3916:  * xmlSchemaFreeFacet:
        !          3917:  * @facet:  a schema facet structure
        !          3918:  *
        !          3919:  * Deallocate a Schema Facet structure.
        !          3920:  */
        !          3921: void
        !          3922: xmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
        !          3923: {
        !          3924:     if (facet == NULL)
        !          3925:         return;
        !          3926:     if (facet->val != NULL)
        !          3927:         xmlSchemaFreeValue(facet->val);
        !          3928:     if (facet->regexp != NULL)
        !          3929:         xmlRegFreeRegexp(facet->regexp);
        !          3930:     if (facet->annot != NULL)
        !          3931:         xmlSchemaFreeAnnot(facet->annot);
        !          3932:     xmlFree(facet);
        !          3933: }
        !          3934: 
        !          3935: /**
        !          3936:  * xmlSchemaFreeType:
        !          3937:  * @type:  a schema type structure
        !          3938:  *
        !          3939:  * Deallocate a Schema Type structure.
        !          3940:  */
        !          3941: void
        !          3942: xmlSchemaFreeType(xmlSchemaTypePtr type)
        !          3943: {
        !          3944:     if (type == NULL)
        !          3945:         return;
        !          3946:     if (type->annot != NULL)
        !          3947:         xmlSchemaFreeAnnot(type->annot);
        !          3948:     if (type->facets != NULL) {
        !          3949:         xmlSchemaFacetPtr facet, next;
        !          3950: 
        !          3951:         facet = type->facets;
        !          3952:         while (facet != NULL) {
        !          3953:             next = facet->next;
        !          3954:             xmlSchemaFreeFacet(facet);
        !          3955:             facet = next;
        !          3956:         }
        !          3957:     }
        !          3958:     if (type->attrUses != NULL)
        !          3959:        xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses);
        !          3960:     if (type->memberTypes != NULL)
        !          3961:        xmlSchemaFreeTypeLinkList(type->memberTypes);
        !          3962:     if (type->facetSet != NULL) {
        !          3963:        xmlSchemaFacetLinkPtr next, link;
        !          3964: 
        !          3965:        link = type->facetSet;
        !          3966:        do {
        !          3967:            next = link->next;
        !          3968:            xmlFree(link);
        !          3969:            link = next;
        !          3970:        } while (link != NULL);
        !          3971:     }
        !          3972:     if (type->contModel != NULL)
        !          3973:         xmlRegFreeRegexp(type->contModel);
        !          3974:     xmlFree(type);
        !          3975: }
        !          3976: 
        !          3977: /**
        !          3978:  * xmlSchemaFreeModelGroupDef:
        !          3979:  * @item:  a schema model group definition
        !          3980:  *
        !          3981:  * Deallocates a schema model group definition.
        !          3982:  */
        !          3983: static void
        !          3984: xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item)
        !          3985: {
        !          3986:     if (item->annot != NULL)
        !          3987:        xmlSchemaFreeAnnot(item->annot);
        !          3988:     xmlFree(item);
        !          3989: }
        !          3990: 
        !          3991: /**
        !          3992:  * xmlSchemaFreeModelGroup:
        !          3993:  * @item:  a schema model group
        !          3994:  *
        !          3995:  * Deallocates a schema model group structure.
        !          3996:  */
        !          3997: static void
        !          3998: xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item)
        !          3999: {
        !          4000:     if (item->annot != NULL)
        !          4001:        xmlSchemaFreeAnnot(item->annot);
        !          4002:     xmlFree(item);
        !          4003: }
        !          4004: 
        !          4005: static void
        !          4006: xmlSchemaComponentListFree(xmlSchemaItemListPtr list)
        !          4007: {
        !          4008:     if ((list == NULL) || (list->nbItems == 0))
        !          4009:        return;
        !          4010:     {
        !          4011:        xmlSchemaTreeItemPtr item;
        !          4012:        xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items;
        !          4013:        int i;
        !          4014: 
        !          4015:        for (i = 0; i < list->nbItems; i++) {
        !          4016:            item = items[i];
        !          4017:            if (item == NULL)
        !          4018:                continue;
        !          4019:            switch (item->type) {
        !          4020:                case XML_SCHEMA_TYPE_SIMPLE:
        !          4021:                case XML_SCHEMA_TYPE_COMPLEX:
        !          4022:                    xmlSchemaFreeType((xmlSchemaTypePtr) item);
        !          4023:                    break;
        !          4024:                case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          4025:                    xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item);
        !          4026:                    break;
        !          4027:                case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          4028:                    xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item);
        !          4029:                    break;
        !          4030:                case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
        !          4031:                    xmlSchemaFreeAttributeUseProhib(
        !          4032:                        (xmlSchemaAttributeUseProhibPtr) item);
        !          4033:                    break;
        !          4034:                case XML_SCHEMA_TYPE_ELEMENT:
        !          4035:                    xmlSchemaFreeElement((xmlSchemaElementPtr) item);
        !          4036:                    break;
        !          4037:                case XML_SCHEMA_TYPE_PARTICLE:
        !          4038:                    if (item->annot != NULL)
        !          4039:                        xmlSchemaFreeAnnot(item->annot);
        !          4040:                    xmlFree(item);
        !          4041:                    break;
        !          4042:                case XML_SCHEMA_TYPE_SEQUENCE:
        !          4043:                case XML_SCHEMA_TYPE_CHOICE:
        !          4044:                case XML_SCHEMA_TYPE_ALL:
        !          4045:                    xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item);
        !          4046:                    break;
        !          4047:                case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          4048:                    xmlSchemaFreeAttributeGroup(
        !          4049:                        (xmlSchemaAttributeGroupPtr) item);
        !          4050:                    break;
        !          4051:                case XML_SCHEMA_TYPE_GROUP:
        !          4052:                    xmlSchemaFreeModelGroupDef(
        !          4053:                        (xmlSchemaModelGroupDefPtr) item);
        !          4054:                    break;
        !          4055:                case XML_SCHEMA_TYPE_ANY:
        !          4056:                case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
        !          4057:                    xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item);
        !          4058:                    break;
        !          4059:                case XML_SCHEMA_TYPE_IDC_KEY:
        !          4060:                case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          4061:                case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          4062:                    xmlSchemaFreeIDC((xmlSchemaIDCPtr) item);
        !          4063:                    break;
        !          4064:                case XML_SCHEMA_TYPE_NOTATION:
        !          4065:                    xmlSchemaFreeNotation((xmlSchemaNotationPtr) item);
        !          4066:                    break;
        !          4067:                case XML_SCHEMA_EXTRA_QNAMEREF:
        !          4068:                    xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item);
        !          4069:                    break;
        !          4070:                default: {
        !          4071:                    /* TODO: This should never be hit. */
        !          4072:                    xmlSchemaPSimpleInternalErr(NULL,
        !          4073:                        "Internal error: xmlSchemaComponentListFree, "
        !          4074:                        "unexpected component type '%s'\n",
        !          4075:                        (const xmlChar *) WXS_ITEM_TYPE_NAME(item));
        !          4076:                         }
        !          4077:                    break;
        !          4078:            }
        !          4079:        }
        !          4080:        list->nbItems = 0;
        !          4081:     }
        !          4082: }
        !          4083: 
        !          4084: /**
        !          4085:  * xmlSchemaFree:
        !          4086:  * @schema:  a schema structure
        !          4087:  *
        !          4088:  * Deallocate a Schema structure.
        !          4089:  */
        !          4090: void
        !          4091: xmlSchemaFree(xmlSchemaPtr schema)
        !          4092: {
        !          4093:     if (schema == NULL)
        !          4094:         return;
        !          4095:     /* @volatiles is not used anymore :-/ */
        !          4096:     if (schema->volatiles != NULL)
        !          4097:        TODO
        !          4098:     /*
        !          4099:     * Note that those slots are not responsible for freeing
        !          4100:     * schema components anymore; this will now be done by
        !          4101:     * the schema buckets.
        !          4102:     */
        !          4103:     if (schema->notaDecl != NULL)
        !          4104:         xmlHashFree(schema->notaDecl, NULL);
        !          4105:     if (schema->attrDecl != NULL)
        !          4106:         xmlHashFree(schema->attrDecl, NULL);
        !          4107:     if (schema->attrgrpDecl != NULL)
        !          4108:         xmlHashFree(schema->attrgrpDecl, NULL);
        !          4109:     if (schema->elemDecl != NULL)
        !          4110:         xmlHashFree(schema->elemDecl, NULL);
        !          4111:     if (schema->typeDecl != NULL)
        !          4112:         xmlHashFree(schema->typeDecl, NULL);
        !          4113:     if (schema->groupDecl != NULL)
        !          4114:         xmlHashFree(schema->groupDecl, NULL);
        !          4115:     if (schema->idcDef != NULL)
        !          4116:         xmlHashFree(schema->idcDef, NULL);
        !          4117: 
        !          4118:     if (schema->schemasImports != NULL)
        !          4119:        xmlHashFree(schema->schemasImports,
        !          4120:                    (xmlHashDeallocator) xmlSchemaBucketFree);
        !          4121:     if (schema->includes != NULL) {
        !          4122:        xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes;
        !          4123:        int i;
        !          4124:        for (i = 0; i < list->nbItems; i++) {
        !          4125:            xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]);
        !          4126:        }
        !          4127:        xmlSchemaItemListFree(list);
        !          4128:     }
        !          4129:     if (schema->annot != NULL)
        !          4130:         xmlSchemaFreeAnnot(schema->annot);
        !          4131:     /* Never free the doc here, since this will be done by the buckets. */
        !          4132: 
        !          4133:     xmlDictFree(schema->dict);
        !          4134:     xmlFree(schema);
        !          4135: }
        !          4136: 
        !          4137: /************************************************************************
        !          4138:  *                                                                     *
        !          4139:  *                     Debug functions                                 *
        !          4140:  *                                                                     *
        !          4141:  ************************************************************************/
        !          4142: 
        !          4143: #ifdef LIBXML_OUTPUT_ENABLED
        !          4144: 
        !          4145: static void
        !          4146: xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */
        !          4147: 
        !          4148: /**
        !          4149:  * xmlSchemaElementDump:
        !          4150:  * @elem:  an element
        !          4151:  * @output:  the file output
        !          4152:  *
        !          4153:  * Dump the element
        !          4154:  */
        !          4155: static void
        !          4156: xmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output,
        !          4157:                      const xmlChar * name ATTRIBUTE_UNUSED,
        !          4158:                     const xmlChar * namespace ATTRIBUTE_UNUSED,
        !          4159:                      const xmlChar * context ATTRIBUTE_UNUSED)
        !          4160: {
        !          4161:     if (elem == NULL)
        !          4162:         return;
        !          4163: 
        !          4164: 
        !          4165:     fprintf(output, "Element");
        !          4166:     if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
        !          4167:        fprintf(output, " (global)");
        !          4168:     fprintf(output, ": '%s' ", elem->name);
        !          4169:     if (namespace != NULL)
        !          4170:        fprintf(output, "ns '%s'", namespace);
        !          4171:     fprintf(output, "\n");
        !          4172: #if 0
        !          4173:     if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) {
        !          4174:        fprintf(output, "  min %d ", elem->minOccurs);
        !          4175:         if (elem->maxOccurs >= UNBOUNDED)
        !          4176:             fprintf(output, "max: unbounded\n");
        !          4177:         else if (elem->maxOccurs != 1)
        !          4178:             fprintf(output, "max: %d\n", elem->maxOccurs);
        !          4179:         else
        !          4180:             fprintf(output, "\n");
        !          4181:     }
        !          4182: #endif
        !          4183:     /*
        !          4184:     * Misc other properties.
        !          4185:     */
        !          4186:     if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
        !          4187:        (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
        !          4188:        (elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
        !          4189:        (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
        !          4190:        fprintf(output, "  props: ");
        !          4191:        if (elem->flags & XML_SCHEMAS_ELEM_FIXED)
        !          4192:            fprintf(output, "[fixed] ");
        !          4193:        if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
        !          4194:            fprintf(output, "[default] ");
        !          4195:        if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
        !          4196:            fprintf(output, "[abstract] ");
        !          4197:        if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
        !          4198:            fprintf(output, "[nillable] ");
        !          4199:        fprintf(output, "\n");
        !          4200:     }
        !          4201:     /*
        !          4202:     * Default/fixed value.
        !          4203:     */
        !          4204:     if (elem->value != NULL)
        !          4205:        fprintf(output, "  value: '%s'\n", elem->value);
        !          4206:     /*
        !          4207:     * Type.
        !          4208:     */
        !          4209:     if (elem->namedType != NULL) {
        !          4210:        fprintf(output, "  type: '%s' ", elem->namedType);
        !          4211:        if (elem->namedTypeNs != NULL)
        !          4212:            fprintf(output, "ns '%s'\n", elem->namedTypeNs);
        !          4213:        else
        !          4214:            fprintf(output, "\n");
        !          4215:     } else if (elem->subtypes != NULL) {
        !          4216:        /*
        !          4217:        * Dump local types.
        !          4218:        */
        !          4219:        xmlSchemaTypeDump(elem->subtypes, output);
        !          4220:     }
        !          4221:     /*
        !          4222:     * Substitution group.
        !          4223:     */
        !          4224:     if (elem->substGroup != NULL) {
        !          4225:        fprintf(output, "  substitutionGroup: '%s' ", elem->substGroup);
        !          4226:        if (elem->substGroupNs != NULL)
        !          4227:            fprintf(output, "ns '%s'\n", elem->substGroupNs);
        !          4228:        else
        !          4229:            fprintf(output, "\n");
        !          4230:     }
        !          4231: }
        !          4232: 
        !          4233: /**
        !          4234:  * xmlSchemaAnnotDump:
        !          4235:  * @output:  the file output
        !          4236:  * @annot:  a annotation
        !          4237:  *
        !          4238:  * Dump the annotation
        !          4239:  */
        !          4240: static void
        !          4241: xmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot)
        !          4242: {
        !          4243:     xmlChar *content;
        !          4244: 
        !          4245:     if (annot == NULL)
        !          4246:         return;
        !          4247: 
        !          4248:     content = xmlNodeGetContent(annot->content);
        !          4249:     if (content != NULL) {
        !          4250:         fprintf(output, "  Annot: %s\n", content);
        !          4251:         xmlFree(content);
        !          4252:     } else
        !          4253:         fprintf(output, "  Annot: empty\n");
        !          4254: }
        !          4255: 
        !          4256: /**
        !          4257:  * xmlSchemaContentModelDump:
        !          4258:  * @particle: the schema particle
        !          4259:  * @output: the file output
        !          4260:  * @depth: the depth used for intentation
        !          4261:  *
        !          4262:  * Dump a SchemaType structure
        !          4263:  */
        !          4264: static void
        !          4265: xmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth)
        !          4266: {
        !          4267:     xmlChar *str = NULL;
        !          4268:     xmlSchemaTreeItemPtr term;
        !          4269:     char shift[100];
        !          4270:     int i;
        !          4271: 
        !          4272:     if (particle == NULL)
        !          4273:        return;
        !          4274:     for (i = 0;((i < depth) && (i < 25));i++)
        !          4275:         shift[2 * i] = shift[2 * i + 1] = ' ';
        !          4276:     shift[2 * i] = shift[2 * i + 1] = 0;
        !          4277:     fprintf(output, "%s", shift);
        !          4278:     if (particle->children == NULL) {
        !          4279:        fprintf(output, "MISSING particle term\n");
        !          4280:        return;
        !          4281:     }
        !          4282:     term = particle->children;
        !          4283:     if (term == NULL) {
        !          4284:        fprintf(output, "(NULL)");
        !          4285:     } else {
        !          4286:        switch (term->type) {
        !          4287:            case XML_SCHEMA_TYPE_ELEMENT:
        !          4288:                fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str,
        !          4289:                    ((xmlSchemaElementPtr)term)->targetNamespace,
        !          4290:                    ((xmlSchemaElementPtr)term)->name));
        !          4291:                FREE_AND_NULL(str);
        !          4292:                break;
        !          4293:            case XML_SCHEMA_TYPE_SEQUENCE:
        !          4294:                fprintf(output, "SEQUENCE");
        !          4295:                break;
        !          4296:            case XML_SCHEMA_TYPE_CHOICE:
        !          4297:                fprintf(output, "CHOICE");
        !          4298:                break;
        !          4299:            case XML_SCHEMA_TYPE_ALL:
        !          4300:                fprintf(output, "ALL");
        !          4301:                break;
        !          4302:            case XML_SCHEMA_TYPE_ANY:
        !          4303:                fprintf(output, "ANY");
        !          4304:                break;
        !          4305:            default:
        !          4306:                fprintf(output, "UNKNOWN\n");
        !          4307:                return;
        !          4308:        }
        !          4309:     }
        !          4310:     if (particle->minOccurs != 1)
        !          4311:        fprintf(output, " min: %d", particle->minOccurs);
        !          4312:     if (particle->maxOccurs >= UNBOUNDED)
        !          4313:        fprintf(output, " max: unbounded");
        !          4314:     else if (particle->maxOccurs != 1)
        !          4315:        fprintf(output, " max: %d", particle->maxOccurs);
        !          4316:     fprintf(output, "\n");
        !          4317:     if (term &&
        !          4318:        ((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
        !          4319:         (term->type == XML_SCHEMA_TYPE_CHOICE) ||
        !          4320:         (term->type == XML_SCHEMA_TYPE_ALL)) &&
        !          4321:         (term->children != NULL)) {
        !          4322:        xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
        !          4323:            output, depth +1);
        !          4324:     }
        !          4325:     if (particle->next != NULL)
        !          4326:        xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
        !          4327:                output, depth);
        !          4328: }
        !          4329: 
        !          4330: /**
        !          4331:  * xmlSchemaAttrUsesDump:
        !          4332:  * @uses:  attribute uses list
        !          4333:  * @output:  the file output
        !          4334:  *
        !          4335:  * Dumps a list of attribute use components.
        !          4336:  */
        !          4337: static void
        !          4338: xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output)
        !          4339: {
        !          4340:     xmlSchemaAttributeUsePtr use;
        !          4341:     xmlSchemaAttributeUseProhibPtr prohib;
        !          4342:     xmlSchemaQNameRefPtr ref;
        !          4343:     const xmlChar *name, *tns;
        !          4344:     xmlChar *str = NULL;
        !          4345:     int i;
        !          4346: 
        !          4347:     if ((uses == NULL) || (uses->nbItems == 0))
        !          4348:         return;
        !          4349: 
        !          4350:     fprintf(output, "  attributes:\n");
        !          4351:     for (i = 0; i < uses->nbItems; i++) {
        !          4352:        use = uses->items[i];
        !          4353:        if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
        !          4354:            fprintf(output, "  [prohibition] ");
        !          4355:            prohib = (xmlSchemaAttributeUseProhibPtr) use;
        !          4356:            name = prohib->name;
        !          4357:            tns = prohib->targetNamespace;
        !          4358:        } else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
        !          4359:            fprintf(output, "  [reference] ");
        !          4360:            ref = (xmlSchemaQNameRefPtr) use;
        !          4361:            name = ref->name;
        !          4362:            tns = ref->targetNamespace;
        !          4363:        } else {
        !          4364:            fprintf(output, "  [use] ");
        !          4365:            name = WXS_ATTRUSE_DECL_NAME(use);
        !          4366:            tns = WXS_ATTRUSE_DECL_TNS(use);
        !          4367:        }
        !          4368:        fprintf(output, "'%s'\n",
        !          4369:            (const char *) xmlSchemaFormatQName(&str, tns, name));
        !          4370:        FREE_AND_NULL(str);
        !          4371:     }
        !          4372: }
        !          4373: 
        !          4374: /**
        !          4375:  * xmlSchemaTypeDump:
        !          4376:  * @output:  the file output
        !          4377:  * @type:  a type structure
        !          4378:  *
        !          4379:  * Dump a SchemaType structure
        !          4380:  */
        !          4381: static void
        !          4382: xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output)
        !          4383: {
        !          4384:     if (type == NULL) {
        !          4385:         fprintf(output, "Type: NULL\n");
        !          4386:         return;
        !          4387:     }
        !          4388:     fprintf(output, "Type: ");
        !          4389:     if (type->name != NULL)
        !          4390:         fprintf(output, "'%s' ", type->name);
        !          4391:     else
        !          4392:         fprintf(output, "(no name) ");
        !          4393:     if (type->targetNamespace != NULL)
        !          4394:        fprintf(output, "ns '%s' ", type->targetNamespace);
        !          4395:     switch (type->type) {
        !          4396:         case XML_SCHEMA_TYPE_BASIC:
        !          4397:             fprintf(output, "[basic] ");
        !          4398:             break;
        !          4399:         case XML_SCHEMA_TYPE_SIMPLE:
        !          4400:             fprintf(output, "[simple] ");
        !          4401:             break;
        !          4402:         case XML_SCHEMA_TYPE_COMPLEX:
        !          4403:             fprintf(output, "[complex] ");
        !          4404:             break;
        !          4405:         case XML_SCHEMA_TYPE_SEQUENCE:
        !          4406:             fprintf(output, "[sequence] ");
        !          4407:             break;
        !          4408:         case XML_SCHEMA_TYPE_CHOICE:
        !          4409:             fprintf(output, "[choice] ");
        !          4410:             break;
        !          4411:         case XML_SCHEMA_TYPE_ALL:
        !          4412:             fprintf(output, "[all] ");
        !          4413:             break;
        !          4414:         case XML_SCHEMA_TYPE_UR:
        !          4415:             fprintf(output, "[ur] ");
        !          4416:             break;
        !          4417:         case XML_SCHEMA_TYPE_RESTRICTION:
        !          4418:             fprintf(output, "[restriction] ");
        !          4419:             break;
        !          4420:         case XML_SCHEMA_TYPE_EXTENSION:
        !          4421:             fprintf(output, "[extension] ");
        !          4422:             break;
        !          4423:         default:
        !          4424:             fprintf(output, "[unknown type %d] ", type->type);
        !          4425:             break;
        !          4426:     }
        !          4427:     fprintf(output, "content: ");
        !          4428:     switch (type->contentType) {
        !          4429:         case XML_SCHEMA_CONTENT_UNKNOWN:
        !          4430:             fprintf(output, "[unknown] ");
        !          4431:             break;
        !          4432:         case XML_SCHEMA_CONTENT_EMPTY:
        !          4433:             fprintf(output, "[empty] ");
        !          4434:             break;
        !          4435:         case XML_SCHEMA_CONTENT_ELEMENTS:
        !          4436:             fprintf(output, "[element] ");
        !          4437:             break;
        !          4438:         case XML_SCHEMA_CONTENT_MIXED:
        !          4439:             fprintf(output, "[mixed] ");
        !          4440:             break;
        !          4441:         case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
        !          4442:        /* not used. */
        !          4443:             break;
        !          4444:         case XML_SCHEMA_CONTENT_BASIC:
        !          4445:             fprintf(output, "[basic] ");
        !          4446:             break;
        !          4447:         case XML_SCHEMA_CONTENT_SIMPLE:
        !          4448:             fprintf(output, "[simple] ");
        !          4449:             break;
        !          4450:         case XML_SCHEMA_CONTENT_ANY:
        !          4451:             fprintf(output, "[any] ");
        !          4452:             break;
        !          4453:     }
        !          4454:     fprintf(output, "\n");
        !          4455:     if (type->base != NULL) {
        !          4456:         fprintf(output, "  base type: '%s'", type->base);
        !          4457:        if (type->baseNs != NULL)
        !          4458:            fprintf(output, " ns '%s'\n", type->baseNs);
        !          4459:        else
        !          4460:            fprintf(output, "\n");
        !          4461:     }
        !          4462:     if (type->attrUses != NULL)
        !          4463:        xmlSchemaAttrUsesDump(type->attrUses, output);
        !          4464:     if (type->annot != NULL)
        !          4465:         xmlSchemaAnnotDump(output, type->annot);
        !          4466: #ifdef DUMP_CONTENT_MODEL
        !          4467:     if ((type->type == XML_SCHEMA_TYPE_COMPLEX) &&
        !          4468:        (type->subtypes != NULL)) {
        !          4469:        xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes,
        !          4470:            output, 1);
        !          4471:     }
        !          4472: #endif
        !          4473: }
        !          4474: 
        !          4475: /**
        !          4476:  * xmlSchemaDump:
        !          4477:  * @output:  the file output
        !          4478:  * @schema:  a schema structure
        !          4479:  *
        !          4480:  * Dump a Schema structure.
        !          4481:  */
        !          4482: void
        !          4483: xmlSchemaDump(FILE * output, xmlSchemaPtr schema)
        !          4484: {
        !          4485:     if (output == NULL)
        !          4486:         return;
        !          4487:     if (schema == NULL) {
        !          4488:         fprintf(output, "Schemas: NULL\n");
        !          4489:         return;
        !          4490:     }
        !          4491:     fprintf(output, "Schemas: ");
        !          4492:     if (schema->name != NULL)
        !          4493:         fprintf(output, "%s, ", schema->name);
        !          4494:     else
        !          4495:         fprintf(output, "no name, ");
        !          4496:     if (schema->targetNamespace != NULL)
        !          4497:         fprintf(output, "%s", (const char *) schema->targetNamespace);
        !          4498:     else
        !          4499:         fprintf(output, "no target namespace");
        !          4500:     fprintf(output, "\n");
        !          4501:     if (schema->annot != NULL)
        !          4502:         xmlSchemaAnnotDump(output, schema->annot);
        !          4503:     xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump,
        !          4504:                 output);
        !          4505:     xmlHashScanFull(schema->elemDecl,
        !          4506:                     (xmlHashScannerFull) xmlSchemaElementDump, output);
        !          4507: }
        !          4508: 
        !          4509: #ifdef DEBUG_IDC_NODE_TABLE
        !          4510: /**
        !          4511:  * xmlSchemaDebugDumpIDCTable:
        !          4512:  * @vctxt: the WXS validation context
        !          4513:  *
        !          4514:  * Displays the current IDC table for debug purposes.
        !          4515:  */
        !          4516: static void
        !          4517: xmlSchemaDebugDumpIDCTable(FILE * output,
        !          4518:                           const xmlChar *namespaceName,
        !          4519:                           const xmlChar *localName,
        !          4520:                           xmlSchemaPSVIIDCBindingPtr bind)
        !          4521: {
        !          4522:     xmlChar *str = NULL;
        !          4523:     const xmlChar *value;
        !          4524:     xmlSchemaPSVIIDCNodePtr tab;
        !          4525:     xmlSchemaPSVIIDCKeyPtr key;
        !          4526:     int i, j, res;
        !          4527: 
        !          4528:     fprintf(output, "IDC: TABLES on '%s'\n",
        !          4529:        xmlSchemaFormatQName(&str, namespaceName, localName));
        !          4530:     FREE_AND_NULL(str)
        !          4531: 
        !          4532:     if (bind == NULL)
        !          4533:        return;
        !          4534:     do {
        !          4535:        fprintf(output, "IDC:   BINDING '%s' (%d)\n",
        !          4536:            xmlSchemaGetComponentQName(&str,
        !          4537:                bind->definition), bind->nbNodes);
        !          4538:        FREE_AND_NULL(str)
        !          4539:        for (i = 0; i < bind->nbNodes; i++) {
        !          4540:            tab = bind->nodeTable[i];
        !          4541:            fprintf(output, "         ( ");
        !          4542:            for (j = 0; j < bind->definition->nbFields; j++) {
        !          4543:                key = tab->keys[j];
        !          4544:                if ((key != NULL) && (key->val != NULL)) {
        !          4545:                    res = xmlSchemaGetCanonValue(key->val, &value);
        !          4546:                    if (res >= 0)
        !          4547:                        fprintf(output, "'%s' ", value);
        !          4548:                    else
        !          4549:                        fprintf(output, "CANON-VALUE-FAILED ");
        !          4550:                    if (res == 0)
        !          4551:                        FREE_AND_NULL(value)
        !          4552:                } else if (key != NULL)
        !          4553:                    fprintf(output, "(no val), ");
        !          4554:                else
        !          4555:                    fprintf(output, "(key missing), ");
        !          4556:            }
        !          4557:            fprintf(output, ")\n");
        !          4558:        }
        !          4559:        if (bind->dupls && bind->dupls->nbItems) {
        !          4560:            fprintf(output, "IDC:     dupls (%d):\n", bind->dupls->nbItems);
        !          4561:            for (i = 0; i < bind->dupls->nbItems; i++) {
        !          4562:                tab = bind->dupls->items[i];
        !          4563:                fprintf(output, "         ( ");
        !          4564:                for (j = 0; j < bind->definition->nbFields; j++) {
        !          4565:                    key = tab->keys[j];
        !          4566:                    if ((key != NULL) && (key->val != NULL)) {
        !          4567:                        res = xmlSchemaGetCanonValue(key->val, &value);
        !          4568:                        if (res >= 0)
        !          4569:                            fprintf(output, "'%s' ", value);
        !          4570:                        else
        !          4571:                            fprintf(output, "CANON-VALUE-FAILED ");
        !          4572:                        if (res == 0)
        !          4573:                            FREE_AND_NULL(value)
        !          4574:                    } else if (key != NULL)
        !          4575:                    fprintf(output, "(no val), ");
        !          4576:                        else
        !          4577:                            fprintf(output, "(key missing), ");
        !          4578:                }
        !          4579:                fprintf(output, ")\n");
        !          4580:            }
        !          4581:        }
        !          4582:        bind = bind->next;
        !          4583:     } while (bind != NULL);
        !          4584: }
        !          4585: #endif /* DEBUG_IDC */
        !          4586: #endif /* LIBXML_OUTPUT_ENABLED */
        !          4587: 
        !          4588: /************************************************************************
        !          4589:  *                                                                     *
        !          4590:  *                     Utilities                                       *
        !          4591:  *                                                                     *
        !          4592:  ************************************************************************/
        !          4593: 
        !          4594: /**
        !          4595:  * xmlSchemaGetPropNode:
        !          4596:  * @node: the element node
        !          4597:  * @name: the name of the attribute
        !          4598:  *
        !          4599:  * Seeks an attribute with a name of @name in
        !          4600:  * no namespace.
        !          4601:  *
        !          4602:  * Returns the attribute or NULL if not present.
        !          4603:  */
        !          4604: static xmlAttrPtr
        !          4605: xmlSchemaGetPropNode(xmlNodePtr node, const char *name)
        !          4606: {
        !          4607:     xmlAttrPtr prop;
        !          4608: 
        !          4609:     if ((node == NULL) || (name == NULL))
        !          4610:        return(NULL);
        !          4611:     prop = node->properties;
        !          4612:     while (prop != NULL) {
        !          4613:         if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name))
        !          4614:            return(prop);
        !          4615:        prop = prop->next;
        !          4616:     }
        !          4617:     return (NULL);
        !          4618: }
        !          4619: 
        !          4620: /**
        !          4621:  * xmlSchemaGetPropNodeNs:
        !          4622:  * @node: the element node
        !          4623:  * @uri: the uri
        !          4624:  * @name: the name of the attribute
        !          4625:  *
        !          4626:  * Seeks an attribute with a local name of @name and
        !          4627:  * a namespace URI of @uri.
        !          4628:  *
        !          4629:  * Returns the attribute or NULL if not present.
        !          4630:  */
        !          4631: static xmlAttrPtr
        !          4632: xmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name)
        !          4633: {
        !          4634:     xmlAttrPtr prop;
        !          4635: 
        !          4636:     if ((node == NULL) || (name == NULL))
        !          4637:        return(NULL);
        !          4638:     prop = node->properties;
        !          4639:     while (prop != NULL) {
        !          4640:        if ((prop->ns != NULL) &&
        !          4641:            xmlStrEqual(prop->name, BAD_CAST name) &&
        !          4642:            xmlStrEqual(prop->ns->href, BAD_CAST uri))
        !          4643:            return(prop);
        !          4644:        prop = prop->next;
        !          4645:     }
        !          4646:     return (NULL);
        !          4647: }
        !          4648: 
        !          4649: static const xmlChar *
        !          4650: xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
        !          4651: {
        !          4652:     xmlChar *val;
        !          4653:     const xmlChar *ret;
        !          4654: 
        !          4655:     val = xmlNodeGetContent(node);
        !          4656:     if (val == NULL)
        !          4657:        val = xmlStrdup((xmlChar *)"");
        !          4658:     ret = xmlDictLookup(ctxt->dict, val, -1);
        !          4659:     xmlFree(val);
        !          4660:     return(ret);
        !          4661: }
        !          4662: 
        !          4663: static const xmlChar *
        !          4664: xmlSchemaGetNodeContentNoDict(xmlNodePtr node)
        !          4665: {
        !          4666:     return((const xmlChar*) xmlNodeGetContent(node));
        !          4667: }
        !          4668: 
        !          4669: /**
        !          4670:  * xmlSchemaGetProp:
        !          4671:  * @ctxt: the parser context
        !          4672:  * @node: the node
        !          4673:  * @name: the property name
        !          4674:  *
        !          4675:  * Read a attribute value and internalize the string
        !          4676:  *
        !          4677:  * Returns the string or NULL if not present.
        !          4678:  */
        !          4679: static const xmlChar *
        !          4680: xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
        !          4681:                  const char *name)
        !          4682: {
        !          4683:     xmlChar *val;
        !          4684:     const xmlChar *ret;
        !          4685: 
        !          4686:     val = xmlGetNoNsProp(node, BAD_CAST name);
        !          4687:     if (val == NULL)
        !          4688:         return(NULL);
        !          4689:     ret = xmlDictLookup(ctxt->dict, val, -1);
        !          4690:     xmlFree(val);
        !          4691:     return(ret);
        !          4692: }
        !          4693: 
        !          4694: /************************************************************************
        !          4695:  *                                                                     *
        !          4696:  *                     Parsing functions                               *
        !          4697:  *                                                                     *
        !          4698:  ************************************************************************/
        !          4699: 
        !          4700: #define WXS_FIND_GLOBAL_ITEM(slot)                     \
        !          4701:     if (xmlStrEqual(nsName, schema->targetNamespace)) { \
        !          4702:        ret = xmlHashLookup(schema->slot, name); \
        !          4703:        if (ret != NULL) goto exit; \
        !          4704:     } \
        !          4705:     if (xmlHashSize(schema->schemasImports) > 1) { \
        !          4706:        xmlSchemaImportPtr import; \
        !          4707:        if (nsName == NULL) \
        !          4708:            import = xmlHashLookup(schema->schemasImports, \
        !          4709:                XML_SCHEMAS_NO_NAMESPACE); \
        !          4710:        else \
        !          4711:            import = xmlHashLookup(schema->schemasImports, nsName); \
        !          4712:        if (import == NULL) \
        !          4713:            goto exit; \
        !          4714:        ret = xmlHashLookup(import->schema->slot, name); \
        !          4715:     }
        !          4716: 
        !          4717: /**
        !          4718:  * xmlSchemaGetElem:
        !          4719:  * @schema:  the schema context
        !          4720:  * @name:  the element name
        !          4721:  * @ns:  the element namespace
        !          4722:  *
        !          4723:  * Lookup a global element declaration in the schema.
        !          4724:  *
        !          4725:  * Returns the element declaration or NULL if not found.
        !          4726:  */
        !          4727: static xmlSchemaElementPtr
        !          4728: xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name,
        !          4729:                  const xmlChar * nsName)
        !          4730: {
        !          4731:     xmlSchemaElementPtr ret = NULL;
        !          4732: 
        !          4733:     if ((name == NULL) || (schema == NULL))
        !          4734:         return(NULL);
        !          4735:     if (schema != NULL) {
        !          4736:        WXS_FIND_GLOBAL_ITEM(elemDecl)
        !          4737:     }
        !          4738: exit:
        !          4739: #ifdef DEBUG
        !          4740:     if (ret == NULL) {
        !          4741:         if (nsName == NULL)
        !          4742:             fprintf(stderr, "Unable to lookup element decl. %s", name);
        !          4743:         else
        !          4744:             fprintf(stderr, "Unable to lookup element decl. %s:%s", name,
        !          4745:                     nsName);
        !          4746:     }
        !          4747: #endif
        !          4748:     return (ret);
        !          4749: }
        !          4750: 
        !          4751: /**
        !          4752:  * xmlSchemaGetType:
        !          4753:  * @schema:  the main schema
        !          4754:  * @name:  the type's name
        !          4755:  * nsName:  the type's namespace
        !          4756:  *
        !          4757:  * Lookup a type in the schemas or the predefined types
        !          4758:  *
        !          4759:  * Returns the group definition or NULL if not found.
        !          4760:  */
        !          4761: static xmlSchemaTypePtr
        !          4762: xmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name,
        !          4763:                  const xmlChar * nsName)
        !          4764: {
        !          4765:     xmlSchemaTypePtr ret = NULL;
        !          4766: 
        !          4767:     if (name == NULL)
        !          4768:         return (NULL);
        !          4769:     /* First try the built-in types. */
        !          4770:     if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) {
        !          4771:        ret = xmlSchemaGetPredefinedType(name, nsName);
        !          4772:        if (ret != NULL)
        !          4773:            goto exit;
        !          4774:        /*
        !          4775:        * Note that we try the parsed schemas as well here
        !          4776:        * since one might have parsed the S4S, which contain more
        !          4777:        * than the built-in types.
        !          4778:        * TODO: Can we optimize this?
        !          4779:        */
        !          4780:     }
        !          4781:     if (schema != NULL) {
        !          4782:        WXS_FIND_GLOBAL_ITEM(typeDecl)
        !          4783:     }
        !          4784: exit:
        !          4785: 
        !          4786: #ifdef DEBUG
        !          4787:     if (ret == NULL) {
        !          4788:         if (nsName == NULL)
        !          4789:             fprintf(stderr, "Unable to lookup type %s", name);
        !          4790:         else
        !          4791:             fprintf(stderr, "Unable to lookup type %s:%s", name,
        !          4792:                     nsName);
        !          4793:     }
        !          4794: #endif
        !          4795:     return (ret);
        !          4796: }
        !          4797: 
        !          4798: /**
        !          4799:  * xmlSchemaGetAttributeDecl:
        !          4800:  * @schema:  the context of the schema
        !          4801:  * @name:  the name of the attribute
        !          4802:  * @ns:  the target namespace of the attribute
        !          4803:  *
        !          4804:  * Lookup a an attribute in the schema or imported schemas
        !          4805:  *
        !          4806:  * Returns the attribute declaration or NULL if not found.
        !          4807:  */
        !          4808: static xmlSchemaAttributePtr
        !          4809: xmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name,
        !          4810:                  const xmlChar * nsName)
        !          4811: {
        !          4812:     xmlSchemaAttributePtr ret = NULL;
        !          4813: 
        !          4814:     if ((name == NULL) || (schema == NULL))
        !          4815:         return (NULL);
        !          4816:     if (schema != NULL) {
        !          4817:        WXS_FIND_GLOBAL_ITEM(attrDecl)
        !          4818:     }
        !          4819: exit:
        !          4820: #ifdef DEBUG
        !          4821:     if (ret == NULL) {
        !          4822:         if (nsName == NULL)
        !          4823:             fprintf(stderr, "Unable to lookup attribute %s", name);
        !          4824:         else
        !          4825:             fprintf(stderr, "Unable to lookup attribute %s:%s", name,
        !          4826:                     nsName);
        !          4827:     }
        !          4828: #endif
        !          4829:     return (ret);
        !          4830: }
        !          4831: 
        !          4832: /**
        !          4833:  * xmlSchemaGetAttributeGroup:
        !          4834:  * @schema:  the context of the schema
        !          4835:  * @name:  the name of the attribute group
        !          4836:  * @ns:  the target namespace of the attribute group
        !          4837:  *
        !          4838:  * Lookup a an attribute group in the schema or imported schemas
        !          4839:  *
        !          4840:  * Returns the attribute group definition or NULL if not found.
        !          4841:  */
        !          4842: static xmlSchemaAttributeGroupPtr
        !          4843: xmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name,
        !          4844:                  const xmlChar * nsName)
        !          4845: {
        !          4846:     xmlSchemaAttributeGroupPtr ret = NULL;
        !          4847: 
        !          4848:     if ((name == NULL) || (schema == NULL))
        !          4849:         return (NULL);
        !          4850:     if (schema != NULL) {
        !          4851:        WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
        !          4852:     }
        !          4853: exit:
        !          4854:     /* TODO:
        !          4855:     if ((ret != NULL) && (ret->redef != NULL)) {
        !          4856:        * Return the last redefinition. *
        !          4857:        ret = ret->redef;
        !          4858:     }
        !          4859:     */
        !          4860: #ifdef DEBUG
        !          4861:     if (ret == NULL) {
        !          4862:         if (nsName == NULL)
        !          4863:             fprintf(stderr, "Unable to lookup attribute group %s", name);
        !          4864:         else
        !          4865:             fprintf(stderr, "Unable to lookup attribute group %s:%s", name,
        !          4866:                     nsName);
        !          4867:     }
        !          4868: #endif
        !          4869:     return (ret);
        !          4870: }
        !          4871: 
        !          4872: /**
        !          4873:  * xmlSchemaGetGroup:
        !          4874:  * @schema:  the context of the schema
        !          4875:  * @name:  the name of the group
        !          4876:  * @ns:  the target namespace of the group
        !          4877:  *
        !          4878:  * Lookup a group in the schema or imported schemas
        !          4879:  *
        !          4880:  * Returns the group definition or NULL if not found.
        !          4881:  */
        !          4882: static xmlSchemaModelGroupDefPtr
        !          4883: xmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name,
        !          4884:                  const xmlChar * nsName)
        !          4885: {
        !          4886:     xmlSchemaModelGroupDefPtr ret = NULL;
        !          4887: 
        !          4888:     if ((name == NULL) || (schema == NULL))
        !          4889:         return (NULL);
        !          4890:     if (schema != NULL) {
        !          4891:        WXS_FIND_GLOBAL_ITEM(groupDecl)
        !          4892:     }
        !          4893: exit:
        !          4894: 
        !          4895: #ifdef DEBUG
        !          4896:     if (ret == NULL) {
        !          4897:         if (nsName == NULL)
        !          4898:             fprintf(stderr, "Unable to lookup group %s", name);
        !          4899:         else
        !          4900:             fprintf(stderr, "Unable to lookup group %s:%s", name,
        !          4901:                     nsName);
        !          4902:     }
        !          4903: #endif
        !          4904:     return (ret);
        !          4905: }
        !          4906: 
        !          4907: static xmlSchemaNotationPtr
        !          4908: xmlSchemaGetNotation(xmlSchemaPtr schema,
        !          4909:                     const xmlChar *name,
        !          4910:                     const xmlChar *nsName)
        !          4911: {
        !          4912:     xmlSchemaNotationPtr ret = NULL;
        !          4913: 
        !          4914:     if ((name == NULL) || (schema == NULL))
        !          4915:         return (NULL);
        !          4916:     if (schema != NULL) {
        !          4917:        WXS_FIND_GLOBAL_ITEM(notaDecl)
        !          4918:     }
        !          4919: exit:
        !          4920:     return (ret);
        !          4921: }
        !          4922: 
        !          4923: static xmlSchemaIDCPtr
        !          4924: xmlSchemaGetIDC(xmlSchemaPtr schema,
        !          4925:                const xmlChar *name,
        !          4926:                const xmlChar *nsName)
        !          4927: {
        !          4928:     xmlSchemaIDCPtr ret = NULL;
        !          4929: 
        !          4930:     if ((name == NULL) || (schema == NULL))
        !          4931:         return (NULL);
        !          4932:     if (schema != NULL) {
        !          4933:        WXS_FIND_GLOBAL_ITEM(idcDef)
        !          4934:     }
        !          4935: exit:
        !          4936:     return (ret);
        !          4937: }
        !          4938: 
        !          4939: /**
        !          4940:  * xmlSchemaGetNamedComponent:
        !          4941:  * @schema:  the schema
        !          4942:  * @name:  the name of the group
        !          4943:  * @ns:  the target namespace of the group
        !          4944:  *
        !          4945:  * Lookup a group in the schema or imported schemas
        !          4946:  *
        !          4947:  * Returns the group definition or NULL if not found.
        !          4948:  */
        !          4949: static xmlSchemaBasicItemPtr
        !          4950: xmlSchemaGetNamedComponent(xmlSchemaPtr schema,
        !          4951:                           xmlSchemaTypeType itemType,
        !          4952:                           const xmlChar *name,
        !          4953:                           const xmlChar *targetNs)
        !          4954: {
        !          4955:     switch (itemType) {
        !          4956:        case XML_SCHEMA_TYPE_GROUP:
        !          4957:            return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema,
        !          4958:                name, targetNs));
        !          4959:        case XML_SCHEMA_TYPE_ELEMENT:
        !          4960:            return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema,
        !          4961:                name, targetNs));
        !          4962:        default:
        !          4963:            TODO
        !          4964:            return (NULL);
        !          4965:     }
        !          4966: }
        !          4967: 
        !          4968: /************************************************************************
        !          4969:  *                                                                     *
        !          4970:  *                     Parsing functions                               *
        !          4971:  *                                                                     *
        !          4972:  ************************************************************************/
        !          4973: 
        !          4974: #define IS_BLANK_NODE(n)                                               \
        !          4975:     (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
        !          4976: 
        !          4977: /**
        !          4978:  * xmlSchemaIsBlank:
        !          4979:  * @str:  a string
        !          4980:  * @len: the length of the string or -1
        !          4981:  *
        !          4982:  * Check if a string is ignorable
        !          4983:  *
        !          4984:  * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
        !          4985:  */
        !          4986: static int
        !          4987: xmlSchemaIsBlank(xmlChar * str, int len)
        !          4988: {
        !          4989:     if (str == NULL)
        !          4990:         return (1);
        !          4991:     if (len < 0) {
        !          4992:        while (*str != 0) {
        !          4993:            if (!(IS_BLANK_CH(*str)))
        !          4994:                return (0);
        !          4995:            str++;
        !          4996:        }
        !          4997:     } else while ((*str != 0) && (len != 0)) {
        !          4998:        if (!(IS_BLANK_CH(*str)))
        !          4999:            return (0);
        !          5000:        str++;
        !          5001:        len--;
        !          5002:     }
        !          5003: 
        !          5004:     return (1);
        !          5005: }
        !          5006: 
        !          5007: #define WXS_COMP_NAME(c, t) ((t) (c))->name
        !          5008: #define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
        !          5009: /*
        !          5010: * xmlSchemaFindRedefCompInGraph:
        !          5011: * ATTENTION TODO: This uses pointer comp. for strings.
        !          5012: */
        !          5013: static xmlSchemaBasicItemPtr
        !          5014: xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
        !          5015:                              xmlSchemaTypeType type,
        !          5016:                              const xmlChar *name,
        !          5017:                              const xmlChar *nsName)
        !          5018: {
        !          5019:     xmlSchemaBasicItemPtr ret;
        !          5020:     int i;
        !          5021: 
        !          5022:     if ((bucket == NULL) || (name == NULL))
        !          5023:        return(NULL);
        !          5024:     if ((bucket->globals == NULL) ||
        !          5025:        (bucket->globals->nbItems == 0))
        !          5026:        goto subschemas;
        !          5027:     /*
        !          5028:     * Search in global components.
        !          5029:     */
        !          5030:     for (i = 0; i < bucket->globals->nbItems; i++) {
        !          5031:        ret = bucket->globals->items[i];
        !          5032:        if (ret->type == type) {
        !          5033:            switch (type) {
        !          5034:                case XML_SCHEMA_TYPE_COMPLEX:
        !          5035:                case XML_SCHEMA_TYPE_SIMPLE:
        !          5036:                    if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) &&
        !          5037:                        (WXS_COMP_TNS(ret, xmlSchemaTypePtr) ==
        !          5038:                        nsName))
        !          5039:                    {
        !          5040:                        return(ret);
        !          5041:                    }
        !          5042:                    break;
        !          5043:                case XML_SCHEMA_TYPE_GROUP:
        !          5044:                    if ((WXS_COMP_NAME(ret,
        !          5045:                            xmlSchemaModelGroupDefPtr) == name) &&
        !          5046:                        (WXS_COMP_TNS(ret,
        !          5047:                            xmlSchemaModelGroupDefPtr) == nsName))
        !          5048:                    {
        !          5049:                        return(ret);
        !          5050:                    }
        !          5051:                    break;
        !          5052:                case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          5053:                    if ((WXS_COMP_NAME(ret,
        !          5054:                            xmlSchemaAttributeGroupPtr) == name) &&
        !          5055:                        (WXS_COMP_TNS(ret,
        !          5056:                            xmlSchemaAttributeGroupPtr) == nsName))
        !          5057:                    {
        !          5058:                        return(ret);
        !          5059:                    }
        !          5060:                    break;
        !          5061:                default:
        !          5062:                    /* Should not be hit. */
        !          5063:                    return(NULL);
        !          5064:            }
        !          5065:        }
        !          5066:     }
        !          5067: subschemas:
        !          5068:     /*
        !          5069:     * Process imported/included schemas.
        !          5070:     */
        !          5071:     if (bucket->relations != NULL) {
        !          5072:        xmlSchemaSchemaRelationPtr rel = bucket->relations;
        !          5073: 
        !          5074:        /*
        !          5075:        * TODO: Marking the bucket will not avoid multiple searches
        !          5076:        * in the same schema, but avoids at least circularity.
        !          5077:        */
        !          5078:        bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
        !          5079:        do {
        !          5080:            if ((rel->bucket != NULL) &&
        !          5081:                ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
        !          5082:                ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
        !          5083:                    type, name, nsName);
        !          5084:                if (ret != NULL)
        !          5085:                    return(ret);
        !          5086:            }
        !          5087:            rel = rel->next;
        !          5088:        } while (rel != NULL);
        !          5089:         bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
        !          5090:     }
        !          5091:     return(NULL);
        !          5092: }
        !          5093: 
        !          5094: /**
        !          5095:  * xmlSchemaAddNotation:
        !          5096:  * @ctxt:  a schema parser context
        !          5097:  * @schema:  the schema being built
        !          5098:  * @name:  the item name
        !          5099:  *
        !          5100:  * Add an XML schema annotation declaration
        !          5101:  * *WARNING* this interface is highly subject to change
        !          5102:  *
        !          5103:  * Returns the new struture or NULL in case of error
        !          5104:  */
        !          5105: static xmlSchemaNotationPtr
        !          5106: xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          5107:                      const xmlChar *name, const xmlChar *nsName,
        !          5108:                     xmlNodePtr node ATTRIBUTE_UNUSED)
        !          5109: {
        !          5110:     xmlSchemaNotationPtr ret = NULL;
        !          5111: 
        !          5112:     if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
        !          5113:         return (NULL);
        !          5114: 
        !          5115:     ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation));
        !          5116:     if (ret == NULL) {
        !          5117:         xmlSchemaPErrMemory(ctxt, "add annotation", NULL);
        !          5118:         return (NULL);
        !          5119:     }
        !          5120:     memset(ret, 0, sizeof(xmlSchemaNotation));
        !          5121:     ret->type = XML_SCHEMA_TYPE_NOTATION;
        !          5122:     ret->name = name;
        !          5123:     ret->targetNamespace = nsName;
        !          5124:     /* TODO: do we need the node to be set?
        !          5125:     * ret->node = node;*/
        !          5126:     WXS_ADD_GLOBAL(ctxt, ret);
        !          5127:     return (ret);
        !          5128: }
        !          5129: 
        !          5130: /**
        !          5131:  * xmlSchemaAddAttribute:
        !          5132:  * @ctxt:  a schema parser context
        !          5133:  * @schema:  the schema being built
        !          5134:  * @name:  the item name
        !          5135:  * @namespace:  the namespace
        !          5136:  *
        !          5137:  * Add an XML schema Attrribute declaration
        !          5138:  * *WARNING* this interface is highly subject to change
        !          5139:  *
        !          5140:  * Returns the new struture or NULL in case of error
        !          5141:  */
        !          5142: static xmlSchemaAttributePtr
        !          5143: xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          5144:                       const xmlChar * name, const xmlChar * nsName,
        !          5145:                      xmlNodePtr node, int topLevel)
        !          5146: {
        !          5147:     xmlSchemaAttributePtr ret = NULL;
        !          5148: 
        !          5149:     if ((ctxt == NULL) || (schema == NULL))
        !          5150:         return (NULL);
        !          5151: 
        !          5152:     ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute));
        !          5153:     if (ret == NULL) {
        !          5154:         xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL);
        !          5155:         return (NULL);
        !          5156:     }
        !          5157:     memset(ret, 0, sizeof(xmlSchemaAttribute));
        !          5158:     ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
        !          5159:     ret->node = node;
        !          5160:     ret->name = name;
        !          5161:     ret->targetNamespace = nsName;
        !          5162: 
        !          5163:     if (topLevel)
        !          5164:        WXS_ADD_GLOBAL(ctxt, ret);
        !          5165:     else
        !          5166:        WXS_ADD_LOCAL(ctxt, ret);
        !          5167:     WXS_ADD_PENDING(ctxt, ret);
        !          5168:     return (ret);
        !          5169: }
        !          5170: 
        !          5171: /**
        !          5172:  * xmlSchemaAddAttributeUse:
        !          5173:  * @ctxt:  a schema parser context
        !          5174:  * @schema:  the schema being built
        !          5175:  * @name:  the item name
        !          5176:  * @namespace:  the namespace
        !          5177:  *
        !          5178:  * Add an XML schema Attrribute declaration
        !          5179:  * *WARNING* this interface is highly subject to change
        !          5180:  *
        !          5181:  * Returns the new struture or NULL in case of error
        !          5182:  */
        !          5183: static xmlSchemaAttributeUsePtr
        !          5184: xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
        !          5185:                         xmlNodePtr node)
        !          5186: {
        !          5187:     xmlSchemaAttributeUsePtr ret = NULL;
        !          5188: 
        !          5189:     if (pctxt == NULL)
        !          5190:         return (NULL);
        !          5191: 
        !          5192:     ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse));
        !          5193:     if (ret == NULL) {
        !          5194:         xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL);
        !          5195:         return (NULL);
        !          5196:     }
        !          5197:     memset(ret, 0, sizeof(xmlSchemaAttributeUse));
        !          5198:     ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
        !          5199:     ret->node = node;
        !          5200: 
        !          5201:     WXS_ADD_LOCAL(pctxt, ret);
        !          5202:     return (ret);
        !          5203: }
        !          5204: 
        !          5205: /*
        !          5206: * xmlSchemaAddRedef:
        !          5207: *
        !          5208: * Adds a redefinition information. This is used at a later stage to:
        !          5209: * resolve references to the redefined components and to check constraints.
        !          5210: */
        !          5211: static xmlSchemaRedefPtr
        !          5212: xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
        !          5213:                  xmlSchemaBucketPtr targetBucket,
        !          5214:                  void *item,
        !          5215:                  const xmlChar *refName,
        !          5216:                  const xmlChar *refTargetNs)
        !          5217: {
        !          5218:     xmlSchemaRedefPtr ret;
        !          5219: 
        !          5220:     ret = (xmlSchemaRedefPtr)
        !          5221:        xmlMalloc(sizeof(xmlSchemaRedef));
        !          5222:     if (ret == NULL) {
        !          5223:        xmlSchemaPErrMemory(pctxt,
        !          5224:            "allocating redefinition info", NULL);
        !          5225:        return (NULL);
        !          5226:     }
        !          5227:     memset(ret, 0, sizeof(xmlSchemaRedef));
        !          5228:     ret->item = item;
        !          5229:     ret->targetBucket = targetBucket;
        !          5230:     ret->refName = refName;
        !          5231:     ret->refTargetNs = refTargetNs;
        !          5232:     if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL)
        !          5233:        WXS_CONSTRUCTOR(pctxt)->redefs = ret;
        !          5234:     else
        !          5235:        WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret;
        !          5236:     WXS_CONSTRUCTOR(pctxt)->lastRedef = ret;
        !          5237: 
        !          5238:     return (ret);
        !          5239: }
        !          5240: 
        !          5241: /**
        !          5242:  * xmlSchemaAddAttributeGroupDefinition:
        !          5243:  * @ctxt:  a schema parser context
        !          5244:  * @schema:  the schema being built
        !          5245:  * @name:  the item name
        !          5246:  * @nsName:  the target namespace
        !          5247:  * @node: the corresponding node
        !          5248:  *
        !          5249:  * Add an XML schema Attrribute Group definition.
        !          5250:  *
        !          5251:  * Returns the new struture or NULL in case of error
        !          5252:  */
        !          5253: static xmlSchemaAttributeGroupPtr
        !          5254: xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
        !          5255:                            xmlSchemaPtr schema ATTRIBUTE_UNUSED,
        !          5256:                           const xmlChar *name,
        !          5257:                           const xmlChar *nsName,
        !          5258:                           xmlNodePtr node)
        !          5259: {
        !          5260:     xmlSchemaAttributeGroupPtr ret = NULL;
        !          5261: 
        !          5262:     if ((pctxt == NULL) || (name == NULL))
        !          5263:         return (NULL);
        !          5264: 
        !          5265:     ret = (xmlSchemaAttributeGroupPtr)
        !          5266:         xmlMalloc(sizeof(xmlSchemaAttributeGroup));
        !          5267:     if (ret == NULL) {
        !          5268:        xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL);
        !          5269:        return (NULL);
        !          5270:     }
        !          5271:     memset(ret, 0, sizeof(xmlSchemaAttributeGroup));
        !          5272:     ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
        !          5273:     ret->name = name;
        !          5274:     ret->targetNamespace = nsName;
        !          5275:     ret->node = node;
        !          5276: 
        !          5277:     /* TODO: Remove the flag. */
        !          5278:     ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
        !          5279:     if (pctxt->isRedefine) {
        !          5280:        pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
        !          5281:            ret, name, nsName);
        !          5282:        if (pctxt->redef == NULL) {
        !          5283:            xmlFree(ret);
        !          5284:            return(NULL);
        !          5285:        }
        !          5286:        pctxt->redefCounter = 0;
        !          5287:     }
        !          5288:     WXS_ADD_GLOBAL(pctxt, ret);
        !          5289:     WXS_ADD_PENDING(pctxt, ret);
        !          5290:     return (ret);
        !          5291: }
        !          5292: 
        !          5293: /**
        !          5294:  * xmlSchemaAddElement:
        !          5295:  * @ctxt:  a schema parser context
        !          5296:  * @schema:  the schema being built
        !          5297:  * @name:  the type name
        !          5298:  * @namespace:  the type namespace
        !          5299:  *
        !          5300:  * Add an XML schema Element declaration
        !          5301:  * *WARNING* this interface is highly subject to change
        !          5302:  *
        !          5303:  * Returns the new struture or NULL in case of error
        !          5304:  */
        !          5305: static xmlSchemaElementPtr
        !          5306: xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
        !          5307:                     const xmlChar * name, const xmlChar * nsName,
        !          5308:                    xmlNodePtr node, int topLevel)
        !          5309: {
        !          5310:     xmlSchemaElementPtr ret = NULL;
        !          5311: 
        !          5312:     if ((ctxt == NULL) || (name == NULL))
        !          5313:         return (NULL);
        !          5314: 
        !          5315:     ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement));
        !          5316:     if (ret == NULL) {
        !          5317:         xmlSchemaPErrMemory(ctxt, "allocating element", NULL);
        !          5318:         return (NULL);
        !          5319:     }
        !          5320:     memset(ret, 0, sizeof(xmlSchemaElement));
        !          5321:     ret->type = XML_SCHEMA_TYPE_ELEMENT;
        !          5322:     ret->name = name;
        !          5323:     ret->targetNamespace = nsName;
        !          5324:     ret->node = node;
        !          5325: 
        !          5326:     if (topLevel)
        !          5327:        WXS_ADD_GLOBAL(ctxt, ret);
        !          5328:     else
        !          5329:        WXS_ADD_LOCAL(ctxt, ret);
        !          5330:     WXS_ADD_PENDING(ctxt, ret);
        !          5331:     return (ret);
        !          5332: }
        !          5333: 
        !          5334: /**
        !          5335:  * xmlSchemaAddType:
        !          5336:  * @ctxt:  a schema parser context
        !          5337:  * @schema:  the schema being built
        !          5338:  * @name:  the item name
        !          5339:  * @namespace:  the namespace
        !          5340:  *
        !          5341:  * Add an XML schema item
        !          5342:  * *WARNING* this interface is highly subject to change
        !          5343:  *
        !          5344:  * Returns the new struture or NULL in case of error
        !          5345:  */
        !          5346: static xmlSchemaTypePtr
        !          5347: xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          5348:                 xmlSchemaTypeType type,
        !          5349:                  const xmlChar * name, const xmlChar * nsName,
        !          5350:                 xmlNodePtr node, int topLevel)
        !          5351: {
        !          5352:     xmlSchemaTypePtr ret = NULL;
        !          5353: 
        !          5354:     if ((ctxt == NULL) || (schema == NULL))
        !          5355:         return (NULL);
        !          5356: 
        !          5357:     ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
        !          5358:     if (ret == NULL) {
        !          5359:         xmlSchemaPErrMemory(ctxt, "allocating type", NULL);
        !          5360:         return (NULL);
        !          5361:     }
        !          5362:     memset(ret, 0, sizeof(xmlSchemaType));
        !          5363:     ret->type = type;
        !          5364:     ret->name = name;
        !          5365:     ret->targetNamespace = nsName;
        !          5366:     ret->node = node;
        !          5367:     if (topLevel) {
        !          5368:        if (ctxt->isRedefine) {
        !          5369:            ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
        !          5370:                ret, name, nsName);
        !          5371:            if (ctxt->redef == NULL) {
        !          5372:                xmlFree(ret);
        !          5373:                return(NULL);
        !          5374:            }
        !          5375:            ctxt->redefCounter = 0;
        !          5376:        }
        !          5377:        WXS_ADD_GLOBAL(ctxt, ret);
        !          5378:     } else
        !          5379:        WXS_ADD_LOCAL(ctxt, ret);
        !          5380:     WXS_ADD_PENDING(ctxt, ret);
        !          5381:     return (ret);
        !          5382: }
        !          5383: 
        !          5384: static xmlSchemaQNameRefPtr
        !          5385: xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
        !          5386:                     xmlSchemaTypeType refType,
        !          5387:                     const xmlChar *refName,
        !          5388:                     const xmlChar *refNs)
        !          5389: {
        !          5390:     xmlSchemaQNameRefPtr ret;
        !          5391: 
        !          5392:     ret = (xmlSchemaQNameRefPtr)
        !          5393:        xmlMalloc(sizeof(xmlSchemaQNameRef));
        !          5394:     if (ret == NULL) {
        !          5395:        xmlSchemaPErrMemory(pctxt,
        !          5396:            "allocating QName reference item", NULL);
        !          5397:        return (NULL);
        !          5398:     }
        !          5399:     ret->node = NULL;
        !          5400:     ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
        !          5401:     ret->name = refName;
        !          5402:     ret->targetNamespace = refNs;
        !          5403:     ret->item = NULL;
        !          5404:     ret->itemType = refType;
        !          5405:     /*
        !          5406:     * Store the reference item in the schema.
        !          5407:     */
        !          5408:     WXS_ADD_LOCAL(pctxt, ret);
        !          5409:     return (ret);
        !          5410: }
        !          5411: 
        !          5412: static xmlSchemaAttributeUseProhibPtr
        !          5413: xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
        !          5414: {
        !          5415:     xmlSchemaAttributeUseProhibPtr ret;
        !          5416: 
        !          5417:     ret = (xmlSchemaAttributeUseProhibPtr)
        !          5418:        xmlMalloc(sizeof(xmlSchemaAttributeUseProhib));
        !          5419:     if (ret == NULL) {
        !          5420:        xmlSchemaPErrMemory(pctxt,
        !          5421:            "allocating attribute use prohibition", NULL);
        !          5422:        return (NULL);
        !          5423:     }
        !          5424:     memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib));
        !          5425:     ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
        !          5426:     WXS_ADD_LOCAL(pctxt, ret);
        !          5427:     return (ret);
        !          5428: }
        !          5429: 
        !          5430: 
        !          5431: /**
        !          5432:  * xmlSchemaAddModelGroup:
        !          5433:  * @ctxt:  a schema parser context
        !          5434:  * @schema:  the schema being built
        !          5435:  * @type: the "compositor" type of the model group
        !          5436:  * @node: the node in the schema doc
        !          5437:  *
        !          5438:  * Adds a schema model group
        !          5439:  * *WARNING* this interface is highly subject to change
        !          5440:  *
        !          5441:  * Returns the new struture or NULL in case of error
        !          5442:  */
        !          5443: static xmlSchemaModelGroupPtr
        !          5444: xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
        !          5445:                       xmlSchemaPtr schema,
        !          5446:                       xmlSchemaTypeType type,
        !          5447:                       xmlNodePtr node)
        !          5448: {
        !          5449:     xmlSchemaModelGroupPtr ret = NULL;
        !          5450: 
        !          5451:     if ((ctxt == NULL) || (schema == NULL))
        !          5452:         return (NULL);
        !          5453: 
        !          5454:     ret = (xmlSchemaModelGroupPtr)
        !          5455:        xmlMalloc(sizeof(xmlSchemaModelGroup));
        !          5456:     if (ret == NULL) {
        !          5457:        xmlSchemaPErrMemory(ctxt, "allocating model group component",
        !          5458:            NULL);
        !          5459:        return (NULL);
        !          5460:     }
        !          5461:     memset(ret, 0, sizeof(xmlSchemaModelGroup));
        !          5462:     ret->type = type;
        !          5463:     ret->node = node;
        !          5464:     WXS_ADD_LOCAL(ctxt, ret);
        !          5465:     if ((type == XML_SCHEMA_TYPE_SEQUENCE) ||
        !          5466:        (type == XML_SCHEMA_TYPE_CHOICE))
        !          5467:        WXS_ADD_PENDING(ctxt, ret);
        !          5468:     return (ret);
        !          5469: }
        !          5470: 
        !          5471: 
        !          5472: /**
        !          5473:  * xmlSchemaAddParticle:
        !          5474:  * @ctxt:  a schema parser context
        !          5475:  * @schema:  the schema being built
        !          5476:  * @node: the corresponding node in the schema doc
        !          5477:  * @min: the minOccurs
        !          5478:  * @max: the maxOccurs
        !          5479:  *
        !          5480:  * Adds an XML schema particle component.
        !          5481:  * *WARNING* this interface is highly subject to change
        !          5482:  *
        !          5483:  * Returns the new struture or NULL in case of error
        !          5484:  */
        !          5485: static xmlSchemaParticlePtr
        !          5486: xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
        !          5487:                     xmlNodePtr node, int min, int max)
        !          5488: {
        !          5489:     xmlSchemaParticlePtr ret = NULL;
        !          5490:     if (ctxt == NULL)
        !          5491:         return (NULL);
        !          5492: 
        !          5493: #ifdef DEBUG
        !          5494:     fprintf(stderr, "Adding particle component\n");
        !          5495: #endif
        !          5496:     ret = (xmlSchemaParticlePtr)
        !          5497:        xmlMalloc(sizeof(xmlSchemaParticle));
        !          5498:     if (ret == NULL) {
        !          5499:        xmlSchemaPErrMemory(ctxt, "allocating particle component",
        !          5500:            NULL);
        !          5501:        return (NULL);
        !          5502:     }
        !          5503:     ret->type = XML_SCHEMA_TYPE_PARTICLE;
        !          5504:     ret->annot = NULL;
        !          5505:     ret->node = node;
        !          5506:     ret->minOccurs = min;
        !          5507:     ret->maxOccurs = max;
        !          5508:     ret->next = NULL;
        !          5509:     ret->children = NULL;
        !          5510: 
        !          5511:     WXS_ADD_LOCAL(ctxt, ret);
        !          5512:     /*
        !          5513:     * Note that addition to pending components will be done locally
        !          5514:     * to the specific parsing function, since the most particles
        !          5515:     * need not to be fixed up (i.e. the reference to be resolved).
        !          5516:     * REMOVED: WXS_ADD_PENDING(ctxt, ret);
        !          5517:     */
        !          5518:     return (ret);
        !          5519: }
        !          5520: 
        !          5521: /**
        !          5522:  * xmlSchemaAddModelGroupDefinition:
        !          5523:  * @ctxt:  a schema validation context
        !          5524:  * @schema:  the schema being built
        !          5525:  * @name:  the group name
        !          5526:  *
        !          5527:  * Add an XML schema Group definition
        !          5528:  *
        !          5529:  * Returns the new struture or NULL in case of error
        !          5530:  */
        !          5531: static xmlSchemaModelGroupDefPtr
        !          5532: xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
        !          5533:                                 xmlSchemaPtr schema,
        !          5534:                                 const xmlChar *name,
        !          5535:                                 const xmlChar *nsName,
        !          5536:                                 xmlNodePtr node)
        !          5537: {
        !          5538:     xmlSchemaModelGroupDefPtr ret = NULL;
        !          5539: 
        !          5540:     if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
        !          5541:         return (NULL);
        !          5542: 
        !          5543:     ret = (xmlSchemaModelGroupDefPtr)
        !          5544:        xmlMalloc(sizeof(xmlSchemaModelGroupDef));
        !          5545:     if (ret == NULL) {
        !          5546:         xmlSchemaPErrMemory(ctxt, "adding group", NULL);
        !          5547:         return (NULL);
        !          5548:     }
        !          5549:     memset(ret, 0, sizeof(xmlSchemaModelGroupDef));
        !          5550:     ret->name = name;
        !          5551:     ret->type = XML_SCHEMA_TYPE_GROUP;
        !          5552:     ret->node = node;
        !          5553:     ret->targetNamespace = nsName;
        !          5554: 
        !          5555:     if (ctxt->isRedefine) {
        !          5556:        ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
        !          5557:            ret, name, nsName);
        !          5558:        if (ctxt->redef == NULL) {
        !          5559:            xmlFree(ret);
        !          5560:            return(NULL);
        !          5561:        }
        !          5562:        ctxt->redefCounter = 0;
        !          5563:     }
        !          5564:     WXS_ADD_GLOBAL(ctxt, ret);
        !          5565:     WXS_ADD_PENDING(ctxt, ret);
        !          5566:     return (ret);
        !          5567: }
        !          5568: 
        !          5569: /**
        !          5570:  * xmlSchemaNewWildcardNs:
        !          5571:  * @ctxt:  a schema validation context
        !          5572:  *
        !          5573:  * Creates a new wildcard namespace constraint.
        !          5574:  *
        !          5575:  * Returns the new struture or NULL in case of error
        !          5576:  */
        !          5577: static xmlSchemaWildcardNsPtr
        !          5578: xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
        !          5579: {
        !          5580:     xmlSchemaWildcardNsPtr ret;
        !          5581: 
        !          5582:     ret = (xmlSchemaWildcardNsPtr)
        !          5583:        xmlMalloc(sizeof(xmlSchemaWildcardNs));
        !          5584:     if (ret == NULL) {
        !          5585:        xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL);
        !          5586:        return (NULL);
        !          5587:     }
        !          5588:     ret->value = NULL;
        !          5589:     ret->next = NULL;
        !          5590:     return (ret);
        !          5591: }
        !          5592: 
        !          5593: static xmlSchemaIDCPtr
        !          5594: xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          5595:                   const xmlChar *name, const xmlChar *nsName,
        !          5596:                  int category, xmlNodePtr node)
        !          5597: {
        !          5598:     xmlSchemaIDCPtr ret = NULL;
        !          5599: 
        !          5600:     if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
        !          5601:         return (NULL);
        !          5602: 
        !          5603:     ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC));
        !          5604:     if (ret == NULL) {
        !          5605:         xmlSchemaPErrMemory(ctxt,
        !          5606:            "allocating an identity-constraint definition", NULL);
        !          5607:         return (NULL);
        !          5608:     }
        !          5609:     memset(ret, 0, sizeof(xmlSchemaIDC));
        !          5610:     /* The target namespace of the parent element declaration. */
        !          5611:     ret->targetNamespace = nsName;
        !          5612:     ret->name = name;
        !          5613:     ret->type = category;
        !          5614:     ret->node = node;
        !          5615: 
        !          5616:     WXS_ADD_GLOBAL(ctxt, ret);
        !          5617:     /*
        !          5618:     * Only keyrefs need to be fixup up.
        !          5619:     */
        !          5620:     if (category == XML_SCHEMA_TYPE_IDC_KEYREF)
        !          5621:        WXS_ADD_PENDING(ctxt, ret);
        !          5622:     return (ret);
        !          5623: }
        !          5624: 
        !          5625: /**
        !          5626:  * xmlSchemaAddWildcard:
        !          5627:  * @ctxt:  a schema validation context
        !          5628:  * @schema: a schema
        !          5629:  *
        !          5630:  * Adds a wildcard.
        !          5631:  * It corresponds to a xsd:anyAttribute and xsd:any.
        !          5632:  *
        !          5633:  * Returns the new struture or NULL in case of error
        !          5634:  */
        !          5635: static xmlSchemaWildcardPtr
        !          5636: xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          5637:                     xmlSchemaTypeType type, xmlNodePtr node)
        !          5638: {
        !          5639:     xmlSchemaWildcardPtr ret = NULL;
        !          5640: 
        !          5641:     if ((ctxt == NULL) || (schema == NULL))
        !          5642:         return (NULL);
        !          5643: 
        !          5644:     ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
        !          5645:     if (ret == NULL) {
        !          5646:         xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL);
        !          5647:         return (NULL);
        !          5648:     }
        !          5649:     memset(ret, 0, sizeof(xmlSchemaWildcard));
        !          5650:     ret->type = type;
        !          5651:     ret->node = node;
        !          5652:     WXS_ADD_LOCAL(ctxt, ret);
        !          5653:     return (ret);
        !          5654: }
        !          5655: 
        !          5656: static void
        !          5657: xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group)
        !          5658: {
        !          5659:     if (group == NULL)
        !          5660:        return;
        !          5661:     if (group->members != NULL)
        !          5662:        xmlSchemaItemListFree(group->members);
        !          5663:     xmlFree(group);
        !          5664: }
        !          5665: 
        !          5666: static xmlSchemaSubstGroupPtr
        !          5667: xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
        !          5668:                       xmlSchemaElementPtr head)
        !          5669: {
        !          5670:     xmlSchemaSubstGroupPtr ret;
        !          5671: 
        !          5672:     /* Init subst group hash. */
        !          5673:     if (WXS_SUBST_GROUPS(pctxt) == NULL) {
        !          5674:        WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict);
        !          5675:        if (WXS_SUBST_GROUPS(pctxt) == NULL)
        !          5676:            return(NULL);
        !          5677:     }
        !          5678:     /* Create a new substitution group. */
        !          5679:     ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup));
        !          5680:     if (ret == NULL) {
        !          5681:        xmlSchemaPErrMemory(NULL,
        !          5682:            "allocating a substitution group container", NULL);
        !          5683:        return(NULL);
        !          5684:     }
        !          5685:     memset(ret, 0, sizeof(xmlSchemaSubstGroup));
        !          5686:     ret->head = head;
        !          5687:     /* Create list of members. */
        !          5688:     ret->members = xmlSchemaItemListCreate();
        !          5689:     if (ret->members == NULL) {
        !          5690:        xmlSchemaSubstGroupFree(ret);
        !          5691:        return(NULL);
        !          5692:     }
        !          5693:     /* Add subst group to hash. */
        !          5694:     if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt),
        !          5695:        head->name, head->targetNamespace, ret) != 0) {
        !          5696:        PERROR_INT("xmlSchemaSubstGroupAdd",
        !          5697:            "failed to add a new substitution container");
        !          5698:        xmlSchemaSubstGroupFree(ret);
        !          5699:        return(NULL);
        !          5700:     }
        !          5701:     return(ret);
        !          5702: }
        !          5703: 
        !          5704: static xmlSchemaSubstGroupPtr
        !          5705: xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
        !          5706:                       xmlSchemaElementPtr head)
        !          5707: {
        !          5708:     if (WXS_SUBST_GROUPS(pctxt) == NULL)
        !          5709:        return(NULL);
        !          5710:     return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt),
        !          5711:        head->name, head->targetNamespace));
        !          5712: 
        !          5713: }
        !          5714: 
        !          5715: /**
        !          5716:  * xmlSchemaAddElementSubstitutionMember:
        !          5717:  * @pctxt:  a schema parser context
        !          5718:  * @head:  the head of the substitution group
        !          5719:  * @member: the new member of the substitution group
        !          5720:  *
        !          5721:  * Allocate a new annotation structure.
        !          5722:  *
        !          5723:  * Returns the newly allocated structure or NULL in case or error
        !          5724:  */
        !          5725: static int
        !          5726: xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
        !          5727:                                      xmlSchemaElementPtr head,
        !          5728:                                      xmlSchemaElementPtr member)
        !          5729: {
        !          5730:     xmlSchemaSubstGroupPtr substGroup = NULL;
        !          5731: 
        !          5732:     if ((pctxt == NULL) || (head == NULL) || (member == NULL))
        !          5733:        return (-1);
        !          5734: 
        !          5735:     substGroup = xmlSchemaSubstGroupGet(pctxt, head);
        !          5736:     if (substGroup == NULL)
        !          5737:        substGroup = xmlSchemaSubstGroupAdd(pctxt, head);
        !          5738:     if (substGroup == NULL)
        !          5739:        return(-1);
        !          5740:     if (xmlSchemaItemListAdd(substGroup->members, member) == -1)
        !          5741:        return(-1);
        !          5742:     return(0);
        !          5743: }
        !          5744: 
        !          5745: /************************************************************************
        !          5746:  *                                                                     *
        !          5747:  *             Utilities for parsing                                   *
        !          5748:  *                                                                     *
        !          5749:  ************************************************************************/
        !          5750: 
        !          5751: /**
        !          5752:  * xmlSchemaPValAttrNodeQNameValue:
        !          5753:  * @ctxt:  a schema parser context
        !          5754:  * @schema: the schema context
        !          5755:  * @ownerDes: the designation of the parent element
        !          5756:  * @ownerItem: the parent as a schema object
        !          5757:  * @value:  the QName value
        !          5758:  * @local: the resulting local part if found, the attribute value otherwise
        !          5759:  * @uri:  the resulting namespace URI if found
        !          5760:  *
        !          5761:  * Extracts the local name and the URI of a QName value and validates it.
        !          5762:  * This one is intended to be used on attribute values that
        !          5763:  * should resolve to schema components.
        !          5764:  *
        !          5765:  * Returns 0, in case the QName is valid, a positive error code
        !          5766:  * if not valid and -1 if an internal error occurs.
        !          5767:  */
        !          5768: static int
        !          5769: xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
        !          5770:                                       xmlSchemaPtr schema,
        !          5771:                                       xmlSchemaBasicItemPtr ownerItem,
        !          5772:                                       xmlAttrPtr attr,
        !          5773:                                       const xmlChar *value,
        !          5774:                                       const xmlChar **uri,
        !          5775:                                       const xmlChar **local)
        !          5776: {
        !          5777:     const xmlChar *pref;
        !          5778:     xmlNsPtr ns;
        !          5779:     int len, ret;
        !          5780: 
        !          5781:     *uri = NULL;
        !          5782:     *local = NULL;
        !          5783:     ret = xmlValidateQName(value, 1);
        !          5784:     if (ret > 0) {
        !          5785:        xmlSchemaPSimpleTypeErr(ctxt,
        !          5786:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          5787:            ownerItem, (xmlNodePtr) attr,
        !          5788:            xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
        !          5789:            NULL, value, NULL, NULL, NULL);
        !          5790:        *local = value;
        !          5791:        return (ctxt->err);
        !          5792:     } else if (ret < 0)
        !          5793:        return (-1);
        !          5794: 
        !          5795:     if (!strchr((char *) value, ':')) {
        !          5796:        ns = xmlSearchNs(attr->doc, attr->parent, NULL);
        !          5797:        if (ns)
        !          5798:            *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
        !          5799:        else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
        !          5800:            /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the
        !          5801:            * parser context. */
        !          5802:            /*
        !          5803:            * This one takes care of included schemas with no
        !          5804:            * target namespace.
        !          5805:            */
        !          5806:            *uri = ctxt->targetNamespace;
        !          5807:        }
        !          5808:        *local = xmlDictLookup(ctxt->dict, value, -1);
        !          5809:        return (0);
        !          5810:     }
        !          5811:     /*
        !          5812:     * At this point xmlSplitQName3 has to return a local name.
        !          5813:     */
        !          5814:     *local = xmlSplitQName3(value, &len);
        !          5815:     *local = xmlDictLookup(ctxt->dict, *local, -1);
        !          5816:     pref = xmlDictLookup(ctxt->dict, value, len);
        !          5817:     ns = xmlSearchNs(attr->doc, attr->parent, pref);
        !          5818:     if (ns == NULL) {
        !          5819:        xmlSchemaPSimpleTypeErr(ctxt,
        !          5820:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          5821:            ownerItem, (xmlNodePtr) attr,
        !          5822:            xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value,
        !          5823:            "The value '%s' of simple type 'xs:QName' has no "
        !          5824:            "corresponding namespace declaration in scope", value, NULL);
        !          5825:        return (ctxt->err);
        !          5826:     } else {
        !          5827:         *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
        !          5828:     }
        !          5829:     return (0);
        !          5830: }
        !          5831: 
        !          5832: /**
        !          5833:  * xmlSchemaPValAttrNodeQName:
        !          5834:  * @ctxt:  a schema parser context
        !          5835:  * @schema: the schema context
        !          5836:  * @ownerDes: the designation of the owner element
        !          5837:  * @ownerItem: the owner as a schema object
        !          5838:  * @attr:  the attribute node
        !          5839:  * @local: the resulting local part if found, the attribute value otherwise
        !          5840:  * @uri:  the resulting namespace URI if found
        !          5841:  *
        !          5842:  * Extracts and validates the QName of an attribute value.
        !          5843:  * This one is intended to be used on attribute values that
        !          5844:  * should resolve to schema components.
        !          5845:  *
        !          5846:  * Returns 0, in case the QName is valid, a positive error code
        !          5847:  * if not valid and -1 if an internal error occurs.
        !          5848:  */
        !          5849: static int
        !          5850: xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
        !          5851:                                       xmlSchemaPtr schema,
        !          5852:                                       xmlSchemaBasicItemPtr ownerItem,
        !          5853:                                       xmlAttrPtr attr,
        !          5854:                                       const xmlChar **uri,
        !          5855:                                       const xmlChar **local)
        !          5856: {
        !          5857:     const xmlChar *value;
        !          5858: 
        !          5859:     value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          5860:     return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
        !          5861:        ownerItem, attr, value, uri, local));
        !          5862: }
        !          5863: 
        !          5864: /**
        !          5865:  * xmlSchemaPValAttrQName:
        !          5866:  * @ctxt:  a schema parser context
        !          5867:  * @schema: the schema context
        !          5868:  * @ownerDes: the designation of the parent element
        !          5869:  * @ownerItem: the owner as a schema object
        !          5870:  * @ownerElem:  the parent node of the attribute
        !          5871:  * @name:  the name of the attribute
        !          5872:  * @local: the resulting local part if found, the attribute value otherwise
        !          5873:  * @uri:  the resulting namespace URI if found
        !          5874:  *
        !          5875:  * Extracts and validates the QName of an attribute value.
        !          5876:  *
        !          5877:  * Returns 0, in case the QName is valid, a positive error code
        !          5878:  * if not valid and -1 if an internal error occurs.
        !          5879:  */
        !          5880: static int
        !          5881: xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
        !          5882:                                   xmlSchemaPtr schema,
        !          5883:                                   xmlSchemaBasicItemPtr ownerItem,
        !          5884:                                   xmlNodePtr ownerElem,
        !          5885:                                   const char *name,
        !          5886:                                   const xmlChar **uri,
        !          5887:                                   const xmlChar **local)
        !          5888: {
        !          5889:     xmlAttrPtr attr;
        !          5890: 
        !          5891:     attr = xmlSchemaGetPropNode(ownerElem, name);
        !          5892:     if (attr == NULL) {
        !          5893:        *local = NULL;
        !          5894:        *uri = NULL;
        !          5895:        return (0);
        !          5896:     }
        !          5897:     return (xmlSchemaPValAttrNodeQName(ctxt, schema,
        !          5898:        ownerItem, attr, uri, local));
        !          5899: }
        !          5900: 
        !          5901: /**
        !          5902:  * xmlSchemaPValAttrID:
        !          5903:  * @ctxt:  a schema parser context
        !          5904:  * @schema: the schema context
        !          5905:  * @ownerDes: the designation of the parent element
        !          5906:  * @ownerItem: the owner as a schema object
        !          5907:  * @ownerElem:  the parent node of the attribute
        !          5908:  * @name:  the name of the attribute
        !          5909:  *
        !          5910:  * Extracts and validates the ID of an attribute value.
        !          5911:  *
        !          5912:  * Returns 0, in case the ID is valid, a positive error code
        !          5913:  * if not valid and -1 if an internal error occurs.
        !          5914:  */
        !          5915: static int
        !          5916: xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr)
        !          5917: {
        !          5918:     int ret;
        !          5919:     const xmlChar *value;
        !          5920: 
        !          5921:     if (attr == NULL)
        !          5922:        return(0);
        !          5923:     value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr);
        !          5924:     ret = xmlValidateNCName(value, 1);
        !          5925:     if (ret == 0) {
        !          5926:        /*
        !          5927:        * NOTE: the IDness might have already be declared in the DTD
        !          5928:        */
        !          5929:        if (attr->atype != XML_ATTRIBUTE_ID) {
        !          5930:            xmlIDPtr res;
        !          5931:            xmlChar *strip;
        !          5932: 
        !          5933:            /*
        !          5934:            * TODO: Use xmlSchemaStrip here; it's not exported at this
        !          5935:            * moment.
        !          5936:            */
        !          5937:            strip = xmlSchemaCollapseString(value);
        !          5938:            if (strip != NULL) {
        !          5939:                xmlFree((xmlChar *) value);
        !          5940:                value = strip;
        !          5941:            }
        !          5942:            res = xmlAddID(NULL, attr->doc, value, attr);
        !          5943:            if (res == NULL) {
        !          5944:                ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
        !          5945:                xmlSchemaPSimpleTypeErr(ctxt,
        !          5946:                    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          5947:                    NULL, (xmlNodePtr) attr,
        !          5948:                    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
        !          5949:                    NULL, NULL, "Duplicate value '%s' of simple "
        !          5950:                    "type 'xs:ID'", value, NULL);
        !          5951:            } else
        !          5952:                attr->atype = XML_ATTRIBUTE_ID;
        !          5953:        }
        !          5954:     } else if (ret > 0) {
        !          5955:        ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
        !          5956:        xmlSchemaPSimpleTypeErr(ctxt,
        !          5957:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          5958:            NULL, (xmlNodePtr) attr,
        !          5959:            xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
        !          5960:            NULL, NULL, "The value '%s' of simple type 'xs:ID' is "
        !          5961:            "not a valid 'xs:NCName'",
        !          5962:            value, NULL);
        !          5963:     }
        !          5964:     if (value != NULL)
        !          5965:        xmlFree((xmlChar *)value);
        !          5966: 
        !          5967:     return (ret);
        !          5968: }
        !          5969: 
        !          5970: static int
        !          5971: xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
        !          5972:                    xmlNodePtr ownerElem,
        !          5973:                    const xmlChar *name)
        !          5974: {
        !          5975:     xmlAttrPtr attr;
        !          5976: 
        !          5977:     attr = xmlSchemaGetPropNode(ownerElem, (const char *) name);
        !          5978:     if (attr == NULL)
        !          5979:        return(0);
        !          5980:     return(xmlSchemaPValAttrNodeID(ctxt, attr));
        !          5981: 
        !          5982: }
        !          5983: 
        !          5984: /**
        !          5985:  * xmlGetMaxOccurs:
        !          5986:  * @ctxt:  a schema validation context
        !          5987:  * @node:  a subtree containing XML Schema informations
        !          5988:  *
        !          5989:  * Get the maxOccurs property
        !          5990:  *
        !          5991:  * Returns the default if not found, or the value
        !          5992:  */
        !          5993: static int
        !          5994: xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
        !          5995:                int min, int max, int def, const char *expected)
        !          5996: {
        !          5997:     const xmlChar *val, *cur;
        !          5998:     int ret = 0;
        !          5999:     xmlAttrPtr attr;
        !          6000: 
        !          6001:     attr = xmlSchemaGetPropNode(node, "maxOccurs");
        !          6002:     if (attr == NULL)
        !          6003:        return (def);
        !          6004:     val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          6005: 
        !          6006:     if (xmlStrEqual(val, (const xmlChar *) "unbounded")) {
        !          6007:        if (max != UNBOUNDED) {
        !          6008:            xmlSchemaPSimpleTypeErr(ctxt,
        !          6009:                XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6010:                /* XML_SCHEMAP_INVALID_MINOCCURS, */
        !          6011:                NULL, (xmlNodePtr) attr, NULL, expected,
        !          6012:                val, NULL, NULL, NULL);
        !          6013:            return (def);
        !          6014:        } else
        !          6015:            return (UNBOUNDED);  /* encoding it with -1 might be another option */
        !          6016:     }
        !          6017: 
        !          6018:     cur = val;
        !          6019:     while (IS_BLANK_CH(*cur))
        !          6020:         cur++;
        !          6021:     if (*cur == 0) {
        !          6022:         xmlSchemaPSimpleTypeErr(ctxt,
        !          6023:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6024:            /* XML_SCHEMAP_INVALID_MINOCCURS, */
        !          6025:            NULL, (xmlNodePtr) attr, NULL, expected,
        !          6026:            val, NULL, NULL, NULL);
        !          6027:        return (def);
        !          6028:     }
        !          6029:     while ((*cur >= '0') && (*cur <= '9')) {
        !          6030:         ret = ret * 10 + (*cur - '0');
        !          6031:         cur++;
        !          6032:     }
        !          6033:     while (IS_BLANK_CH(*cur))
        !          6034:         cur++;
        !          6035:     /*
        !          6036:     * TODO: Restrict the maximal value to Integer.
        !          6037:     */
        !          6038:     if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
        !          6039:        xmlSchemaPSimpleTypeErr(ctxt,
        !          6040:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6041:            /* XML_SCHEMAP_INVALID_MINOCCURS, */
        !          6042:            NULL, (xmlNodePtr) attr, NULL, expected,
        !          6043:            val, NULL, NULL, NULL);
        !          6044:         return (def);
        !          6045:     }
        !          6046:     return (ret);
        !          6047: }
        !          6048: 
        !          6049: /**
        !          6050:  * xmlGetMinOccurs:
        !          6051:  * @ctxt:  a schema validation context
        !          6052:  * @node:  a subtree containing XML Schema informations
        !          6053:  *
        !          6054:  * Get the minOccurs property
        !          6055:  *
        !          6056:  * Returns the default if not found, or the value
        !          6057:  */
        !          6058: static int
        !          6059: xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
        !          6060:                int min, int max, int def, const char *expected)
        !          6061: {
        !          6062:     const xmlChar *val, *cur;
        !          6063:     int ret = 0;
        !          6064:     xmlAttrPtr attr;
        !          6065: 
        !          6066:     attr = xmlSchemaGetPropNode(node, "minOccurs");
        !          6067:     if (attr == NULL)
        !          6068:        return (def);
        !          6069:     val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          6070:     cur = val;
        !          6071:     while (IS_BLANK_CH(*cur))
        !          6072:         cur++;
        !          6073:     if (*cur == 0) {
        !          6074:         xmlSchemaPSimpleTypeErr(ctxt,
        !          6075:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6076:            /* XML_SCHEMAP_INVALID_MINOCCURS, */
        !          6077:            NULL, (xmlNodePtr) attr, NULL, expected,
        !          6078:            val, NULL, NULL, NULL);
        !          6079:         return (def);
        !          6080:     }
        !          6081:     while ((*cur >= '0') && (*cur <= '9')) {
        !          6082:         ret = ret * 10 + (*cur - '0');
        !          6083:         cur++;
        !          6084:     }
        !          6085:     while (IS_BLANK_CH(*cur))
        !          6086:         cur++;
        !          6087:     /*
        !          6088:     * TODO: Restrict the maximal value to Integer.
        !          6089:     */
        !          6090:     if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
        !          6091:        xmlSchemaPSimpleTypeErr(ctxt,
        !          6092:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6093:            /* XML_SCHEMAP_INVALID_MINOCCURS, */
        !          6094:            NULL, (xmlNodePtr) attr, NULL, expected,
        !          6095:            val, NULL, NULL, NULL);
        !          6096:         return (def);
        !          6097:     }
        !          6098:     return (ret);
        !          6099: }
        !          6100: 
        !          6101: /**
        !          6102:  * xmlSchemaPGetBoolNodeValue:
        !          6103:  * @ctxt:  a schema validation context
        !          6104:  * @ownerDes:  owner designation
        !          6105:  * @ownerItem:  the owner as a schema item
        !          6106:  * @node: the node holding the value
        !          6107:  *
        !          6108:  * Converts a boolean string value into 1 or 0.
        !          6109:  *
        !          6110:  * Returns 0 or 1.
        !          6111:  */
        !          6112: static int
        !          6113: xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
        !          6114:                           xmlSchemaBasicItemPtr ownerItem,
        !          6115:                           xmlNodePtr node)
        !          6116: {
        !          6117:     xmlChar *value = NULL;
        !          6118:     int res = 0;
        !          6119: 
        !          6120:     value = xmlNodeGetContent(node);
        !          6121:     /*
        !          6122:     * 3.2.2.1 Lexical representation
        !          6123:     * An instance of a datatype that is defined as �boolean�
        !          6124:     * can have the following legal literals {true, false, 1, 0}.
        !          6125:     */
        !          6126:     if (xmlStrEqual(BAD_CAST value, BAD_CAST "true"))
        !          6127:         res = 1;
        !          6128:     else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false"))
        !          6129:         res = 0;
        !          6130:     else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1"))
        !          6131:        res = 1;
        !          6132:     else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0"))
        !          6133:         res = 0;
        !          6134:     else {
        !          6135:         xmlSchemaPSimpleTypeErr(ctxt,
        !          6136:            XML_SCHEMAP_INVALID_BOOLEAN,
        !          6137:            ownerItem, node,
        !          6138:            xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
        !          6139:            NULL, BAD_CAST value,
        !          6140:            NULL, NULL, NULL);
        !          6141:     }
        !          6142:     if (value != NULL)
        !          6143:        xmlFree(value);
        !          6144:     return (res);
        !          6145: }
        !          6146: 
        !          6147: /**
        !          6148:  * xmlGetBooleanProp:
        !          6149:  * @ctxt:  a schema validation context
        !          6150:  * @node:  a subtree containing XML Schema informations
        !          6151:  * @name:  the attribute name
        !          6152:  * @def:  the default value
        !          6153:  *
        !          6154:  * Evaluate if a boolean property is set
        !          6155:  *
        !          6156:  * Returns the default if not found, 0 if found to be false,
        !          6157:  * 1 if found to be true
        !          6158:  */
        !          6159: static int
        !          6160: xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
        !          6161:                  xmlNodePtr node,
        !          6162:                   const char *name, int def)
        !          6163: {
        !          6164:     const xmlChar *val;
        !          6165: 
        !          6166:     val = xmlSchemaGetProp(ctxt, node, name);
        !          6167:     if (val == NULL)
        !          6168:         return (def);
        !          6169:     /*
        !          6170:     * 3.2.2.1 Lexical representation
        !          6171:     * An instance of a datatype that is defined as �boolean�
        !          6172:     * can have the following legal literals {true, false, 1, 0}.
        !          6173:     */
        !          6174:     if (xmlStrEqual(val, BAD_CAST "true"))
        !          6175:         def = 1;
        !          6176:     else if (xmlStrEqual(val, BAD_CAST "false"))
        !          6177:         def = 0;
        !          6178:     else if (xmlStrEqual(val, BAD_CAST "1"))
        !          6179:        def = 1;
        !          6180:     else if (xmlStrEqual(val, BAD_CAST "0"))
        !          6181:         def = 0;
        !          6182:     else {
        !          6183:         xmlSchemaPSimpleTypeErr(ctxt,
        !          6184:            XML_SCHEMAP_INVALID_BOOLEAN,
        !          6185:            NULL,
        !          6186:            (xmlNodePtr) xmlSchemaGetPropNode(node, name),
        !          6187:            xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
        !          6188:            NULL, val, NULL, NULL, NULL);
        !          6189:     }
        !          6190:     return (def);
        !          6191: }
        !          6192: 
        !          6193: /************************************************************************
        !          6194:  *                                                                     *
        !          6195:  *             Shema extraction from an Infoset                        *
        !          6196:  *                                                                     *
        !          6197:  ************************************************************************/
        !          6198: static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
        !          6199:                                                  ctxt, xmlSchemaPtr schema,
        !          6200:                                                  xmlNodePtr node,
        !          6201:                                                 int topLevel);
        !          6202: static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
        !          6203:                                                   ctxt,
        !          6204:                                                   xmlSchemaPtr schema,
        !          6205:                                                   xmlNodePtr node,
        !          6206:                                                  int topLevel);
        !          6207: static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
        !          6208:                                                   ctxt,
        !          6209:                                                   xmlSchemaPtr schema,
        !          6210:                                                   xmlNodePtr node,
        !          6211:                                                  xmlSchemaTypeType parentType);
        !          6212: static xmlSchemaBasicItemPtr
        !          6213: xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
        !          6214:                             xmlSchemaPtr schema,
        !          6215:                             xmlNodePtr node,
        !          6216:                             xmlSchemaItemListPtr uses,
        !          6217:                             int parentType);
        !          6218: static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
        !          6219:                                            xmlSchemaPtr schema,
        !          6220:                                            xmlNodePtr node);
        !          6221: static xmlSchemaWildcardPtr
        !          6222: xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
        !          6223:                            xmlSchemaPtr schema, xmlNodePtr node);
        !          6224: 
        !          6225: /**
        !          6226:  * xmlSchemaPValAttrNodeValue:
        !          6227:  *
        !          6228:  * @ctxt:  a schema parser context
        !          6229:  * @ownerDes: the designation of the parent element
        !          6230:  * @ownerItem: the schema object owner if existent
        !          6231:  * @attr:  the schema attribute node being validated
        !          6232:  * @value: the value
        !          6233:  * @type: the built-in type to be validated against
        !          6234:  *
        !          6235:  * Validates a value against the given built-in type.
        !          6236:  * This one is intended to be used internally for validation
        !          6237:  * of schema attribute values during parsing of the schema.
        !          6238:  *
        !          6239:  * Returns 0 if the value is valid, a positive error code
        !          6240:  * number otherwise and -1 in case of an internal or API error.
        !          6241:  */
        !          6242: static int
        !          6243: xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
        !          6244:                           xmlSchemaBasicItemPtr ownerItem,
        !          6245:                           xmlAttrPtr attr,
        !          6246:                           const xmlChar *value,
        !          6247:                           xmlSchemaTypePtr type)
        !          6248: {
        !          6249: 
        !          6250:     int ret = 0;
        !          6251: 
        !          6252:     /*
        !          6253:     * NOTE: Should we move this to xmlschematypes.c? Hmm, but this
        !          6254:     * one is really meant to be used internally, so better not.
        !          6255:     */
        !          6256:     if ((pctxt == NULL) || (type == NULL) || (attr == NULL))
        !          6257:        return (-1);
        !          6258:     if (type->type != XML_SCHEMA_TYPE_BASIC) {
        !          6259:        PERROR_INT("xmlSchemaPValAttrNodeValue",
        !          6260:            "the given type is not a built-in type");
        !          6261:        return (-1);
        !          6262:     }
        !          6263:     switch (type->builtInType) {
        !          6264:        case XML_SCHEMAS_NCNAME:
        !          6265:        case XML_SCHEMAS_QNAME:
        !          6266:        case XML_SCHEMAS_ANYURI:
        !          6267:        case XML_SCHEMAS_TOKEN:
        !          6268:        case XML_SCHEMAS_LANGUAGE:
        !          6269:            ret = xmlSchemaValPredefTypeNode(type, value, NULL,
        !          6270:                (xmlNodePtr) attr);
        !          6271:            break;
        !          6272:        default: {
        !          6273:            PERROR_INT("xmlSchemaPValAttrNodeValue",
        !          6274:                "validation using the given type is not supported while "
        !          6275:                "parsing a schema");
        !          6276:            return (-1);
        !          6277:        }
        !          6278:     }
        !          6279:     /*
        !          6280:     * TODO: Should we use the S4S error codes instead?
        !          6281:     */
        !          6282:     if (ret < 0) {
        !          6283:        PERROR_INT("xmlSchemaPValAttrNodeValue",
        !          6284:            "failed to validate a schema attribute value");
        !          6285:        return (-1);
        !          6286:     } else if (ret > 0) {
        !          6287:        if (WXS_IS_LIST(type))
        !          6288:            ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
        !          6289:        else
        !          6290:            ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
        !          6291:        xmlSchemaPSimpleTypeErr(pctxt,
        !          6292:            ret, ownerItem, (xmlNodePtr) attr,
        !          6293:            type, NULL, value, NULL, NULL, NULL);
        !          6294:     }
        !          6295:     return (ret);
        !          6296: }
        !          6297: 
        !          6298: /**
        !          6299:  * xmlSchemaPValAttrNode:
        !          6300:  *
        !          6301:  * @ctxt:  a schema parser context
        !          6302:  * @ownerDes: the designation of the parent element
        !          6303:  * @ownerItem: the schema object owner if existent
        !          6304:  * @attr:  the schema attribute node being validated
        !          6305:  * @type: the built-in type to be validated against
        !          6306:  * @value: the resulting value if any
        !          6307:  *
        !          6308:  * Extracts and validates a value against the given built-in type.
        !          6309:  * This one is intended to be used internally for validation
        !          6310:  * of schema attribute values during parsing of the schema.
        !          6311:  *
        !          6312:  * Returns 0 if the value is valid, a positive error code
        !          6313:  * number otherwise and -1 in case of an internal or API error.
        !          6314:  */
        !          6315: static int
        !          6316: xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
        !          6317:                           xmlSchemaBasicItemPtr ownerItem,
        !          6318:                           xmlAttrPtr attr,
        !          6319:                           xmlSchemaTypePtr type,
        !          6320:                           const xmlChar **value)
        !          6321: {
        !          6322:     const xmlChar *val;
        !          6323: 
        !          6324:     if ((ctxt == NULL) || (type == NULL) || (attr == NULL))
        !          6325:        return (-1);
        !          6326: 
        !          6327:     val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          6328:     if (value != NULL)
        !          6329:        *value = val;
        !          6330: 
        !          6331:     return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr,
        !          6332:        val, type));
        !          6333: }
        !          6334: 
        !          6335: /**
        !          6336:  * xmlSchemaPValAttr:
        !          6337:  *
        !          6338:  * @ctxt:  a schema parser context
        !          6339:  * @node: the element node of the attribute
        !          6340:  * @ownerDes: the designation of the parent element
        !          6341:  * @ownerItem: the schema object owner if existent
        !          6342:  * @ownerElem: the owner element node
        !          6343:  * @name:  the name of the schema attribute node
        !          6344:  * @type: the built-in type to be validated against
        !          6345:  * @value: the resulting value if any
        !          6346:  *
        !          6347:  * Extracts and validates a value against the given built-in type.
        !          6348:  * This one is intended to be used internally for validation
        !          6349:  * of schema attribute values during parsing of the schema.
        !          6350:  *
        !          6351:  * Returns 0 if the value is valid, a positive error code
        !          6352:  * number otherwise and -1 in case of an internal or API error.
        !          6353:  */
        !          6354: static int
        !          6355: xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
        !          6356:                       xmlSchemaBasicItemPtr ownerItem,
        !          6357:                       xmlNodePtr ownerElem,
        !          6358:                       const char *name,
        !          6359:                       xmlSchemaTypePtr type,
        !          6360:                       const xmlChar **value)
        !          6361: {
        !          6362:     xmlAttrPtr attr;
        !          6363: 
        !          6364:     if ((ctxt == NULL) || (type == NULL)) {
        !          6365:        if (value != NULL)
        !          6366:            *value = NULL;
        !          6367:        return (-1);
        !          6368:     }
        !          6369:     if (type->type != XML_SCHEMA_TYPE_BASIC) {
        !          6370:        if (value != NULL)
        !          6371:            *value = NULL;
        !          6372:        xmlSchemaPErr(ctxt, ownerElem,
        !          6373:            XML_SCHEMAP_INTERNAL,
        !          6374:            "Internal error: xmlSchemaPValAttr, the given "
        !          6375:            "type '%s' is not a built-in type.\n",
        !          6376:            type->name, NULL);
        !          6377:        return (-1);
        !          6378:     }
        !          6379:     attr = xmlSchemaGetPropNode(ownerElem, name);
        !          6380:     if (attr == NULL) {
        !          6381:        if (value != NULL)
        !          6382:            *value = NULL;
        !          6383:        return (0);
        !          6384:     }
        !          6385:     return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr,
        !          6386:        type, value));
        !          6387: }
        !          6388: 
        !          6389: static int
        !          6390: xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
        !          6391:                  xmlSchemaPtr schema ATTRIBUTE_UNUSED,
        !          6392:                  xmlNodePtr node,
        !          6393:                  xmlAttrPtr attr,
        !          6394:                  const xmlChar *namespaceName)
        !          6395: {
        !          6396:     /* TODO: Pointer comparison instead? */
        !          6397:     if (xmlStrEqual(pctxt->targetNamespace, namespaceName))
        !          6398:        return (0);
        !          6399:     if (xmlStrEqual(xmlSchemaNs, namespaceName))
        !          6400:        return (0);
        !          6401:     /*
        !          6402:     * Check if the referenced namespace was <import>ed.
        !          6403:     */
        !          6404:     if (WXS_BUCKET(pctxt)->relations != NULL) {
        !          6405:        xmlSchemaSchemaRelationPtr rel;
        !          6406: 
        !          6407:        rel = WXS_BUCKET(pctxt)->relations;
        !          6408:        do {
        !          6409:            if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
        !          6410:                xmlStrEqual(namespaceName, rel->importNamespace))
        !          6411:                return (0);
        !          6412:            rel = rel->next;
        !          6413:        } while (rel != NULL);
        !          6414:     }
        !          6415:     /*
        !          6416:     * No matching <import>ed namespace found.
        !          6417:     */
        !          6418:     {
        !          6419:        xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node;
        !          6420: 
        !          6421:        if (namespaceName == NULL)
        !          6422:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          6423:                XML_SCHEMAP_SRC_RESOLVE, n, NULL,
        !          6424:                "References from this schema to components in no "
        !          6425:                "namespace are not allowed, since not indicated by an "
        !          6426:                "import statement", NULL, NULL);
        !          6427:        else
        !          6428:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          6429:                XML_SCHEMAP_SRC_RESOLVE, n, NULL,
        !          6430:                "References from this schema to components in the "
        !          6431:                "namespace '%s' are not allowed, since not indicated by an "
        !          6432:                "import statement", namespaceName, NULL);
        !          6433:     }
        !          6434:     return (XML_SCHEMAP_SRC_RESOLVE);
        !          6435: }
        !          6436: 
        !          6437: /**
        !          6438:  * xmlSchemaParseLocalAttributes:
        !          6439:  * @ctxt:  a schema validation context
        !          6440:  * @schema:  the schema being built
        !          6441:  * @node:  a subtree containing XML Schema informations
        !          6442:  * @type:  the hosting type where the attributes will be anchored
        !          6443:  *
        !          6444:  * Parses attribute uses and attribute declarations and
        !          6445:  * attribute group references.
        !          6446:  */
        !          6447: static int
        !          6448: xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          6449:                         xmlNodePtr *child, xmlSchemaItemListPtr *list,
        !          6450:                        int parentType, int *hasRefs)
        !          6451: {
        !          6452:     void *item;
        !          6453: 
        !          6454:     while ((IS_SCHEMA((*child), "attribute")) ||
        !          6455:            (IS_SCHEMA((*child), "attributeGroup"))) {
        !          6456:         if (IS_SCHEMA((*child), "attribute")) {
        !          6457:            item = xmlSchemaParseLocalAttribute(ctxt, schema, *child,
        !          6458:                *list, parentType);
        !          6459:         } else {
        !          6460:             item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child);
        !          6461:            if ((item != NULL) && (hasRefs != NULL))
        !          6462:                *hasRefs = 1;
        !          6463:         }
        !          6464:        if (item != NULL) {
        !          6465:            if (*list == NULL) {
        !          6466:                /* TODO: Customize grow factor. */
        !          6467:                *list = xmlSchemaItemListCreate();
        !          6468:                if (*list == NULL)
        !          6469:                    return(-1);
        !          6470:            }
        !          6471:            if (xmlSchemaItemListAddSize(*list, 2, item) == -1)
        !          6472:                return(-1);
        !          6473:        }
        !          6474:         *child = (*child)->next;
        !          6475:     }
        !          6476:     return (0);
        !          6477: }
        !          6478: 
        !          6479: /**
        !          6480:  * xmlSchemaParseAnnotation:
        !          6481:  * @ctxt:  a schema validation context
        !          6482:  * @schema:  the schema being built
        !          6483:  * @node:  a subtree containing XML Schema informations
        !          6484:  *
        !          6485:  * parse a XML schema Attrribute declaration
        !          6486:  * *WARNING* this interface is highly subject to change
        !          6487:  *
        !          6488:  * Returns -1 in case of error, 0 if the declaration is improper and
        !          6489:  *         1 in case of success.
        !          6490:  */
        !          6491: static xmlSchemaAnnotPtr
        !          6492: xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed)
        !          6493: {
        !          6494:     xmlSchemaAnnotPtr ret;
        !          6495:     xmlNodePtr child = NULL;
        !          6496:     xmlAttrPtr attr;
        !          6497:     int barked = 0;
        !          6498: 
        !          6499:     /*
        !          6500:     * INFO: S4S completed.
        !          6501:     */
        !          6502:     /*
        !          6503:     * id = ID
        !          6504:     * {any attributes with non-schema namespace . . .}>
        !          6505:     * Content: (appinfo | documentation)*
        !          6506:     */
        !          6507:     if ((ctxt == NULL) || (node == NULL))
        !          6508:         return (NULL);
        !          6509:     if (needed)
        !          6510:        ret = xmlSchemaNewAnnot(ctxt, node);
        !          6511:     else
        !          6512:        ret = NULL;
        !          6513:     attr = node->properties;
        !          6514:     while (attr != NULL) {
        !          6515:        if (((attr->ns == NULL) &&
        !          6516:            (!xmlStrEqual(attr->name, BAD_CAST "id"))) ||
        !          6517:            ((attr->ns != NULL) &&
        !          6518:            xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
        !          6519: 
        !          6520:            xmlSchemaPIllegalAttrErr(ctxt,
        !          6521:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6522:        }
        !          6523:        attr = attr->next;
        !          6524:     }
        !          6525:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          6526:     /*
        !          6527:     * And now for the children...
        !          6528:     */
        !          6529:     child = node->children;
        !          6530:     while (child != NULL) {
        !          6531:        if (IS_SCHEMA(child, "appinfo")) {
        !          6532:            /* TODO: make available the content of "appinfo". */
        !          6533:            /*
        !          6534:            * source = anyURI
        !          6535:            * {any attributes with non-schema namespace . . .}>
        !          6536:            * Content: ({any})*
        !          6537:            */
        !          6538:            attr = child->properties;
        !          6539:            while (attr != NULL) {
        !          6540:                if (((attr->ns == NULL) &&
        !          6541:                     (!xmlStrEqual(attr->name, BAD_CAST "source"))) ||
        !          6542:                     ((attr->ns != NULL) &&
        !          6543:                      xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
        !          6544: 
        !          6545:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          6546:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6547:                }
        !          6548:                attr = attr->next;
        !          6549:            }
        !          6550:            xmlSchemaPValAttr(ctxt, NULL, child, "source",
        !          6551:                xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
        !          6552:            child = child->next;
        !          6553:        } else if (IS_SCHEMA(child, "documentation")) {
        !          6554:            /* TODO: make available the content of "documentation". */
        !          6555:            /*
        !          6556:            * source = anyURI
        !          6557:            * {any attributes with non-schema namespace . . .}>
        !          6558:            * Content: ({any})*
        !          6559:            */
        !          6560:            attr = child->properties;
        !          6561:            while (attr != NULL) {
        !          6562:                if (attr->ns == NULL) {
        !          6563:                    if (!xmlStrEqual(attr->name, BAD_CAST "source")) {
        !          6564:                        xmlSchemaPIllegalAttrErr(ctxt,
        !          6565:                            XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6566:                    }
        !          6567:                } else {
        !          6568:                    if (xmlStrEqual(attr->ns->href, xmlSchemaNs) ||
        !          6569:                        (xmlStrEqual(attr->name, BAD_CAST "lang") &&
        !          6570:                        (!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) {
        !          6571: 
        !          6572:                        xmlSchemaPIllegalAttrErr(ctxt,
        !          6573:                            XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6574:                    }
        !          6575:                }
        !          6576:                attr = attr->next;
        !          6577:            }
        !          6578:            /*
        !          6579:            * Attribute "xml:lang".
        !          6580:            */
        !          6581:            attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang");
        !          6582:            if (attr != NULL)
        !          6583:                xmlSchemaPValAttrNode(ctxt, NULL, attr,
        !          6584:                xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL);
        !          6585:            child = child->next;
        !          6586:        } else {
        !          6587:            if (!barked)
        !          6588:                xmlSchemaPContentErr(ctxt,
        !          6589:                    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          6590:                    NULL, node, child, NULL, "(appinfo | documentation)*");
        !          6591:            barked = 1;
        !          6592:            child = child->next;
        !          6593:        }
        !          6594:     }
        !          6595: 
        !          6596:     return (ret);
        !          6597: }
        !          6598: 
        !          6599: /**
        !          6600:  * xmlSchemaParseFacet:
        !          6601:  * @ctxt:  a schema validation context
        !          6602:  * @schema:  the schema being built
        !          6603:  * @node:  a subtree containing XML Schema informations
        !          6604:  *
        !          6605:  * parse a XML schema Facet declaration
        !          6606:  * *WARNING* this interface is highly subject to change
        !          6607:  *
        !          6608:  * Returns the new type structure or NULL in case of error
        !          6609:  */
        !          6610: static xmlSchemaFacetPtr
        !          6611: xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          6612:                     xmlNodePtr node)
        !          6613: {
        !          6614:     xmlSchemaFacetPtr facet;
        !          6615:     xmlNodePtr child = NULL;
        !          6616:     const xmlChar *value;
        !          6617: 
        !          6618:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          6619:         return (NULL);
        !          6620: 
        !          6621:     facet = xmlSchemaNewFacet();
        !          6622:     if (facet == NULL) {
        !          6623:         xmlSchemaPErrMemory(ctxt, "allocating facet", node);
        !          6624:         return (NULL);
        !          6625:     }
        !          6626:     facet->node = node;
        !          6627:     value = xmlSchemaGetProp(ctxt, node, "value");
        !          6628:     if (value == NULL) {
        !          6629:         xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE,
        !          6630:                        "Facet %s has no value\n", node->name, NULL);
        !          6631:         xmlSchemaFreeFacet(facet);
        !          6632:         return (NULL);
        !          6633:     }
        !          6634:     if (IS_SCHEMA(node, "minInclusive")) {
        !          6635:         facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
        !          6636:     } else if (IS_SCHEMA(node, "minExclusive")) {
        !          6637:         facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
        !          6638:     } else if (IS_SCHEMA(node, "maxInclusive")) {
        !          6639:         facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
        !          6640:     } else if (IS_SCHEMA(node, "maxExclusive")) {
        !          6641:         facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
        !          6642:     } else if (IS_SCHEMA(node, "totalDigits")) {
        !          6643:         facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
        !          6644:     } else if (IS_SCHEMA(node, "fractionDigits")) {
        !          6645:         facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
        !          6646:     } else if (IS_SCHEMA(node, "pattern")) {
        !          6647:         facet->type = XML_SCHEMA_FACET_PATTERN;
        !          6648:     } else if (IS_SCHEMA(node, "enumeration")) {
        !          6649:         facet->type = XML_SCHEMA_FACET_ENUMERATION;
        !          6650:     } else if (IS_SCHEMA(node, "whiteSpace")) {
        !          6651:         facet->type = XML_SCHEMA_FACET_WHITESPACE;
        !          6652:     } else if (IS_SCHEMA(node, "length")) {
        !          6653:         facet->type = XML_SCHEMA_FACET_LENGTH;
        !          6654:     } else if (IS_SCHEMA(node, "maxLength")) {
        !          6655:         facet->type = XML_SCHEMA_FACET_MAXLENGTH;
        !          6656:     } else if (IS_SCHEMA(node, "minLength")) {
        !          6657:         facet->type = XML_SCHEMA_FACET_MINLENGTH;
        !          6658:     } else {
        !          6659:         xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE,
        !          6660:                        "Unknown facet type %s\n", node->name, NULL);
        !          6661:         xmlSchemaFreeFacet(facet);
        !          6662:         return (NULL);
        !          6663:     }
        !          6664:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          6665:     facet->value = value;
        !          6666:     if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
        !          6667:        (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
        !          6668:        const xmlChar *fixed;
        !          6669: 
        !          6670:        fixed = xmlSchemaGetProp(ctxt, node, "fixed");
        !          6671:        if (fixed != NULL) {
        !          6672:            if (xmlStrEqual(fixed, BAD_CAST "true"))
        !          6673:                facet->fixed = 1;
        !          6674:        }
        !          6675:     }
        !          6676:     child = node->children;
        !          6677: 
        !          6678:     if (IS_SCHEMA(child, "annotation")) {
        !          6679:         facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          6680:         child = child->next;
        !          6681:     }
        !          6682:     if (child != NULL) {
        !          6683:         xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD,
        !          6684:                        "Facet %s has unexpected child content\n",
        !          6685:                        node->name, NULL);
        !          6686:     }
        !          6687:     return (facet);
        !          6688: }
        !          6689: 
        !          6690: /**
        !          6691:  * xmlSchemaParseWildcardNs:
        !          6692:  * @ctxt:  a schema parser context
        !          6693:  * @wildc:  the wildcard, already created
        !          6694:  * @node:  a subtree containing XML Schema informations
        !          6695:  *
        !          6696:  * Parses the attribute "processContents" and "namespace"
        !          6697:  * of a xsd:anyAttribute and xsd:any.
        !          6698:  * *WARNING* this interface is highly subject to change
        !          6699:  *
        !          6700:  * Returns 0 if everything goes fine, a positive error code
        !          6701:  * if something is not valid and -1 if an internal error occurs.
        !          6702:  */
        !          6703: static int
        !          6704: xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
        !          6705:                         xmlSchemaPtr schema ATTRIBUTE_UNUSED,
        !          6706:                         xmlSchemaWildcardPtr wildc,
        !          6707:                         xmlNodePtr node)
        !          6708: {
        !          6709:     const xmlChar *pc, *ns, *dictnsItem;
        !          6710:     int ret = 0;
        !          6711:     xmlChar *nsItem;
        !          6712:     xmlSchemaWildcardNsPtr tmp, lastNs = NULL;
        !          6713:     xmlAttrPtr attr;
        !          6714: 
        !          6715:     pc = xmlSchemaGetProp(ctxt, node, "processContents");
        !          6716:     if ((pc == NULL)
        !          6717:         || (xmlStrEqual(pc, (const xmlChar *) "strict"))) {
        !          6718:         wildc->processContents = XML_SCHEMAS_ANY_STRICT;
        !          6719:     } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) {
        !          6720:         wildc->processContents = XML_SCHEMAS_ANY_SKIP;
        !          6721:     } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) {
        !          6722:         wildc->processContents = XML_SCHEMAS_ANY_LAX;
        !          6723:     } else {
        !          6724:         xmlSchemaPSimpleTypeErr(ctxt,
        !          6725:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          6726:            NULL, node,
        !          6727:            NULL, "(strict | skip | lax)", pc,
        !          6728:            NULL, NULL, NULL);
        !          6729:         wildc->processContents = XML_SCHEMAS_ANY_STRICT;
        !          6730:        ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
        !          6731:     }
        !          6732:     /*
        !          6733:      * Build the namespace constraints.
        !          6734:      */
        !          6735:     attr = xmlSchemaGetPropNode(node, "namespace");
        !          6736:     ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          6737:     if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any")))
        !          6738:        wildc->any = 1;
        !          6739:     else if (xmlStrEqual(ns, BAD_CAST "##other")) {
        !          6740:        wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          6741:        if (wildc->negNsSet == NULL) {
        !          6742:            return (-1);
        !          6743:        }
        !          6744:        wildc->negNsSet->value = ctxt->targetNamespace;
        !          6745:     } else {
        !          6746:        const xmlChar *end, *cur;
        !          6747: 
        !          6748:        cur = ns;
        !          6749:        do {
        !          6750:            while (IS_BLANK_CH(*cur))
        !          6751:                cur++;
        !          6752:            end = cur;
        !          6753:            while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          6754:                end++;
        !          6755:            if (end == cur)
        !          6756:                break;
        !          6757:            nsItem = xmlStrndup(cur, end - cur);
        !          6758:            if ((xmlStrEqual(nsItem, BAD_CAST "##other")) ||
        !          6759:                    (xmlStrEqual(nsItem, BAD_CAST "##any"))) {
        !          6760:                xmlSchemaPSimpleTypeErr(ctxt,
        !          6761:                    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER,
        !          6762:                    NULL, (xmlNodePtr) attr,
        !          6763:                    NULL,
        !          6764:                    "((##any | ##other) | List of (xs:anyURI | "
        !          6765:                    "(##targetNamespace | ##local)))",
        !          6766:                    nsItem, NULL, NULL, NULL);
        !          6767:                ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER;
        !          6768:            } else {
        !          6769:                if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) {
        !          6770:                    dictnsItem = ctxt->targetNamespace;
        !          6771:                } else if (xmlStrEqual(nsItem, BAD_CAST "##local")) {
        !          6772:                    dictnsItem = NULL;
        !          6773:                } else {
        !          6774:                    /*
        !          6775:                    * Validate the item (anyURI).
        !          6776:                    */
        !          6777:                    xmlSchemaPValAttrNodeValue(ctxt, NULL, attr,
        !          6778:                        nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
        !          6779:                    dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1);
        !          6780:                }
        !          6781:                /*
        !          6782:                * Avoid dublicate namespaces.
        !          6783:                */
        !          6784:                tmp = wildc->nsSet;
        !          6785:                while (tmp != NULL) {
        !          6786:                    if (dictnsItem == tmp->value)
        !          6787:                        break;
        !          6788:                    tmp = tmp->next;
        !          6789:                }
        !          6790:                if (tmp == NULL) {
        !          6791:                    tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          6792:                    if (tmp == NULL) {
        !          6793:                        xmlFree(nsItem);
        !          6794:                        return (-1);
        !          6795:                    }
        !          6796:                    tmp->value = dictnsItem;
        !          6797:                    tmp->next = NULL;
        !          6798:                    if (wildc->nsSet == NULL)
        !          6799:                        wildc->nsSet = tmp;
        !          6800:                    else if (lastNs != NULL)
        !          6801:                        lastNs->next = tmp;
        !          6802:                    lastNs = tmp;
        !          6803:                }
        !          6804: 
        !          6805:            }
        !          6806:            xmlFree(nsItem);
        !          6807:            cur = end;
        !          6808:        } while (*cur != 0);
        !          6809:     }
        !          6810:     return (ret);
        !          6811: }
        !          6812: 
        !          6813: static int
        !          6814: xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
        !          6815:                                 xmlSchemaParticlePtr item ATTRIBUTE_UNUSED,
        !          6816:                                 xmlNodePtr node,
        !          6817:                                 int minOccurs,
        !          6818:                                 int maxOccurs) {
        !          6819: 
        !          6820:     if ((maxOccurs == 0) && ( minOccurs == 0))
        !          6821:        return (0);
        !          6822:     if (maxOccurs != UNBOUNDED) {
        !          6823:        /*
        !          6824:        * TODO: Maybe we should better not create the particle,
        !          6825:        * if min/max is invalid, since it could confuse the build of the
        !          6826:        * content model.
        !          6827:        */
        !          6828:        /*
        !          6829:        * 3.9.6 Schema Component Constraint: Particle Correct
        !          6830:        *
        !          6831:        */
        !          6832:        if (maxOccurs < 1) {
        !          6833:            /*
        !          6834:            * 2.2 {max occurs} must be greater than or equal to 1.
        !          6835:            */
        !          6836:            xmlSchemaPCustomAttrErr(ctxt,
        !          6837:                XML_SCHEMAP_P_PROPS_CORRECT_2_2,
        !          6838:                NULL, NULL,
        !          6839:                xmlSchemaGetPropNode(node, "maxOccurs"),
        !          6840:                "The value must be greater than or equal to 1");
        !          6841:            return (XML_SCHEMAP_P_PROPS_CORRECT_2_2);
        !          6842:        } else if (minOccurs > maxOccurs) {
        !          6843:            /*
        !          6844:            * 2.1 {min occurs} must not be greater than {max occurs}.
        !          6845:            */
        !          6846:            xmlSchemaPCustomAttrErr(ctxt,
        !          6847:                XML_SCHEMAP_P_PROPS_CORRECT_2_1,
        !          6848:                NULL, NULL,
        !          6849:                xmlSchemaGetPropNode(node, "minOccurs"),
        !          6850:                "The value must not be greater than the value of 'maxOccurs'");
        !          6851:            return (XML_SCHEMAP_P_PROPS_CORRECT_2_1);
        !          6852:        }
        !          6853:     }
        !          6854:     return (0);
        !          6855: }
        !          6856: 
        !          6857: /**
        !          6858:  * xmlSchemaParseAny:
        !          6859:  * @ctxt:  a schema validation context
        !          6860:  * @schema:  the schema being built
        !          6861:  * @node:  a subtree containing XML Schema informations
        !          6862:  *
        !          6863:  * Parsea a XML schema <any> element. A particle and wildcard
        !          6864:  * will be created (except if minOccurs==maxOccurs==0, in this case
        !          6865:  * nothing will be created).
        !          6866:  * *WARNING* this interface is highly subject to change
        !          6867:  *
        !          6868:  * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0
        !          6869:  */
        !          6870: static xmlSchemaParticlePtr
        !          6871: xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          6872:                   xmlNodePtr node)
        !          6873: {
        !          6874:     xmlSchemaParticlePtr particle;
        !          6875:     xmlNodePtr child = NULL;
        !          6876:     xmlSchemaWildcardPtr wild;
        !          6877:     int min, max;
        !          6878:     xmlAttrPtr attr;
        !          6879:     xmlSchemaAnnotPtr annot = NULL;
        !          6880: 
        !          6881:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          6882:         return (NULL);
        !          6883:     /*
        !          6884:     * Check for illegal attributes.
        !          6885:     */
        !          6886:     attr = node->properties;
        !          6887:     while (attr != NULL) {
        !          6888:        if (attr->ns == NULL) {
        !          6889:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          6890:                (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
        !          6891:                (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
        !          6892:                (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
        !          6893:                (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
        !          6894:                xmlSchemaPIllegalAttrErr(ctxt,
        !          6895:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6896:            }
        !          6897:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          6898:            xmlSchemaPIllegalAttrErr(ctxt,
        !          6899:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          6900:        }
        !          6901:        attr = attr->next;
        !          6902:     }
        !          6903:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          6904:     /*
        !          6905:     * minOccurs/maxOccurs.
        !          6906:     */
        !          6907:     max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
        !          6908:        "(xs:nonNegativeInteger | unbounded)");
        !          6909:     min = xmlGetMinOccurs(ctxt, node, 0, -1, 1,
        !          6910:        "xs:nonNegativeInteger");
        !          6911:     xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
        !          6912:     /*
        !          6913:     * Create & parse the wildcard.
        !          6914:     */
        !          6915:     wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node);
        !          6916:     if (wild == NULL)
        !          6917:        return (NULL);
        !          6918:     xmlSchemaParseWildcardNs(ctxt, schema, wild, node);
        !          6919:     /*
        !          6920:     * And now for the children...
        !          6921:     */
        !          6922:     child = node->children;
        !          6923:     if (IS_SCHEMA(child, "annotation")) {
        !          6924:         annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          6925:         child = child->next;
        !          6926:     }
        !          6927:     if (child != NULL) {
        !          6928:        xmlSchemaPContentErr(ctxt,
        !          6929:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          6930:            NULL, node, child,
        !          6931:            NULL, "(annotation?)");
        !          6932:     }
        !          6933:     /*
        !          6934:     * No component if minOccurs==maxOccurs==0.
        !          6935:     */
        !          6936:     if ((min == 0) && (max == 0)) {
        !          6937:        /* Don't free the wildcard, since it's already on the list. */
        !          6938:        return (NULL);
        !          6939:     }
        !          6940:     /*
        !          6941:     * Create the particle.
        !          6942:     */
        !          6943:     particle = xmlSchemaAddParticle(ctxt, node, min, max);
        !          6944:     if (particle == NULL)
        !          6945:         return (NULL);
        !          6946:     particle->annot = annot;
        !          6947:     particle->children = (xmlSchemaTreeItemPtr) wild;
        !          6948: 
        !          6949:     return (particle);
        !          6950: }
        !          6951: 
        !          6952: /**
        !          6953:  * xmlSchemaParseNotation:
        !          6954:  * @ctxt:  a schema validation context
        !          6955:  * @schema:  the schema being built
        !          6956:  * @node:  a subtree containing XML Schema informations
        !          6957:  *
        !          6958:  * parse a XML schema Notation declaration
        !          6959:  *
        !          6960:  * Returns the new structure or NULL in case of error
        !          6961:  */
        !          6962: static xmlSchemaNotationPtr
        !          6963: xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          6964:                        xmlNodePtr node)
        !          6965: {
        !          6966:     const xmlChar *name;
        !          6967:     xmlSchemaNotationPtr ret;
        !          6968:     xmlNodePtr child = NULL;
        !          6969: 
        !          6970:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          6971:         return (NULL);
        !          6972:     name = xmlSchemaGetProp(ctxt, node, "name");
        !          6973:     if (name == NULL) {
        !          6974:         xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME,
        !          6975:                        "Notation has no name\n", NULL, NULL);
        !          6976:         return (NULL);
        !          6977:     }
        !          6978:     ret = xmlSchemaAddNotation(ctxt, schema, name,
        !          6979:        ctxt->targetNamespace, node);
        !          6980:     if (ret == NULL)
        !          6981:         return (NULL);
        !          6982:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          6983: 
        !          6984:     child = node->children;
        !          6985:     if (IS_SCHEMA(child, "annotation")) {
        !          6986:         ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          6987:         child = child->next;
        !          6988:     }
        !          6989:     if (child != NULL) {
        !          6990:        xmlSchemaPContentErr(ctxt,
        !          6991:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          6992:            NULL, node, child,
        !          6993:            NULL, "(annotation?)");
        !          6994:     }
        !          6995: 
        !          6996:     return (ret);
        !          6997: }
        !          6998: 
        !          6999: /**
        !          7000:  * xmlSchemaParseAnyAttribute:
        !          7001:  * @ctxt:  a schema validation context
        !          7002:  * @schema:  the schema being built
        !          7003:  * @node:  a subtree containing XML Schema informations
        !          7004:  *
        !          7005:  * parse a XML schema AnyAttrribute declaration
        !          7006:  * *WARNING* this interface is highly subject to change
        !          7007:  *
        !          7008:  * Returns a wildcard or NULL.
        !          7009:  */
        !          7010: static xmlSchemaWildcardPtr
        !          7011: xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
        !          7012:                            xmlSchemaPtr schema, xmlNodePtr node)
        !          7013: {
        !          7014:     xmlSchemaWildcardPtr ret;
        !          7015:     xmlNodePtr child = NULL;
        !          7016:     xmlAttrPtr attr;
        !          7017: 
        !          7018:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          7019:         return (NULL);
        !          7020: 
        !          7021:     ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
        !          7022:        node);
        !          7023:     if (ret == NULL) {
        !          7024:         return (NULL);
        !          7025:     }
        !          7026:     /*
        !          7027:     * Check for illegal attributes.
        !          7028:     */
        !          7029:     attr = node->properties;
        !          7030:     while (attr != NULL) {
        !          7031:        if (attr->ns == NULL) {
        !          7032:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          7033:                (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
        !          7034:                (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
        !          7035:                xmlSchemaPIllegalAttrErr(ctxt,
        !          7036:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7037:            }
        !          7038:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          7039:            xmlSchemaPIllegalAttrErr(ctxt,
        !          7040:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7041:        }
        !          7042:        attr = attr->next;
        !          7043:     }
        !          7044:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          7045:     /*
        !          7046:     * Parse the namespace list.
        !          7047:     */
        !          7048:     if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0)
        !          7049:        return (NULL);
        !          7050:     /*
        !          7051:     * And now for the children...
        !          7052:     */
        !          7053:     child = node->children;
        !          7054:     if (IS_SCHEMA(child, "annotation")) {
        !          7055:         ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          7056:         child = child->next;
        !          7057:     }
        !          7058:     if (child != NULL) {
        !          7059:        xmlSchemaPContentErr(ctxt,
        !          7060:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7061:            NULL, node, child,
        !          7062:            NULL, "(annotation?)");
        !          7063:     }
        !          7064: 
        !          7065:     return (ret);
        !          7066: }
        !          7067: 
        !          7068: 
        !          7069: /**
        !          7070:  * xmlSchemaParseAttribute:
        !          7071:  * @ctxt:  a schema validation context
        !          7072:  * @schema:  the schema being built
        !          7073:  * @node:  a subtree containing XML Schema informations
        !          7074:  *
        !          7075:  * parse a XML schema Attrribute declaration
        !          7076:  * *WARNING* this interface is highly subject to change
        !          7077:  *
        !          7078:  * Returns the attribute declaration.
        !          7079:  */
        !          7080: static xmlSchemaBasicItemPtr
        !          7081: xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
        !          7082:                             xmlSchemaPtr schema,
        !          7083:                             xmlNodePtr node,
        !          7084:                             xmlSchemaItemListPtr uses,
        !          7085:                             int parentType)
        !          7086: {
        !          7087:     const xmlChar *attrValue, *name = NULL, *ns = NULL;
        !          7088:     xmlSchemaAttributeUsePtr use = NULL;
        !          7089:     xmlNodePtr child = NULL;
        !          7090:     xmlAttrPtr attr;
        !          7091:     const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL;
        !          7092:     int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
        !          7093:     int        nberrors, hasForm = 0, defValueType = 0;
        !          7094: 
        !          7095: #define WXS_ATTR_DEF_VAL_DEFAULT 1
        !          7096: #define WXS_ATTR_DEF_VAL_FIXED 2
        !          7097: 
        !          7098:     /*
        !          7099:      * 3.2.3 Constraints on XML Representations of Attribute Declarations
        !          7100:      */
        !          7101: 
        !          7102:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          7103:         return (NULL);
        !          7104:     attr = xmlSchemaGetPropNode(node, "ref");
        !          7105:     if (attr != NULL) {
        !          7106:        if (xmlSchemaPValAttrNodeQName(pctxt, schema,
        !          7107:            NULL, attr, &tmpNs, &tmpName) != 0) {
        !          7108:            return (NULL);
        !          7109:        }
        !          7110:        if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0)
        !          7111:            return(NULL);
        !          7112:        isRef = 1;
        !          7113:     }
        !          7114:     nberrors = pctxt->nberrors;
        !          7115:     /*
        !          7116:     * Check for illegal attributes.
        !          7117:     */
        !          7118:     attr = node->properties;
        !          7119:     while (attr != NULL) {
        !          7120:        if (attr->ns == NULL) {
        !          7121:            if (isRef) {
        !          7122:                if (xmlStrEqual(attr->name, BAD_CAST "id")) {
        !          7123:                    xmlSchemaPValAttrNodeID(pctxt, attr);
        !          7124:                    goto attr_next;
        !          7125:                } else if (xmlStrEqual(attr->name, BAD_CAST "ref")) {
        !          7126:                    goto attr_next;
        !          7127:                }
        !          7128:            } else {
        !          7129:                if (xmlStrEqual(attr->name, BAD_CAST "name")) {
        !          7130:                    goto attr_next;
        !          7131:                } else if (xmlStrEqual(attr->name, BAD_CAST "id")) {
        !          7132:                    xmlSchemaPValAttrNodeID(pctxt, attr);
        !          7133:                    goto attr_next;
        !          7134:                } else if (xmlStrEqual(attr->name, BAD_CAST "type")) {
        !          7135:                    xmlSchemaPValAttrNodeQName(pctxt, schema, NULL,
        !          7136:                        attr, &tmpNs, &tmpName);
        !          7137:                    goto attr_next;
        !          7138:                } else if (xmlStrEqual(attr->name, BAD_CAST "form")) {
        !          7139:                    /*
        !          7140:                    * Evaluate the target namespace
        !          7141:                    */
        !          7142:                    hasForm = 1;
        !          7143:                    attrValue = xmlSchemaGetNodeContent(pctxt,
        !          7144:                        (xmlNodePtr) attr);
        !          7145:                    if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
        !          7146:                        ns = pctxt->targetNamespace;
        !          7147:                    } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified"))
        !          7148:                    {
        !          7149:                        xmlSchemaPSimpleTypeErr(pctxt,
        !          7150:                            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          7151:                            NULL, (xmlNodePtr) attr,
        !          7152:                            NULL, "(qualified | unqualified)",
        !          7153:                            attrValue, NULL, NULL, NULL);
        !          7154:                    }
        !          7155:                    goto attr_next;
        !          7156:                }
        !          7157:            }
        !          7158:            if (xmlStrEqual(attr->name, BAD_CAST "use")) {
        !          7159: 
        !          7160:                attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
        !          7161:                /* TODO: Maybe we need to normalize the value beforehand. */
        !          7162:                if (xmlStrEqual(attrValue, BAD_CAST "optional"))
        !          7163:                    occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
        !          7164:                else if (xmlStrEqual(attrValue, BAD_CAST "prohibited"))
        !          7165:                    occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
        !          7166:                else if (xmlStrEqual(attrValue, BAD_CAST "required"))
        !          7167:                    occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
        !          7168:                else {
        !          7169:                    xmlSchemaPSimpleTypeErr(pctxt,
        !          7170:                        XML_SCHEMAP_INVALID_ATTR_USE,
        !          7171:                        NULL, (xmlNodePtr) attr,
        !          7172:                        NULL, "(optional | prohibited | required)",
        !          7173:                        attrValue, NULL, NULL, NULL);
        !          7174:                }
        !          7175:                goto attr_next;
        !          7176:            } else if (xmlStrEqual(attr->name, BAD_CAST "default")) {
        !          7177:                /*
        !          7178:                * 3.2.3 : 1
        !          7179:                * default and fixed must not both be present.
        !          7180:                */
        !          7181:                if (defValue) {
        !          7182:                    xmlSchemaPMutualExclAttrErr(pctxt,
        !          7183:                        XML_SCHEMAP_SRC_ATTRIBUTE_1,
        !          7184:                        NULL, attr, "default", "fixed");
        !          7185:                } else {
        !          7186:                    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
        !          7187:                    defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
        !          7188:                }
        !          7189:                goto attr_next;
        !          7190:            } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) {
        !          7191:                /*
        !          7192:                * 3.2.3 : 1
        !          7193:                * default and fixed must not both be present.
        !          7194:                */
        !          7195:                if (defValue) {
        !          7196:                    xmlSchemaPMutualExclAttrErr(pctxt,
        !          7197:                        XML_SCHEMAP_SRC_ATTRIBUTE_1,
        !          7198:                        NULL, attr, "default", "fixed");
        !          7199:                } else {
        !          7200:                    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
        !          7201:                    defValueType = WXS_ATTR_DEF_VAL_FIXED;
        !          7202:                }
        !          7203:                goto attr_next;
        !          7204:            }
        !          7205:        } else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs))
        !          7206:            goto attr_next;
        !          7207: 
        !          7208:        xmlSchemaPIllegalAttrErr(pctxt,
        !          7209:            XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7210: 
        !          7211: attr_next:
        !          7212:        attr = attr->next;
        !          7213:     }
        !          7214:     /*
        !          7215:     * 3.2.3 : 2
        !          7216:     * If default and use are both present, use must have
        !          7217:     * the actual value optional.
        !          7218:     */
        !          7219:     if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
        !          7220:        (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
        !          7221:        xmlSchemaPSimpleTypeErr(pctxt,
        !          7222:            XML_SCHEMAP_SRC_ATTRIBUTE_2,
        !          7223:            NULL, node, NULL,
        !          7224:            "(optional | prohibited | required)", NULL,
        !          7225:            "The value of the attribute 'use' must be 'optional' "
        !          7226:            "if the attribute 'default' is present",
        !          7227:            NULL, NULL);
        !          7228:     }
        !          7229:     /*
        !          7230:     * We want correct attributes.
        !          7231:     */
        !          7232:     if (nberrors != pctxt->nberrors)
        !          7233:        return(NULL);
        !          7234:     if (! isRef) {
        !          7235:        xmlSchemaAttributePtr attrDecl;
        !          7236: 
        !          7237:        /* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */
        !          7238:        if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR))
        !          7239:            ns = pctxt->targetNamespace;
        !          7240:        /*
        !          7241:        * 3.2.6 Schema Component Constraint: xsi: Not Allowed
        !          7242:        * TODO: Move this to the component layer.
        !          7243:        */
        !          7244:        if (xmlStrEqual(ns, xmlSchemaInstanceNs)) {
        !          7245:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          7246:                XML_SCHEMAP_NO_XSI,
        !          7247:                node, NULL,
        !          7248:                "The target namespace must not match '%s'",
        !          7249:                xmlSchemaInstanceNs, NULL);
        !          7250:        }
        !          7251:        attr = xmlSchemaGetPropNode(node, "name");
        !          7252:        if (attr == NULL) {
        !          7253:            xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
        !          7254:                NULL, node, "name", NULL);
        !          7255:            return (NULL);
        !          7256:        }
        !          7257:        if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
        !          7258:            xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
        !          7259:            return (NULL);
        !          7260:        }
        !          7261:        /*
        !          7262:        * 3.2.6 Schema Component Constraint: xmlns Not Allowed
        !          7263:        * TODO: Move this to the component layer.
        !          7264:        */
        !          7265:        if (xmlStrEqual(name, BAD_CAST "xmlns")) {
        !          7266:            xmlSchemaPSimpleTypeErr(pctxt,
        !          7267:                XML_SCHEMAP_NO_XMLNS,
        !          7268:                NULL, (xmlNodePtr) attr,
        !          7269:                xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
        !          7270:                "The value of the attribute must not match 'xmlns'",
        !          7271:                NULL, NULL);
        !          7272:            return (NULL);
        !          7273:        }
        !          7274:        if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
        !          7275:            goto check_children;
        !          7276:        /*
        !          7277:        * Create the attribute use component.
        !          7278:        */
        !          7279:        use = xmlSchemaAddAttributeUse(pctxt, node);
        !          7280:        if (use == NULL)
        !          7281:            return(NULL);
        !          7282:        use->occurs = occurs;
        !          7283:        /*
        !          7284:        * Create the attribute declaration.
        !          7285:        */
        !          7286:        attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0);
        !          7287:        if (attrDecl == NULL)
        !          7288:            return (NULL);
        !          7289:        if (tmpName != NULL) {
        !          7290:            attrDecl->typeName = tmpName;
        !          7291:            attrDecl->typeNs = tmpNs;
        !          7292:        }
        !          7293:        use->attrDecl = attrDecl;
        !          7294:        /*
        !          7295:        * Value constraint.
        !          7296:        */
        !          7297:        if (defValue != NULL) {
        !          7298:            attrDecl->defValue = defValue;
        !          7299:            if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
        !          7300:                attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
        !          7301:        }
        !          7302:     } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
        !          7303:        xmlSchemaQNameRefPtr ref;
        !          7304: 
        !          7305:        /*
        !          7306:        * Create the attribute use component.
        !          7307:        */
        !          7308:        use = xmlSchemaAddAttributeUse(pctxt, node);
        !          7309:        if (use == NULL)
        !          7310:            return(NULL);
        !          7311:        /*
        !          7312:        * We need to resolve the reference at later stage.
        !          7313:        */
        !          7314:        WXS_ADD_PENDING(pctxt, use);
        !          7315:        use->occurs = occurs;
        !          7316:        /*
        !          7317:        * Create a QName reference to the attribute declaration.
        !          7318:        */
        !          7319:        ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
        !          7320:            tmpName, tmpNs);
        !          7321:        if (ref == NULL)
        !          7322:            return(NULL);
        !          7323:        /*
        !          7324:        * Assign the reference. This will be substituted for the
        !          7325:        * referenced attribute declaration when the QName is resolved.
        !          7326:        */
        !          7327:        use->attrDecl = WXS_ATTR_CAST ref;
        !          7328:        /*
        !          7329:        * Value constraint.
        !          7330:        */
        !          7331:        if (defValue != NULL)
        !          7332:            use->defValue = defValue;
        !          7333:            if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
        !          7334:                use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
        !          7335:     }
        !          7336: 
        !          7337: check_children:
        !          7338:     /*
        !          7339:     * And now for the children...
        !          7340:     */
        !          7341:     child = node->children;
        !          7342:     if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
        !          7343:        xmlSchemaAttributeUseProhibPtr prohib;
        !          7344: 
        !          7345:        if (IS_SCHEMA(child, "annotation")) {
        !          7346:            xmlSchemaParseAnnotation(pctxt, child, 0);
        !          7347:            child = child->next;
        !          7348:        }
        !          7349:        if (child != NULL) {
        !          7350:            xmlSchemaPContentErr(pctxt,
        !          7351:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7352:                NULL, node, child, NULL,
        !          7353:                "(annotation?)");
        !          7354:        }
        !          7355:        /*
        !          7356:        * Check for pointlessness of attribute prohibitions.
        !          7357:        */
        !          7358:        if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
        !          7359:            xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          7360:                XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
        !          7361:                node, NULL,
        !          7362:                "Skipping attribute use prohibition, since it is "
        !          7363:                "pointless inside an <attributeGroup>",
        !          7364:                NULL, NULL, NULL);
        !          7365:            return(NULL);
        !          7366:        } else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
        !          7367:            xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          7368:                XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
        !          7369:                node, NULL,
        !          7370:                "Skipping attribute use prohibition, since it is "
        !          7371:                "pointless when extending a type",
        !          7372:                NULL, NULL, NULL);
        !          7373:            return(NULL);
        !          7374:        }
        !          7375:        if (! isRef) {
        !          7376:            tmpName = name;
        !          7377:            tmpNs = ns;
        !          7378:        }
        !          7379:        /*
        !          7380:        * Check for duplicate attribute prohibitions.
        !          7381:        */
        !          7382:        if (uses) {
        !          7383:            int i;
        !          7384: 
        !          7385:            for (i = 0; i < uses->nbItems; i++) {
        !          7386:                use = uses->items[i];
        !          7387:                if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
        !          7388:                    (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
        !          7389:                    (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
        !          7390:                {
        !          7391:                    xmlChar *str = NULL;
        !          7392: 
        !          7393:                    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          7394:                        XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
        !          7395:                        node, NULL,
        !          7396:                        "Skipping duplicate attribute use prohibition '%s'",
        !          7397:                        xmlSchemaFormatQName(&str, tmpNs, tmpName),
        !          7398:                        NULL, NULL);
        !          7399:                    FREE_AND_NULL(str)
        !          7400:                    return(NULL);
        !          7401:                }
        !          7402:            }
        !          7403:        }
        !          7404:        /*
        !          7405:        * Create the attribute prohibition helper component.
        !          7406:        */
        !          7407:        prohib = xmlSchemaAddAttributeUseProhib(pctxt);
        !          7408:        if (prohib == NULL)
        !          7409:            return(NULL);
        !          7410:        prohib->node = node;
        !          7411:        prohib->name = tmpName;
        !          7412:        prohib->targetNamespace = tmpNs;
        !          7413:        if (isRef) {
        !          7414:            /*
        !          7415:            * We need at least to resolve to the attribute declaration.
        !          7416:            */
        !          7417:            WXS_ADD_PENDING(pctxt, prohib);
        !          7418:        }
        !          7419:        return(WXS_BASIC_CAST prohib);
        !          7420:     } else {
        !          7421:        if (IS_SCHEMA(child, "annotation")) {
        !          7422:            /*
        !          7423:            * TODO: Should this go into the attr decl?
        !          7424:            */
        !          7425:            use->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
        !          7426:            child = child->next;
        !          7427:        }
        !          7428:        if (isRef) {
        !          7429:            if (child != NULL) {
        !          7430:                if (IS_SCHEMA(child, "simpleType"))
        !          7431:                    /*
        !          7432:                    * 3.2.3 : 3.2
        !          7433:                    * If ref is present, then all of <simpleType>,
        !          7434:                    * form and type must be absent.
        !          7435:                    */
        !          7436:                    xmlSchemaPContentErr(pctxt,
        !          7437:                        XML_SCHEMAP_SRC_ATTRIBUTE_3_2,
        !          7438:                        NULL, node, child, NULL,
        !          7439:                        "(annotation?)");
        !          7440:                else
        !          7441:                    xmlSchemaPContentErr(pctxt,
        !          7442:                        XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7443:                        NULL, node, child, NULL,
        !          7444:                        "(annotation?)");
        !          7445:            }
        !          7446:        } else {
        !          7447:            if (IS_SCHEMA(child, "simpleType")) {
        !          7448:                if (WXS_ATTRUSE_DECL(use)->typeName != NULL) {
        !          7449:                    /*
        !          7450:                    * 3.2.3 : 4
        !          7451:                    * type and <simpleType> must not both be present.
        !          7452:                    */
        !          7453:                    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
        !          7454:                        NULL, node, child,
        !          7455:                        "The attribute 'type' and the <simpleType> child "
        !          7456:                        "are mutually exclusive", NULL);
        !          7457:                } else
        !          7458:                    WXS_ATTRUSE_TYPEDEF(use) =
        !          7459:                        xmlSchemaParseSimpleType(pctxt, schema, child, 0);
        !          7460:                child = child->next;
        !          7461:            }
        !          7462:            if (child != NULL)
        !          7463:                xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7464:                NULL, node, child, NULL,
        !          7465:                "(annotation?, simpleType?)");
        !          7466:        }
        !          7467:     }
        !          7468:     return (WXS_BASIC_CAST use);
        !          7469: }
        !          7470: 
        !          7471: 
        !          7472: static xmlSchemaAttributePtr
        !          7473: xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
        !          7474:                              xmlSchemaPtr schema,
        !          7475:                              xmlNodePtr node)
        !          7476: {
        !          7477:     const xmlChar *attrValue;
        !          7478:     xmlSchemaAttributePtr ret;
        !          7479:     xmlNodePtr child = NULL;
        !          7480:     xmlAttrPtr attr;
        !          7481: 
        !          7482:     /*
        !          7483:      * Note that the w3c spec assumes the schema to be validated with schema
        !          7484:      * for schemas beforehand.
        !          7485:      *
        !          7486:      * 3.2.3 Constraints on XML Representations of Attribute Declarations
        !          7487:      */
        !          7488:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          7489:         return (NULL);
        !          7490:     /*
        !          7491:     * 3.2.3 : 3.1
        !          7492:     * One of ref or name must be present, but not both
        !          7493:     */
        !          7494:     attr = xmlSchemaGetPropNode(node, "name");
        !          7495:     if (attr == NULL) {
        !          7496:        xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
        !          7497:            NULL, node, "name", NULL);
        !          7498:        return (NULL);
        !          7499:     }
        !          7500:     if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
        !          7501:        xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
        !          7502:        return (NULL);
        !          7503:     }
        !          7504:     /*
        !          7505:     * 3.2.6 Schema Component Constraint: xmlns Not Allowed
        !          7506:     * TODO: Move this to the component layer.
        !          7507:     */
        !          7508:     if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) {
        !          7509:        xmlSchemaPSimpleTypeErr(pctxt,
        !          7510:            XML_SCHEMAP_NO_XMLNS,
        !          7511:            NULL, (xmlNodePtr) attr,
        !          7512:            xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
        !          7513:            "The value of the attribute must not match 'xmlns'",
        !          7514:            NULL, NULL);
        !          7515:        return (NULL);
        !          7516:     }
        !          7517:     /*
        !          7518:     * 3.2.6 Schema Component Constraint: xsi: Not Allowed
        !          7519:     * TODO: Move this to the component layer.
        !          7520:     *       Or better leave it here and add it to the component layer
        !          7521:     *       if we have a schema construction API.
        !          7522:     */
        !          7523:     if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
        !          7524:        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          7525:            XML_SCHEMAP_NO_XSI, node, NULL,
        !          7526:            "The target namespace must not match '%s'",
        !          7527:            xmlSchemaInstanceNs, NULL);
        !          7528:     }
        !          7529: 
        !          7530:     ret = xmlSchemaAddAttribute(pctxt, schema, attrValue,
        !          7531:        pctxt->targetNamespace, node, 1);
        !          7532:     if (ret == NULL)
        !          7533:        return (NULL);
        !          7534:     ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
        !          7535: 
        !          7536:     /*
        !          7537:     * Check for illegal attributes.
        !          7538:     */
        !          7539:     attr = node->properties;
        !          7540:     while (attr != NULL) {
        !          7541:        if (attr->ns == NULL) {
        !          7542:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          7543:                (!xmlStrEqual(attr->name, BAD_CAST "default")) &&
        !          7544:                (!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
        !          7545:                (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          7546:                (!xmlStrEqual(attr->name, BAD_CAST "type")))
        !          7547:            {
        !          7548:                xmlSchemaPIllegalAttrErr(pctxt,
        !          7549:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7550:            }
        !          7551:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          7552:            xmlSchemaPIllegalAttrErr(pctxt,
        !          7553:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7554:        }
        !          7555:        attr = attr->next;
        !          7556:     }
        !          7557:     xmlSchemaPValAttrQName(pctxt, schema, NULL,
        !          7558:        node, "type", &ret->typeNs, &ret->typeName);
        !          7559: 
        !          7560:     xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
        !          7561:     /*
        !          7562:     * Attribute "fixed".
        !          7563:     */
        !          7564:     ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed");
        !          7565:     if (ret->defValue != NULL)
        !          7566:        ret->flags |= XML_SCHEMAS_ATTR_FIXED;
        !          7567:     /*
        !          7568:     * Attribute "default".
        !          7569:     */
        !          7570:     attr = xmlSchemaGetPropNode(node, "default");
        !          7571:     if (attr != NULL) {
        !          7572:        /*
        !          7573:        * 3.2.3 : 1
        !          7574:        * default and fixed must not both be present.
        !          7575:        */
        !          7576:        if (ret->flags & XML_SCHEMAS_ATTR_FIXED) {
        !          7577:            xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1,
        !          7578:                WXS_BASIC_CAST ret, attr, "default", "fixed");
        !          7579:        } else
        !          7580:            ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
        !          7581:     }
        !          7582:     /*
        !          7583:     * And now for the children...
        !          7584:     */
        !          7585:     child = node->children;
        !          7586:     if (IS_SCHEMA(child, "annotation")) {
        !          7587:         ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
        !          7588:         child = child->next;
        !          7589:     }
        !          7590:     if (IS_SCHEMA(child, "simpleType")) {
        !          7591:        if (ret->typeName != NULL) {
        !          7592:            /*
        !          7593:            * 3.2.3 : 4
        !          7594:            * type and <simpleType> must not both be present.
        !          7595:            */
        !          7596:            xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
        !          7597:                NULL, node, child,
        !          7598:                "The attribute 'type' and the <simpleType> child "
        !          7599:                "are mutually exclusive", NULL);
        !          7600:        } else
        !          7601:            ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0);
        !          7602:        child = child->next;
        !          7603:     }
        !          7604:     if (child != NULL)
        !          7605:        xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7606:            NULL, node, child, NULL,
        !          7607:            "(annotation?, simpleType?)");
        !          7608: 
        !          7609:     return (ret);
        !          7610: }
        !          7611: 
        !          7612: /**
        !          7613:  * xmlSchemaParseAttributeGroupRef:
        !          7614:  * @ctxt:  a schema validation context
        !          7615:  * @schema:  the schema being built
        !          7616:  * @node:  a subtree containing XML Schema informations
        !          7617:  *
        !          7618:  * Parse an attribute group definition reference.
        !          7619:  * Note that a reference to an attribute group does not
        !          7620:  * correspond to any component at all.
        !          7621:  * *WARNING* this interface is highly subject to change
        !          7622:  *
        !          7623:  * Returns the attribute group or NULL in case of error.
        !          7624:  */
        !          7625: static xmlSchemaQNameRefPtr
        !          7626: xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
        !          7627:                                xmlSchemaPtr schema,
        !          7628:                                xmlNodePtr node)
        !          7629: {
        !          7630:     xmlSchemaQNameRefPtr ret;
        !          7631:     xmlNodePtr child = NULL;
        !          7632:     xmlAttrPtr attr;
        !          7633:     const xmlChar *refNs = NULL, *ref = NULL;
        !          7634: 
        !          7635:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          7636:         return (NULL);
        !          7637: 
        !          7638:     attr = xmlSchemaGetPropNode(node, "ref");
        !          7639:     if (attr == NULL) {
        !          7640:        xmlSchemaPMissingAttrErr(pctxt,
        !          7641:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          7642:            NULL, node, "ref", NULL);
        !          7643:        return (NULL);
        !          7644:     }
        !          7645:     xmlSchemaPValAttrNodeQName(pctxt, schema,
        !          7646:        NULL, attr, &refNs, &ref);
        !          7647:     if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0)
        !          7648:        return(NULL);
        !          7649: 
        !          7650:     /*
        !          7651:     * Check for illegal attributes.
        !          7652:     */
        !          7653:     attr = node->properties;
        !          7654:     while (attr != NULL) {
        !          7655:        if (attr->ns == NULL) {
        !          7656:            if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
        !          7657:                (!xmlStrEqual(attr->name, BAD_CAST "id")))
        !          7658:            {
        !          7659:                xmlSchemaPIllegalAttrErr(pctxt,
        !          7660:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7661:            }
        !          7662:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          7663:            xmlSchemaPIllegalAttrErr(pctxt,
        !          7664:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7665:        }
        !          7666:        attr = attr->next;
        !          7667:     }
        !          7668:     /* Attribute ID */
        !          7669:     xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
        !          7670: 
        !          7671:     /*
        !          7672:     * And now for the children...
        !          7673:     */
        !          7674:     child = node->children;
        !          7675:     if (IS_SCHEMA(child, "annotation")) {
        !          7676:        /*
        !          7677:        * TODO: We do not have a place to store the annotation, do we?
        !          7678:        */
        !          7679:         xmlSchemaParseAnnotation(pctxt, child, 0);
        !          7680:         child = child->next;
        !          7681:     }
        !          7682:     if (child != NULL) {
        !          7683:        xmlSchemaPContentErr(pctxt,
        !          7684:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7685:            NULL, node, child, NULL,
        !          7686:            "(annotation?)");
        !          7687:     }
        !          7688: 
        !          7689:     /*
        !          7690:     * Handle attribute group redefinitions.
        !          7691:     */
        !          7692:     if (pctxt->isRedefine && pctxt->redef &&
        !          7693:        (pctxt->redef->item->type ==
        !          7694:            XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
        !          7695:        (ref == pctxt->redef->refName) &&
        !          7696:        (refNs == pctxt->redef->refTargetNs))
        !          7697:     {
        !          7698:        /*
        !          7699:        * SPEC src-redefine:
        !          7700:        * (7.1) "If it has an <attributeGroup> among its contents
        !          7701:        * the �actual value� of whose ref [attribute] is the same
        !          7702:        * as the �actual value� of its own name attribute plus
        !          7703:        * target namespace, then it must have exactly one such group."
        !          7704:        */
        !          7705:        if (pctxt->redefCounter != 0) {
        !          7706:            xmlChar *str = NULL;
        !          7707: 
        !          7708:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          7709:                XML_SCHEMAP_SRC_REDEFINE, node, NULL,
        !          7710:                "The redefining attribute group definition "
        !          7711:                "'%s' must not contain more than one "
        !          7712:                "reference to the redefined definition",
        !          7713:                xmlSchemaFormatQName(&str, refNs, ref), NULL);
        !          7714:            FREE_AND_NULL(str);
        !          7715:            return(NULL);
        !          7716:        }
        !          7717:        pctxt->redefCounter++;
        !          7718:        /*
        !          7719:        * URGENT TODO: How to ensure that the reference will not be
        !          7720:        * handled by the normal component resolution mechanism?
        !          7721:        */
        !          7722:        ret = xmlSchemaNewQNameRef(pctxt,
        !          7723:            XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
        !          7724:        if (ret == NULL)
        !          7725:            return(NULL);
        !          7726:        ret->node = node;
        !          7727:        pctxt->redef->reference = WXS_BASIC_CAST ret;
        !          7728:     } else {
        !          7729:        /*
        !          7730:        * Create a QName-reference helper component. We will substitute this
        !          7731:        * component for the attribute uses of the referenced attribute group
        !          7732:        * definition.
        !          7733:        */
        !          7734:        ret = xmlSchemaNewQNameRef(pctxt,
        !          7735:            XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
        !          7736:        if (ret == NULL)
        !          7737:            return(NULL);
        !          7738:        ret->node = node;
        !          7739:        /* Add to pending items, to be able to resolve the reference. */
        !          7740:        WXS_ADD_PENDING(pctxt, ret);
        !          7741:     }
        !          7742:     return (ret);
        !          7743: }
        !          7744: 
        !          7745: /**
        !          7746:  * xmlSchemaParseAttributeGroupDefinition:
        !          7747:  * @pctxt:  a schema validation context
        !          7748:  * @schema:  the schema being built
        !          7749:  * @node:  a subtree containing XML Schema informations
        !          7750:  *
        !          7751:  * parse a XML schema Attribute Group declaration
        !          7752:  * *WARNING* this interface is highly subject to change
        !          7753:  *
        !          7754:  * Returns the attribute group definition or NULL in case of error.
        !          7755:  */
        !          7756: static xmlSchemaAttributeGroupPtr
        !          7757: xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
        !          7758:                                       xmlSchemaPtr schema,
        !          7759:                                       xmlNodePtr node)
        !          7760: {
        !          7761:     const xmlChar *name;
        !          7762:     xmlSchemaAttributeGroupPtr ret;
        !          7763:     xmlNodePtr child = NULL;
        !          7764:     xmlAttrPtr attr;
        !          7765:     int hasRefs = 0;
        !          7766: 
        !          7767:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          7768:         return (NULL);
        !          7769: 
        !          7770:     attr = xmlSchemaGetPropNode(node, "name");
        !          7771:     if (attr == NULL) {
        !          7772:        xmlSchemaPMissingAttrErr(pctxt,
        !          7773:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          7774:            NULL, node, "name", NULL);
        !          7775:        return (NULL);
        !          7776:     }
        !          7777:     /*
        !          7778:     * The name is crucial, exit if invalid.
        !          7779:     */
        !          7780:     if (xmlSchemaPValAttrNode(pctxt,
        !          7781:        NULL, attr,
        !          7782:        xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
        !          7783:        return (NULL);
        !          7784:     }
        !          7785:     ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema,
        !          7786:        name, pctxt->targetNamespace, node);
        !          7787:     if (ret == NULL)
        !          7788:        return (NULL);
        !          7789:     /*
        !          7790:     * Check for illegal attributes.
        !          7791:     */
        !          7792:     attr = node->properties;
        !          7793:     while (attr != NULL) {
        !          7794:        if (attr->ns == NULL) {
        !          7795:            if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          7796:                (!xmlStrEqual(attr->name, BAD_CAST "id")))
        !          7797:            {
        !          7798:                xmlSchemaPIllegalAttrErr(pctxt,
        !          7799:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7800:            }
        !          7801:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          7802:            xmlSchemaPIllegalAttrErr(pctxt,
        !          7803:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          7804:        }
        !          7805:        attr = attr->next;
        !          7806:     }
        !          7807:     /* Attribute ID */
        !          7808:     xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
        !          7809:     /*
        !          7810:     * And now for the children...
        !          7811:     */
        !          7812:     child = node->children;
        !          7813:     if (IS_SCHEMA(child, "annotation")) {
        !          7814:         ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
        !          7815:         child = child->next;
        !          7816:     }
        !          7817:     /*
        !          7818:     * Parse contained attribute decls/refs.
        !          7819:     */
        !          7820:     if (xmlSchemaParseLocalAttributes(pctxt, schema, &child,
        !          7821:        (xmlSchemaItemListPtr *) &(ret->attrUses),
        !          7822:        XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
        !          7823:        return(NULL);
        !          7824:     if (hasRefs)
        !          7825:        ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
        !          7826:     /*
        !          7827:     * Parse the attribute wildcard.
        !          7828:     */
        !          7829:     if (IS_SCHEMA(child, "anyAttribute")) {
        !          7830:        ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
        !          7831:            schema, child);
        !          7832:        child = child->next;
        !          7833:     }
        !          7834:     if (child != NULL) {
        !          7835:        xmlSchemaPContentErr(pctxt,
        !          7836:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          7837:            NULL, node, child, NULL,
        !          7838:            "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
        !          7839:     }
        !          7840:     return (ret);
        !          7841: }
        !          7842: 
        !          7843: /**
        !          7844:  * xmlSchemaPValAttrFormDefault:
        !          7845:  * @value:  the value
        !          7846:  * @flags: the flags to be modified
        !          7847:  * @flagQualified: the specific flag for "qualified"
        !          7848:  *
        !          7849:  * Returns 0 if the value is valid, 1 otherwise.
        !          7850:  */
        !          7851: static int
        !          7852: xmlSchemaPValAttrFormDefault(const xmlChar *value,
        !          7853:                             int *flags,
        !          7854:                             int flagQualified)
        !          7855: {
        !          7856:     if (xmlStrEqual(value, BAD_CAST "qualified")) {
        !          7857:        if  ((*flags & flagQualified) == 0)
        !          7858:            *flags |= flagQualified;
        !          7859:     } else if (!xmlStrEqual(value, BAD_CAST "unqualified"))
        !          7860:        return (1);
        !          7861: 
        !          7862:     return (0);
        !          7863: }
        !          7864: 
        !          7865: /**
        !          7866:  * xmlSchemaPValAttrBlockFinal:
        !          7867:  * @value:  the value
        !          7868:  * @flags: the flags to be modified
        !          7869:  * @flagAll: the specific flag for "#all"
        !          7870:  * @flagExtension: the specific flag for "extension"
        !          7871:  * @flagRestriction: the specific flag for "restriction"
        !          7872:  * @flagSubstitution: the specific flag for "substitution"
        !          7873:  * @flagList: the specific flag for "list"
        !          7874:  * @flagUnion: the specific flag for "union"
        !          7875:  *
        !          7876:  * Validates the value of the attribute "final" and "block". The value
        !          7877:  * is converted into the specified flag values and returned in @flags.
        !          7878:  *
        !          7879:  * Returns 0 if the value is valid, 1 otherwise.
        !          7880:  */
        !          7881: 
        !          7882: static int
        !          7883: xmlSchemaPValAttrBlockFinal(const xmlChar *value,
        !          7884:                            int *flags,
        !          7885:                            int flagAll,
        !          7886:                            int flagExtension,
        !          7887:                            int flagRestriction,
        !          7888:                            int flagSubstitution,
        !          7889:                            int flagList,
        !          7890:                            int flagUnion)
        !          7891: {
        !          7892:     int ret = 0;
        !          7893: 
        !          7894:     /*
        !          7895:     * TODO: This does not check for dublicate entries.
        !          7896:     */
        !          7897:     if ((flags == NULL) || (value == NULL))
        !          7898:        return (-1);
        !          7899:     if (value[0] == 0)
        !          7900:        return (0);
        !          7901:     if (xmlStrEqual(value, BAD_CAST "#all")) {
        !          7902:        if (flagAll != -1)
        !          7903:            *flags |= flagAll;
        !          7904:        else {
        !          7905:            if (flagExtension != -1)
        !          7906:                *flags |= flagExtension;
        !          7907:            if (flagRestriction != -1)
        !          7908:                *flags |= flagRestriction;
        !          7909:            if (flagSubstitution != -1)
        !          7910:                *flags |= flagSubstitution;
        !          7911:            if (flagList != -1)
        !          7912:                *flags |= flagList;
        !          7913:            if (flagUnion != -1)
        !          7914:                *flags |= flagUnion;
        !          7915:        }
        !          7916:     } else {
        !          7917:        const xmlChar *end, *cur = value;
        !          7918:        xmlChar *item;
        !          7919: 
        !          7920:        do {
        !          7921:            while (IS_BLANK_CH(*cur))
        !          7922:                cur++;
        !          7923:            end = cur;
        !          7924:            while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          7925:                end++;
        !          7926:            if (end == cur)
        !          7927:                break;
        !          7928:            item = xmlStrndup(cur, end - cur);
        !          7929:            if (xmlStrEqual(item, BAD_CAST "extension")) {
        !          7930:                if (flagExtension != -1) {
        !          7931:                    if ((*flags & flagExtension) == 0)
        !          7932:                        *flags |= flagExtension;
        !          7933:                } else
        !          7934:                    ret = 1;
        !          7935:            } else if (xmlStrEqual(item, BAD_CAST "restriction")) {
        !          7936:                if (flagRestriction != -1) {
        !          7937:                    if ((*flags & flagRestriction) == 0)
        !          7938:                        *flags |= flagRestriction;
        !          7939:                } else
        !          7940:                    ret = 1;
        !          7941:            } else if (xmlStrEqual(item, BAD_CAST "substitution")) {
        !          7942:                if (flagSubstitution != -1) {
        !          7943:                    if ((*flags & flagSubstitution) == 0)
        !          7944:                        *flags |= flagSubstitution;
        !          7945:                } else
        !          7946:                    ret = 1;
        !          7947:            } else if (xmlStrEqual(item, BAD_CAST "list")) {
        !          7948:                if (flagList != -1) {
        !          7949:                    if ((*flags & flagList) == 0)
        !          7950:                        *flags |= flagList;
        !          7951:                } else
        !          7952:                    ret = 1;
        !          7953:            } else if (xmlStrEqual(item, BAD_CAST "union")) {
        !          7954:                if (flagUnion != -1) {
        !          7955:                    if ((*flags & flagUnion) == 0)
        !          7956:                        *flags |= flagUnion;
        !          7957:                } else
        !          7958:                    ret = 1;
        !          7959:            } else
        !          7960:                ret = 1;
        !          7961:            if (item != NULL)
        !          7962:                xmlFree(item);
        !          7963:            cur = end;
        !          7964:        } while ((ret == 0) && (*cur != 0));
        !          7965:     }
        !          7966: 
        !          7967:     return (ret);
        !          7968: }
        !          7969: 
        !          7970: static int
        !          7971: xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
        !          7972:                             xmlSchemaIDCPtr idc,
        !          7973:                             xmlSchemaIDCSelectPtr selector,
        !          7974:                             xmlAttrPtr attr,
        !          7975:                             int isField)
        !          7976: {
        !          7977:     xmlNodePtr node;
        !          7978: 
        !          7979:     /*
        !          7980:     * c-selector-xpath:
        !          7981:     * Schema Component Constraint: Selector Value OK
        !          7982:     *
        !          7983:     * TODO: 1 The {selector} must be a valid XPath expression, as defined
        !          7984:     * in [XPath].
        !          7985:     */
        !          7986:     if (selector == NULL) {
        !          7987:        xmlSchemaPErr(ctxt, idc->node,
        !          7988:            XML_SCHEMAP_INTERNAL,
        !          7989:            "Internal error: xmlSchemaCheckCSelectorXPath, "
        !          7990:            "the selector is not specified.\n", NULL, NULL);
        !          7991:        return (-1);
        !          7992:     }
        !          7993:     if (attr == NULL)
        !          7994:        node = idc->node;
        !          7995:     else
        !          7996:        node = (xmlNodePtr) attr;
        !          7997:     if (selector->xpath == NULL) {
        !          7998:        xmlSchemaPCustomErr(ctxt,
        !          7999:            /* TODO: Adjust error code. */
        !          8000:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          8001:            NULL, node,
        !          8002:            "The XPath expression of the selector is not valid", NULL);
        !          8003:        return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
        !          8004:     } else {
        !          8005:        const xmlChar **nsArray = NULL;
        !          8006:        xmlNsPtr *nsList = NULL;
        !          8007:        /*
        !          8008:        * Compile the XPath expression.
        !          8009:        */
        !          8010:        /*
        !          8011:        * TODO: We need the array of in-scope namespaces for compilation.
        !          8012:        * TODO: Call xmlPatterncompile with different options for selector/
        !          8013:        * field.
        !          8014:        */
        !          8015:        if (attr == NULL)
        !          8016:            nsList = NULL;
        !          8017:        else
        !          8018:            nsList = xmlGetNsList(attr->doc, attr->parent);
        !          8019:        /*
        !          8020:        * Build an array of prefixes and namespaces.
        !          8021:        */
        !          8022:        if (nsList != NULL) {
        !          8023:            int i, count = 0;
        !          8024: 
        !          8025:            for (i = 0; nsList[i] != NULL; i++)
        !          8026:                count++;
        !          8027: 
        !          8028:            nsArray = (const xmlChar **) xmlMalloc(
        !          8029:                (count * 2 + 1) * sizeof(const xmlChar *));
        !          8030:            if (nsArray == NULL) {
        !          8031:                xmlSchemaPErrMemory(ctxt, "allocating a namespace array",
        !          8032:                    NULL);
        !          8033:                xmlFree(nsList);
        !          8034:                return (-1);
        !          8035:            }
        !          8036:            for (i = 0; i < count; i++) {
        !          8037:                nsArray[2 * i] = nsList[i]->href;
        !          8038:                nsArray[2 * i + 1] = nsList[i]->prefix;
        !          8039:            }
        !          8040:            nsArray[count * 2] = NULL;
        !          8041:            xmlFree(nsList);
        !          8042:        }
        !          8043:        /*
        !          8044:        * TODO: Differentiate between "selector" and "field".
        !          8045:        */
        !          8046:        if (isField)
        !          8047:            selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
        !          8048:                NULL, XML_PATTERN_XSFIELD, nsArray);
        !          8049:        else
        !          8050:            selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
        !          8051:                NULL, XML_PATTERN_XSSEL, nsArray);
        !          8052:        if (nsArray != NULL)
        !          8053:            xmlFree((xmlChar **) nsArray);
        !          8054: 
        !          8055:        if (selector->xpathComp == NULL) {
        !          8056:            xmlSchemaPCustomErr(ctxt,
        !          8057:                /* TODO: Adjust error code? */
        !          8058:                XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          8059:                NULL, node,
        !          8060:                "The XPath expression '%s' could not be "
        !          8061:                "compiled", selector->xpath);
        !          8062:            return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
        !          8063:        }
        !          8064:     }
        !          8065:     return (0);
        !          8066: }
        !          8067: 
        !          8068: #define ADD_ANNOTATION(annot)   \
        !          8069:     xmlSchemaAnnotPtr cur = item->annot; \
        !          8070:     if (item->annot == NULL) {  \
        !          8071:        item->annot = annot;    \
        !          8072:        return (annot);         \
        !          8073:     }                           \
        !          8074:     cur = item->annot;          \
        !          8075:     if (cur->next != NULL) {    \
        !          8076:        cur = cur->next;        \
        !          8077:     }                           \
        !          8078:     cur->next = annot;
        !          8079: 
        !          8080: /**
        !          8081:  * xmlSchemaAssignAnnotation:
        !          8082:  * @item: the schema component
        !          8083:  * @annot: the annotation
        !          8084:  *
        !          8085:  * Adds the annotation to the given schema component.
        !          8086:  *
        !          8087:  * Returns the given annotaion.
        !          8088:  */
        !          8089: static xmlSchemaAnnotPtr
        !          8090: xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
        !          8091:                       xmlSchemaAnnotPtr annot)
        !          8092: {
        !          8093:     if ((annItem == NULL) || (annot == NULL))
        !          8094:        return (NULL);
        !          8095:     switch (annItem->type) {
        !          8096:        case XML_SCHEMA_TYPE_ELEMENT: {
        !          8097:                xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem;
        !          8098:                ADD_ANNOTATION(annot)
        !          8099:            }
        !          8100:            break;
        !          8101:        case XML_SCHEMA_TYPE_ATTRIBUTE: {
        !          8102:                xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem;
        !          8103:                ADD_ANNOTATION(annot)
        !          8104:            }
        !          8105:            break;
        !          8106:        case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
        !          8107:        case XML_SCHEMA_TYPE_ANY: {
        !          8108:                xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem;
        !          8109:                ADD_ANNOTATION(annot)
        !          8110:            }
        !          8111:            break;
        !          8112:        case XML_SCHEMA_TYPE_PARTICLE:
        !          8113:        case XML_SCHEMA_TYPE_IDC_KEY:
        !          8114:        case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          8115:        case XML_SCHEMA_TYPE_IDC_UNIQUE: {
        !          8116:                xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem;
        !          8117:                ADD_ANNOTATION(annot)
        !          8118:            }
        !          8119:            break;
        !          8120:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
        !          8121:                xmlSchemaAttributeGroupPtr item =
        !          8122:                    (xmlSchemaAttributeGroupPtr) annItem;
        !          8123:                ADD_ANNOTATION(annot)
        !          8124:            }
        !          8125:            break;
        !          8126:        case XML_SCHEMA_TYPE_NOTATION: {
        !          8127:                xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem;
        !          8128:                ADD_ANNOTATION(annot)
        !          8129:            }
        !          8130:            break;
        !          8131:        case XML_SCHEMA_FACET_MININCLUSIVE:
        !          8132:        case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          8133:        case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          8134:        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          8135:        case XML_SCHEMA_FACET_TOTALDIGITS:
        !          8136:        case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          8137:        case XML_SCHEMA_FACET_PATTERN:
        !          8138:        case XML_SCHEMA_FACET_ENUMERATION:
        !          8139:        case XML_SCHEMA_FACET_WHITESPACE:
        !          8140:        case XML_SCHEMA_FACET_LENGTH:
        !          8141:        case XML_SCHEMA_FACET_MAXLENGTH:
        !          8142:        case XML_SCHEMA_FACET_MINLENGTH: {
        !          8143:                xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem;
        !          8144:                ADD_ANNOTATION(annot)
        !          8145:            }
        !          8146:            break;
        !          8147:        case XML_SCHEMA_TYPE_SIMPLE:
        !          8148:        case XML_SCHEMA_TYPE_COMPLEX: {
        !          8149:                xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem;
        !          8150:                ADD_ANNOTATION(annot)
        !          8151:            }
        !          8152:            break;
        !          8153:        case XML_SCHEMA_TYPE_GROUP: {
        !          8154:                xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem;
        !          8155:                ADD_ANNOTATION(annot)
        !          8156:            }
        !          8157:            break;
        !          8158:        case XML_SCHEMA_TYPE_SEQUENCE:
        !          8159:        case XML_SCHEMA_TYPE_CHOICE:
        !          8160:        case XML_SCHEMA_TYPE_ALL: {
        !          8161:                xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem;
        !          8162:                ADD_ANNOTATION(annot)
        !          8163:            }
        !          8164:            break;
        !          8165:        default:
        !          8166:             xmlSchemaPCustomErr(NULL,
        !          8167:                XML_SCHEMAP_INTERNAL,
        !          8168:                NULL, NULL,
        !          8169:                "Internal error: xmlSchemaAddAnnotation, "
        !          8170:                "The item is not a annotated schema component", NULL);
        !          8171:             break;
        !          8172:     }
        !          8173:     return (annot);
        !          8174: }
        !          8175: 
        !          8176: /**
        !          8177:  * xmlSchemaParseIDCSelectorAndField:
        !          8178:  * @ctxt:  a schema validation context
        !          8179:  * @schema:  the schema being built
        !          8180:  * @node:  a subtree containing XML Schema informations
        !          8181:  *
        !          8182:  * Parses a XML Schema identity-contraint definition's
        !          8183:  * <selector> and <field> elements.
        !          8184:  *
        !          8185:  * Returns the parsed identity-constraint definition.
        !          8186:  */
        !          8187: static xmlSchemaIDCSelectPtr
        !          8188: xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
        !          8189:                          xmlSchemaIDCPtr idc,
        !          8190:                          xmlNodePtr node,
        !          8191:                          int isField)
        !          8192: {
        !          8193:     xmlSchemaIDCSelectPtr item;
        !          8194:     xmlNodePtr child = NULL;
        !          8195:     xmlAttrPtr attr;
        !          8196: 
        !          8197:     /*
        !          8198:     * Check for illegal attributes.
        !          8199:     */
        !          8200:     attr = node->properties;
        !          8201:     while (attr != NULL) {
        !          8202:        if (attr->ns == NULL) {
        !          8203:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          8204:                (!xmlStrEqual(attr->name, BAD_CAST "xpath"))) {
        !          8205:                xmlSchemaPIllegalAttrErr(ctxt,
        !          8206:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8207:            }
        !          8208:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          8209:            xmlSchemaPIllegalAttrErr(ctxt,
        !          8210:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8211:        }
        !          8212:        attr = attr->next;
        !          8213:     }
        !          8214:     /*
        !          8215:     * Create the item.
        !          8216:     */
        !          8217:     item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect));
        !          8218:     if (item == NULL) {
        !          8219:         xmlSchemaPErrMemory(ctxt,
        !          8220:            "allocating a 'selector' of an identity-constraint definition",
        !          8221:            NULL);
        !          8222:         return (NULL);
        !          8223:     }
        !          8224:     memset(item, 0, sizeof(xmlSchemaIDCSelect));
        !          8225:     /*
        !          8226:     * Attribute "xpath" (mandatory).
        !          8227:     */
        !          8228:     attr = xmlSchemaGetPropNode(node, "xpath");
        !          8229:     if (attr == NULL) {
        !          8230:        xmlSchemaPMissingAttrErr(ctxt,
        !          8231:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          8232:            NULL, node,
        !          8233:            "name", NULL);
        !          8234:     } else {
        !          8235:        item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8236:        /*
        !          8237:        * URGENT TODO: "field"s have an other syntax than "selector"s.
        !          8238:        */
        !          8239: 
        !          8240:        if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr,
        !          8241:            isField) == -1) {
        !          8242:            xmlSchemaPErr(ctxt,
        !          8243:                (xmlNodePtr) attr,
        !          8244:                XML_SCHEMAP_INTERNAL,
        !          8245:                "Internal error: xmlSchemaParseIDCSelectorAndField, "
        !          8246:                "validating the XPath expression of a IDC selector.\n",
        !          8247:                NULL, NULL);
        !          8248:        }
        !          8249: 
        !          8250:     }
        !          8251:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          8252:     /*
        !          8253:     * And now for the children...
        !          8254:     */
        !          8255:     child = node->children;
        !          8256:     if (IS_SCHEMA(child, "annotation")) {
        !          8257:        /*
        !          8258:        * Add the annotation to the parent IDC.
        !          8259:        */
        !          8260:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
        !          8261:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          8262:        child = child->next;
        !          8263:     }
        !          8264:     if (child != NULL) {
        !          8265:        xmlSchemaPContentErr(ctxt,
        !          8266:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8267:            NULL, node, child,
        !          8268:            NULL, "(annotation?)");
        !          8269:     }
        !          8270: 
        !          8271:     return (item);
        !          8272: }
        !          8273: 
        !          8274: /**
        !          8275:  * xmlSchemaParseIDC:
        !          8276:  * @ctxt:  a schema validation context
        !          8277:  * @schema:  the schema being built
        !          8278:  * @node:  a subtree containing XML Schema informations
        !          8279:  *
        !          8280:  * Parses a XML Schema identity-contraint definition.
        !          8281:  *
        !          8282:  * Returns the parsed identity-constraint definition.
        !          8283:  */
        !          8284: static xmlSchemaIDCPtr
        !          8285: xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
        !          8286:                  xmlSchemaPtr schema,
        !          8287:                  xmlNodePtr node,
        !          8288:                  xmlSchemaTypeType idcCategory,
        !          8289:                  const xmlChar *targetNamespace)
        !          8290: {
        !          8291:     xmlSchemaIDCPtr item = NULL;
        !          8292:     xmlNodePtr child = NULL;
        !          8293:     xmlAttrPtr attr;
        !          8294:     const xmlChar *name = NULL;
        !          8295:     xmlSchemaIDCSelectPtr field = NULL, lastField = NULL;
        !          8296: 
        !          8297:     /*
        !          8298:     * Check for illegal attributes.
        !          8299:     */
        !          8300:     attr = node->properties;
        !          8301:     while (attr != NULL) {
        !          8302:        if (attr->ns == NULL) {
        !          8303:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          8304:                (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          8305:                ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
        !          8306:                 (!xmlStrEqual(attr->name, BAD_CAST "refer")))) {
        !          8307:                xmlSchemaPIllegalAttrErr(ctxt,
        !          8308:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8309:            }
        !          8310:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          8311:            xmlSchemaPIllegalAttrErr(ctxt,
        !          8312:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8313:        }
        !          8314:        attr = attr->next;
        !          8315:     }
        !          8316:     /*
        !          8317:     * Attribute "name" (mandatory).
        !          8318:     */
        !          8319:     attr = xmlSchemaGetPropNode(node, "name");
        !          8320:     if (attr == NULL) {
        !          8321:        xmlSchemaPMissingAttrErr(ctxt,
        !          8322:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          8323:            NULL, node,
        !          8324:            "name", NULL);
        !          8325:        return (NULL);
        !          8326:     } else if (xmlSchemaPValAttrNode(ctxt,
        !          8327:        NULL, attr,
        !          8328:        xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
        !          8329:        return (NULL);
        !          8330:     }
        !          8331:     /* Create the component. */
        !          8332:     item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace,
        !          8333:        idcCategory, node);
        !          8334:     if (item == NULL)
        !          8335:        return(NULL);
        !          8336: 
        !          8337:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          8338:     if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          8339:        /*
        !          8340:        * Attribute "refer" (mandatory).
        !          8341:        */
        !          8342:        attr = xmlSchemaGetPropNode(node, "refer");
        !          8343:        if (attr == NULL) {
        !          8344:            xmlSchemaPMissingAttrErr(ctxt,
        !          8345:                XML_SCHEMAP_S4S_ATTR_MISSING,
        !          8346:                NULL, node,
        !          8347:                "refer", NULL);
        !          8348:        } else {
        !          8349:            /*
        !          8350:            * Create a reference item.
        !          8351:            */
        !          8352:            item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
        !          8353:                NULL, NULL);
        !          8354:            if (item->ref == NULL)
        !          8355:                return (NULL);
        !          8356:            xmlSchemaPValAttrNodeQName(ctxt, schema,
        !          8357:                NULL, attr,
        !          8358:                &(item->ref->targetNamespace),
        !          8359:                &(item->ref->name));
        !          8360:            xmlSchemaCheckReference(ctxt, schema, node, attr,
        !          8361:                item->ref->targetNamespace);
        !          8362:        }
        !          8363:     }
        !          8364:     /*
        !          8365:     * And now for the children...
        !          8366:     */
        !          8367:     child = node->children;
        !          8368:     if (IS_SCHEMA(child, "annotation")) {
        !          8369:        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          8370:        child = child->next;
        !          8371:     }
        !          8372:     if (child == NULL) {
        !          8373:        xmlSchemaPContentErr(ctxt,
        !          8374:                XML_SCHEMAP_S4S_ELEM_MISSING,
        !          8375:                NULL, node, child,
        !          8376:                "A child element is missing",
        !          8377:                "(annotation?, (selector, field+))");
        !          8378:     }
        !          8379:     /*
        !          8380:     * Child element <selector>.
        !          8381:     */
        !          8382:     if (IS_SCHEMA(child, "selector")) {
        !          8383:        item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
        !          8384:            item, child, 0);
        !          8385:        child = child->next;
        !          8386:        /*
        !          8387:        * Child elements <field>.
        !          8388:        */
        !          8389:        if (IS_SCHEMA(child, "field")) {
        !          8390:            do {
        !          8391:                field = xmlSchemaParseIDCSelectorAndField(ctxt,
        !          8392:                    item, child, 1);
        !          8393:                if (field != NULL) {
        !          8394:                    field->index = item->nbFields;
        !          8395:                    item->nbFields++;
        !          8396:                    if (lastField != NULL)
        !          8397:                        lastField->next = field;
        !          8398:                    else
        !          8399:                        item->fields = field;
        !          8400:                    lastField = field;
        !          8401:                }
        !          8402:                child = child->next;
        !          8403:            } while (IS_SCHEMA(child, "field"));
        !          8404:        } else {
        !          8405:            xmlSchemaPContentErr(ctxt,
        !          8406:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8407:                NULL, node, child,
        !          8408:                NULL, "(annotation?, (selector, field+))");
        !          8409:        }
        !          8410:     }
        !          8411:     if (child != NULL) {
        !          8412:        xmlSchemaPContentErr(ctxt,
        !          8413:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8414:            NULL, node, child,
        !          8415:            NULL, "(annotation?, (selector, field+))");
        !          8416:     }
        !          8417: 
        !          8418:     return (item);
        !          8419: }
        !          8420: 
        !          8421: /**
        !          8422:  * xmlSchemaParseElement:
        !          8423:  * @ctxt:  a schema validation context
        !          8424:  * @schema:  the schema being built
        !          8425:  * @node:  a subtree containing XML Schema informations
        !          8426:  * @topLevel: indicates if this is global declaration
        !          8427:  *
        !          8428:  * Parses a XML schema element declaration.
        !          8429:  * *WARNING* this interface is highly subject to change
        !          8430:  *
        !          8431:  * Returns the element declaration or a particle; NULL in case
        !          8432:  * of an error or if the particle has minOccurs==maxOccurs==0.
        !          8433:  */
        !          8434: static xmlSchemaBasicItemPtr
        !          8435: xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          8436:                       xmlNodePtr node, int *isElemRef, int topLevel)
        !          8437: {
        !          8438:     xmlSchemaElementPtr decl = NULL;
        !          8439:     xmlSchemaParticlePtr particle = NULL;
        !          8440:     xmlSchemaAnnotPtr annot = NULL;
        !          8441:     xmlNodePtr child = NULL;
        !          8442:     xmlAttrPtr attr, nameAttr;
        !          8443:     int min, max, isRef = 0;
        !          8444:     xmlChar *des = NULL;
        !          8445: 
        !          8446:     /* 3.3.3 Constraints on XML Representations of Element Declarations */
        !          8447:     /* TODO: Complete implementation of 3.3.6 */
        !          8448: 
        !          8449:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          8450:         return (NULL);
        !          8451: 
        !          8452:     if (isElemRef != NULL)
        !          8453:        *isElemRef = 0;
        !          8454:     /*
        !          8455:     * If we get a "ref" attribute on a local <element> we will assume it's
        !          8456:     * a reference - even if there's a "name" attribute; this seems to be more
        !          8457:     * robust.
        !          8458:     */
        !          8459:     nameAttr = xmlSchemaGetPropNode(node, "name");
        !          8460:     attr = xmlSchemaGetPropNode(node, "ref");
        !          8461:     if ((topLevel) || (attr == NULL)) {
        !          8462:        if (nameAttr == NULL) {
        !          8463:            xmlSchemaPMissingAttrErr(ctxt,
        !          8464:                XML_SCHEMAP_S4S_ATTR_MISSING,
        !          8465:                NULL, node, "name", NULL);
        !          8466:            return (NULL);
        !          8467:        }
        !          8468:     } else
        !          8469:        isRef = 1;
        !          8470: 
        !          8471:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          8472:     child = node->children;
        !          8473:     if (IS_SCHEMA(child, "annotation")) {
        !          8474:        annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          8475:        child = child->next;
        !          8476:     }
        !          8477:     /*
        !          8478:     * Skip particle part if a global declaration.
        !          8479:     */
        !          8480:     if (topLevel)
        !          8481:        goto declaration_part;
        !          8482:     /*
        !          8483:     * The particle part ==================================================
        !          8484:     */
        !          8485:     min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
        !          8486:     max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)");
        !          8487:     xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
        !          8488:     particle = xmlSchemaAddParticle(ctxt, node, min, max);
        !          8489:     if (particle == NULL)
        !          8490:        goto return_null;
        !          8491: 
        !          8492:     /* ret->flags |= XML_SCHEMAS_ELEM_REF; */
        !          8493: 
        !          8494:     if (isRef) {
        !          8495:        const xmlChar *refNs = NULL, *ref = NULL;
        !          8496:        xmlSchemaQNameRefPtr refer = NULL;
        !          8497:        /*
        !          8498:        * The reference part =============================================
        !          8499:        */
        !          8500:        if (isElemRef != NULL)
        !          8501:            *isElemRef = 1;
        !          8502: 
        !          8503:        xmlSchemaPValAttrNodeQName(ctxt, schema,
        !          8504:            NULL, attr, &refNs, &ref);
        !          8505:        xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
        !          8506:        /*
        !          8507:        * SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both"
        !          8508:        */
        !          8509:        if (nameAttr != NULL) {
        !          8510:            xmlSchemaPMutualExclAttrErr(ctxt,
        !          8511:                XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name");
        !          8512:        }
        !          8513:        /*
        !          8514:        * Check for illegal attributes.
        !          8515:        */
        !          8516:        attr = node->properties;
        !          8517:        while (attr != NULL) {
        !          8518:            if (attr->ns == NULL) {
        !          8519:                if (xmlStrEqual(attr->name, BAD_CAST "ref") ||
        !          8520:                    xmlStrEqual(attr->name, BAD_CAST "name") ||
        !          8521:                    xmlStrEqual(attr->name, BAD_CAST "id") ||
        !          8522:                    xmlStrEqual(attr->name, BAD_CAST "maxOccurs") ||
        !          8523:                    xmlStrEqual(attr->name, BAD_CAST "minOccurs"))
        !          8524:                {
        !          8525:                    attr = attr->next;
        !          8526:                    continue;
        !          8527:                } else {
        !          8528:                    /* SPEC (3.3.3 : 2.2) */
        !          8529:                    xmlSchemaPCustomAttrErr(ctxt,
        !          8530:                        XML_SCHEMAP_SRC_ELEMENT_2_2,
        !          8531:                        NULL, NULL, attr,
        !          8532:                        "Only the attributes 'minOccurs', 'maxOccurs' and "
        !          8533:                        "'id' are allowed in addition to 'ref'");
        !          8534:                    break;
        !          8535:                }
        !          8536:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          8537:                xmlSchemaPIllegalAttrErr(ctxt,
        !          8538:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8539:            }
        !          8540:            attr = attr->next;
        !          8541:        }
        !          8542:        /*
        !          8543:        * No children except <annotation> expected.
        !          8544:        */
        !          8545:        if (child != NULL) {
        !          8546:            xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8547:                NULL, node, child, NULL, "(annotation?)");
        !          8548:        }
        !          8549:        if ((min == 0) && (max == 0))
        !          8550:            goto return_null;
        !          8551:        /*
        !          8552:        * Create the reference item and attach it to the particle.
        !          8553:        */
        !          8554:        refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
        !          8555:            ref, refNs);
        !          8556:        if (refer == NULL)
        !          8557:            goto return_null;
        !          8558:        particle->children = (xmlSchemaTreeItemPtr) refer;
        !          8559:        particle->annot = annot;
        !          8560:        /*
        !          8561:        * Add the particle to pending components, since the reference
        !          8562:        * need to be resolved.
        !          8563:        */
        !          8564:        WXS_ADD_PENDING(ctxt, particle);
        !          8565:        return ((xmlSchemaBasicItemPtr) particle);
        !          8566:     }
        !          8567:     /*
        !          8568:     * The declaration part ===============================================
        !          8569:     */
        !          8570: declaration_part:
        !          8571:     {
        !          8572:        const xmlChar *ns = NULL, *fixed, *name, *attrValue;
        !          8573:        xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL;
        !          8574: 
        !          8575:        if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr,
        !          8576:            xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0)
        !          8577:            goto return_null;
        !          8578:        /*
        !          8579:        * Evaluate the target namespace.
        !          8580:        */
        !          8581:        if (topLevel) {
        !          8582:            ns = ctxt->targetNamespace;
        !          8583:        } else {
        !          8584:            attr = xmlSchemaGetPropNode(node, "form");
        !          8585:            if (attr != NULL) {
        !          8586:                attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8587:                if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
        !          8588:                    ns = ctxt->targetNamespace;
        !          8589:                } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) {
        !          8590:                    xmlSchemaPSimpleTypeErr(ctxt,
        !          8591:                        XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          8592:                        NULL, (xmlNodePtr) attr,
        !          8593:                        NULL, "(qualified | unqualified)",
        !          8594:                        attrValue, NULL, NULL, NULL);
        !          8595:                }
        !          8596:            } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
        !          8597:                ns = ctxt->targetNamespace;
        !          8598:        }
        !          8599:        decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel);
        !          8600:        if (decl == NULL) {
        !          8601:            goto return_null;
        !          8602:        }
        !          8603:        /*
        !          8604:        * Check for illegal attributes.
        !          8605:        */
        !          8606:        attr = node->properties;
        !          8607:        while (attr != NULL) {
        !          8608:            if (attr->ns == NULL) {
        !          8609:                if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          8610:                    (!xmlStrEqual(attr->name, BAD_CAST "type")) &&
        !          8611:                    (!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          8612:                    (!xmlStrEqual(attr->name, BAD_CAST "default")) &&
        !          8613:                    (!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
        !          8614:                    (!xmlStrEqual(attr->name, BAD_CAST "block")) &&
        !          8615:                    (!xmlStrEqual(attr->name, BAD_CAST "nillable")))
        !          8616:                {
        !          8617:                    if (topLevel == 0) {
        !          8618:                        if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
        !          8619:                            (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
        !          8620:                            (!xmlStrEqual(attr->name, BAD_CAST "form")))
        !          8621:                        {
        !          8622:                            xmlSchemaPIllegalAttrErr(ctxt,
        !          8623:                                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8624:                        }
        !          8625:                    } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) &&
        !          8626:                        (!xmlStrEqual(attr->name, BAD_CAST "abstract")) &&
        !          8627:                        (!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) {
        !          8628: 
        !          8629:                        xmlSchemaPIllegalAttrErr(ctxt,
        !          8630:                            XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8631:                    }
        !          8632:                }
        !          8633:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          8634: 
        !          8635:                xmlSchemaPIllegalAttrErr(ctxt,
        !          8636:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8637:            }
        !          8638:            attr = attr->next;
        !          8639:        }
        !          8640:        /*
        !          8641:        * Extract/validate attributes.
        !          8642:        */
        !          8643:        if (topLevel) {
        !          8644:            /*
        !          8645:            * Process top attributes of global element declarations here.
        !          8646:            */
        !          8647:            decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
        !          8648:            decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
        !          8649:            xmlSchemaPValAttrQName(ctxt, schema,
        !          8650:                NULL, node, "substitutionGroup",
        !          8651:                &(decl->substGroupNs), &(decl->substGroup));
        !          8652:            if (xmlGetBooleanProp(ctxt, node, "abstract", 0))
        !          8653:                decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
        !          8654:            /*
        !          8655:            * Attribute "final".
        !          8656:            */
        !          8657:            attr = xmlSchemaGetPropNode(node, "final");
        !          8658:            if (attr == NULL) {
        !          8659:                if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
        !          8660:                    decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
        !          8661:                if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
        !          8662:                    decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
        !          8663:            } else {
        !          8664:                attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8665:                if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
        !          8666:                    -1,
        !          8667:                    XML_SCHEMAS_ELEM_FINAL_EXTENSION,
        !          8668:                    XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
        !          8669:                    xmlSchemaPSimpleTypeErr(ctxt,
        !          8670:                        XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          8671:                        NULL, (xmlNodePtr) attr,
        !          8672:                        NULL, "(#all | List of (extension | restriction))",
        !          8673:                        attrValue, NULL, NULL, NULL);
        !          8674:                }
        !          8675:            }
        !          8676:        }
        !          8677:        /*
        !          8678:        * Attribute "block".
        !          8679:        */
        !          8680:        attr = xmlSchemaGetPropNode(node, "block");
        !          8681:        if (attr == NULL) {
        !          8682:            /*
        !          8683:            * Apply default "block" values.
        !          8684:            */
        !          8685:            if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
        !          8686:                decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
        !          8687:            if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
        !          8688:                decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
        !          8689:            if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
        !          8690:                decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
        !          8691:        } else {
        !          8692:            attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8693:            if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
        !          8694:                -1,
        !          8695:                XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
        !          8696:                XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
        !          8697:                XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
        !          8698:                xmlSchemaPSimpleTypeErr(ctxt,
        !          8699:                    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          8700:                    NULL, (xmlNodePtr) attr,
        !          8701:                    NULL, "(#all | List of (extension | "
        !          8702:                    "restriction | substitution))", attrValue,
        !          8703:                    NULL, NULL, NULL);
        !          8704:            }
        !          8705:        }
        !          8706:        if (xmlGetBooleanProp(ctxt, node, "nillable", 0))
        !          8707:            decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
        !          8708: 
        !          8709:        attr = xmlSchemaGetPropNode(node, "type");
        !          8710:        if (attr != NULL) {
        !          8711:            xmlSchemaPValAttrNodeQName(ctxt, schema,
        !          8712:                NULL, attr,
        !          8713:                &(decl->namedTypeNs), &(decl->namedType));
        !          8714:            xmlSchemaCheckReference(ctxt, schema, node,
        !          8715:                attr, decl->namedTypeNs);
        !          8716:        }
        !          8717:        decl->value = xmlSchemaGetProp(ctxt, node, "default");
        !          8718:        attr = xmlSchemaGetPropNode(node, "fixed");
        !          8719:        if (attr != NULL) {
        !          8720:            fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8721:            if (decl->value != NULL) {
        !          8722:                /*
        !          8723:                * 3.3.3 : 1
        !          8724:                * default and fixed must not both be present.
        !          8725:                */
        !          8726:                xmlSchemaPMutualExclAttrErr(ctxt,
        !          8727:                    XML_SCHEMAP_SRC_ELEMENT_1,
        !          8728:                    NULL, attr, "default", "fixed");
        !          8729:            } else {
        !          8730:                decl->flags |= XML_SCHEMAS_ELEM_FIXED;
        !          8731:                decl->value = fixed;
        !          8732:            }
        !          8733:        }
        !          8734:        /*
        !          8735:        * And now for the children...
        !          8736:        */
        !          8737:        if (IS_SCHEMA(child, "complexType")) {
        !          8738:            /*
        !          8739:            * 3.3.3 : 3
        !          8740:            * "type" and either <simpleType> or <complexType> are mutually
        !          8741:            * exclusive
        !          8742:            */
        !          8743:            if (decl->namedType != NULL) {
        !          8744:                xmlSchemaPContentErr(ctxt,
        !          8745:                    XML_SCHEMAP_SRC_ELEMENT_3,
        !          8746:                    NULL, node, child,
        !          8747:                    "The attribute 'type' and the <complexType> child are "
        !          8748:                    "mutually exclusive", NULL);
        !          8749:            } else
        !          8750:                WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0);
        !          8751:            child = child->next;
        !          8752:        } else if (IS_SCHEMA(child, "simpleType")) {
        !          8753:            /*
        !          8754:            * 3.3.3 : 3
        !          8755:            * "type" and either <simpleType> or <complexType> are
        !          8756:            * mutually exclusive
        !          8757:            */
        !          8758:            if (decl->namedType != NULL) {
        !          8759:                xmlSchemaPContentErr(ctxt,
        !          8760:                    XML_SCHEMAP_SRC_ELEMENT_3,
        !          8761:                    NULL, node, child,
        !          8762:                    "The attribute 'type' and the <simpleType> child are "
        !          8763:                    "mutually exclusive", NULL);
        !          8764:            } else
        !          8765:                WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
        !          8766:            child = child->next;
        !          8767:        }
        !          8768:        while ((IS_SCHEMA(child, "unique")) ||
        !          8769:            (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) {
        !          8770:            if (IS_SCHEMA(child, "unique")) {
        !          8771:                curIDC = xmlSchemaParseIDC(ctxt, schema, child,
        !          8772:                    XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
        !          8773:            } else if (IS_SCHEMA(child, "key")) {
        !          8774:                curIDC = xmlSchemaParseIDC(ctxt, schema, child,
        !          8775:                    XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
        !          8776:            } else if (IS_SCHEMA(child, "keyref")) {
        !          8777:                curIDC = xmlSchemaParseIDC(ctxt, schema, child,
        !          8778:                    XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
        !          8779:            }
        !          8780:            if (lastIDC != NULL)
        !          8781:                lastIDC->next = curIDC;
        !          8782:            else
        !          8783:                decl->idcs = (void *) curIDC;
        !          8784:            lastIDC = curIDC;
        !          8785:            child = child->next;
        !          8786:        }
        !          8787:        if (child != NULL) {
        !          8788:            xmlSchemaPContentErr(ctxt,
        !          8789:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8790:                NULL, node, child,
        !          8791:                NULL, "(annotation?, ((simpleType | complexType)?, "
        !          8792:                "(unique | key | keyref)*))");
        !          8793:        }
        !          8794:        decl->annot = annot;
        !          8795:     }
        !          8796:     /*
        !          8797:     * NOTE: Element Declaration Representation OK 4. will be checked at a
        !          8798:     * different layer.
        !          8799:     */
        !          8800:     FREE_AND_NULL(des)
        !          8801:     if (topLevel)
        !          8802:        return ((xmlSchemaBasicItemPtr) decl);
        !          8803:     else {
        !          8804:        particle->children = (xmlSchemaTreeItemPtr) decl;
        !          8805:        return ((xmlSchemaBasicItemPtr) particle);
        !          8806:     }
        !          8807: 
        !          8808: return_null:
        !          8809:     FREE_AND_NULL(des);
        !          8810:     if (annot != NULL) {
        !          8811:        if (particle != NULL)
        !          8812:            particle->annot = NULL;
        !          8813:        if (decl != NULL)
        !          8814:            decl->annot = NULL;
        !          8815:        xmlSchemaFreeAnnot(annot);
        !          8816:     }
        !          8817:     return (NULL);
        !          8818: }
        !          8819: 
        !          8820: /**
        !          8821:  * xmlSchemaParseUnion:
        !          8822:  * @ctxt:  a schema validation context
        !          8823:  * @schema:  the schema being built
        !          8824:  * @node:  a subtree containing XML Schema informations
        !          8825:  *
        !          8826:  * parse a XML schema Union definition
        !          8827:  * *WARNING* this interface is highly subject to change
        !          8828:  *
        !          8829:  * Returns -1 in case of internal error, 0 in case of success and a positive
        !          8830:  * error code otherwise.
        !          8831:  */
        !          8832: static int
        !          8833: xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          8834:                     xmlNodePtr node)
        !          8835: {
        !          8836:     xmlSchemaTypePtr type;
        !          8837:     xmlNodePtr child = NULL;
        !          8838:     xmlAttrPtr attr;
        !          8839:     const xmlChar *cur = NULL;
        !          8840: 
        !          8841:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          8842:         return (-1);
        !          8843:     /* Not a component, don't create it. */
        !          8844:     type = ctxt->ctxtType;
        !          8845:     /*
        !          8846:     * Mark the simple type as being of variety "union".
        !          8847:     */
        !          8848:     type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
        !          8849:     /*
        !          8850:     * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
        !          8851:     * then the �simple ur-type definition�."
        !          8852:     */
        !          8853:     type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
        !          8854:     /*
        !          8855:     * Check for illegal attributes.
        !          8856:     */
        !          8857:     attr = node->properties;
        !          8858:     while (attr != NULL) {
        !          8859:        if (attr->ns == NULL) {
        !          8860:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          8861:                (!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) {
        !          8862:                xmlSchemaPIllegalAttrErr(ctxt,
        !          8863:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8864:            }
        !          8865:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          8866:            xmlSchemaPIllegalAttrErr(ctxt,
        !          8867:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          8868:        }
        !          8869:        attr = attr->next;
        !          8870:     }
        !          8871:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          8872:     /*
        !          8873:     * Attribute "memberTypes". This is a list of QNames.
        !          8874:     * TODO: Check the value to contain anything.
        !          8875:     */
        !          8876:     attr = xmlSchemaGetPropNode(node, "memberTypes");
        !          8877:     if (attr != NULL) {
        !          8878:        const xmlChar *end;
        !          8879:        xmlChar *tmp;
        !          8880:        const xmlChar *localName, *nsName;
        !          8881:        xmlSchemaTypeLinkPtr link, lastLink = NULL;
        !          8882:        xmlSchemaQNameRefPtr ref;
        !          8883: 
        !          8884:        cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          8885:        type->base = cur;
        !          8886:        do {
        !          8887:            while (IS_BLANK_CH(*cur))
        !          8888:                cur++;
        !          8889:            end = cur;
        !          8890:            while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          8891:                end++;
        !          8892:            if (end == cur)
        !          8893:                break;
        !          8894:            tmp = xmlStrndup(cur, end - cur);
        !          8895:            if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
        !          8896:                NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) {
        !          8897:                /*
        !          8898:                * Create the member type link.
        !          8899:                */
        !          8900:                link = (xmlSchemaTypeLinkPtr)
        !          8901:                    xmlMalloc(sizeof(xmlSchemaTypeLink));
        !          8902:                if (link == NULL) {
        !          8903:                    xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, "
        !          8904:                        "allocating a type link", NULL);
        !          8905:                    return (-1);
        !          8906:                }
        !          8907:                link->type = NULL;
        !          8908:                link->next = NULL;
        !          8909:                if (lastLink == NULL)
        !          8910:                    type->memberTypes = link;
        !          8911:                else
        !          8912:                    lastLink->next = link;
        !          8913:                lastLink = link;
        !          8914:                /*
        !          8915:                * Create a reference item.
        !          8916:                */
        !          8917:                ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
        !          8918:                    localName, nsName);
        !          8919:                if (ref == NULL) {
        !          8920:                    FREE_AND_NULL(tmp)
        !          8921:                    return (-1);
        !          8922:                }
        !          8923:                /*
        !          8924:                * Assign the reference to the link, it will be resolved
        !          8925:                * later during fixup of the union simple type.
        !          8926:                */
        !          8927:                link->type = (xmlSchemaTypePtr) ref;
        !          8928:            }
        !          8929:            FREE_AND_NULL(tmp)
        !          8930:            cur = end;
        !          8931:        } while (*cur != 0);
        !          8932: 
        !          8933:     }
        !          8934:     /*
        !          8935:     * And now for the children...
        !          8936:     */
        !          8937:     child = node->children;
        !          8938:     if (IS_SCHEMA(child, "annotation")) {
        !          8939:        /*
        !          8940:        * Add the annotation to the simple type ancestor.
        !          8941:        */
        !          8942:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          8943:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          8944:         child = child->next;
        !          8945:     }
        !          8946:     if (IS_SCHEMA(child, "simpleType")) {
        !          8947:        xmlSchemaTypePtr subtype, last = NULL;
        !          8948: 
        !          8949:        /*
        !          8950:        * Anchor the member types in the "subtypes" field of the
        !          8951:        * simple type.
        !          8952:        */
        !          8953:        while (IS_SCHEMA(child, "simpleType")) {
        !          8954:            subtype = (xmlSchemaTypePtr)
        !          8955:                xmlSchemaParseSimpleType(ctxt, schema, child, 0);
        !          8956:            if (subtype != NULL) {
        !          8957:                if (last == NULL) {
        !          8958:                    type->subtypes = subtype;
        !          8959:                    last = subtype;
        !          8960:                } else {
        !          8961:                    last->next = subtype;
        !          8962:                    last = subtype;
        !          8963:                }
        !          8964:                last->next = NULL;
        !          8965:            }
        !          8966:            child = child->next;
        !          8967:        }
        !          8968:     }
        !          8969:     if (child != NULL) {
        !          8970:        xmlSchemaPContentErr(ctxt,
        !          8971:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          8972:            NULL, node, child, NULL, "(annotation?, simpleType*)");
        !          8973:     }
        !          8974:     if ((attr == NULL) && (type->subtypes == NULL)) {
        !          8975:         /*
        !          8976:        * src-union-memberTypes-or-simpleTypes
        !          8977:        * Either the memberTypes [attribute] of the <union> element must
        !          8978:        * be non-empty or there must be at least one simpleType [child].
        !          8979:        */
        !          8980:        xmlSchemaPCustomErr(ctxt,
        !          8981:            XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES,
        !          8982:            NULL, node,
        !          8983:            "Either the attribute 'memberTypes' or "
        !          8984:            "at least one <simpleType> child must be present", NULL);
        !          8985:     }
        !          8986:     return (0);
        !          8987: }
        !          8988: 
        !          8989: /**
        !          8990:  * xmlSchemaParseList:
        !          8991:  * @ctxt:  a schema validation context
        !          8992:  * @schema:  the schema being built
        !          8993:  * @node:  a subtree containing XML Schema informations
        !          8994:  *
        !          8995:  * parse a XML schema List definition
        !          8996:  * *WARNING* this interface is highly subject to change
        !          8997:  *
        !          8998:  * Returns -1 in case of error, 0 if the declaration is improper and
        !          8999:  *         1 in case of success.
        !          9000:  */
        !          9001: static xmlSchemaTypePtr
        !          9002: xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          9003:                    xmlNodePtr node)
        !          9004: {
        !          9005:     xmlSchemaTypePtr type;
        !          9006:     xmlNodePtr child = NULL;
        !          9007:     xmlAttrPtr attr;
        !          9008: 
        !          9009:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          9010:         return (NULL);
        !          9011:     /* Not a component, don't create it. */
        !          9012:     type = ctxt->ctxtType;
        !          9013:     /*
        !          9014:     * Mark the type as being of variety "list".
        !          9015:     */
        !          9016:     type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
        !          9017:     /*
        !          9018:     * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
        !          9019:     * then the �simple ur-type definition�."
        !          9020:     */
        !          9021:     type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
        !          9022:     /*
        !          9023:     * Check for illegal attributes.
        !          9024:     */
        !          9025:     attr = node->properties;
        !          9026:     while (attr != NULL) {
        !          9027:        if (attr->ns == NULL) {
        !          9028:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          9029:                (!xmlStrEqual(attr->name, BAD_CAST "itemType"))) {
        !          9030:                xmlSchemaPIllegalAttrErr(ctxt,
        !          9031:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9032:            }
        !          9033:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          9034:            xmlSchemaPIllegalAttrErr(ctxt,
        !          9035:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9036:        }
        !          9037:        attr = attr->next;
        !          9038:     }
        !          9039: 
        !          9040:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          9041: 
        !          9042:     /*
        !          9043:     * Attribute "itemType". NOTE that we will use the "ref" and "refNs"
        !          9044:     * fields for holding the reference to the itemType.
        !          9045:     *
        !          9046:     * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove
        !          9047:     * the "ref" fields.
        !          9048:     */
        !          9049:     xmlSchemaPValAttrQName(ctxt, schema, NULL,
        !          9050:        node, "itemType", &(type->baseNs), &(type->base));
        !          9051:     /*
        !          9052:     * And now for the children...
        !          9053:     */
        !          9054:     child = node->children;
        !          9055:     if (IS_SCHEMA(child, "annotation")) {
        !          9056:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          9057:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          9058:         child = child->next;
        !          9059:     }
        !          9060:     if (IS_SCHEMA(child, "simpleType")) {
        !          9061:        /*
        !          9062:        * src-list-itemType-or-simpleType
        !          9063:        * Either the itemType [attribute] or the <simpleType> [child] of
        !          9064:        * the <list> element must be present, but not both.
        !          9065:        */
        !          9066:        if (type->base != NULL) {
        !          9067:            xmlSchemaPCustomErr(ctxt,
        !          9068:                XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
        !          9069:                NULL, node,
        !          9070:                "The attribute 'itemType' and the <simpleType> child "
        !          9071:                "are mutually exclusive", NULL);
        !          9072:        } else {
        !          9073:            type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
        !          9074:        }
        !          9075:         child = child->next;
        !          9076:     } else if (type->base == NULL) {
        !          9077:        xmlSchemaPCustomErr(ctxt,
        !          9078:            XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
        !          9079:            NULL, node,
        !          9080:            "Either the attribute 'itemType' or the <simpleType> child "
        !          9081:            "must be present", NULL);
        !          9082:     }
        !          9083:     if (child != NULL) {
        !          9084:        xmlSchemaPContentErr(ctxt,
        !          9085:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          9086:            NULL, node, child, NULL, "(annotation?, simpleType?)");
        !          9087:     }
        !          9088:     if ((type->base == NULL) &&
        !          9089:        (type->subtypes == NULL) &&
        !          9090:        (xmlSchemaGetPropNode(node, "itemType") == NULL)) {
        !          9091:        xmlSchemaPCustomErr(ctxt,
        !          9092:            XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
        !          9093:            NULL, node,
        !          9094:            "Either the attribute 'itemType' or the <simpleType> child "
        !          9095:            "must be present", NULL);
        !          9096:     }
        !          9097:     return (NULL);
        !          9098: }
        !          9099: 
        !          9100: /**
        !          9101:  * xmlSchemaParseSimpleType:
        !          9102:  * @ctxt:  a schema validation context
        !          9103:  * @schema:  the schema being built
        !          9104:  * @node:  a subtree containing XML Schema informations
        !          9105:  *
        !          9106:  * parse a XML schema Simple Type definition
        !          9107:  * *WARNING* this interface is highly subject to change
        !          9108:  *
        !          9109:  * Returns -1 in case of error, 0 if the declaration is improper and
        !          9110:  * 1 in case of success.
        !          9111:  */
        !          9112: static xmlSchemaTypePtr
        !          9113: xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          9114:                          xmlNodePtr node, int topLevel)
        !          9115: {
        !          9116:     xmlSchemaTypePtr type, oldCtxtType;
        !          9117:     xmlNodePtr child = NULL;
        !          9118:     const xmlChar *attrValue = NULL;
        !          9119:     xmlAttrPtr attr;
        !          9120:     int hasRestriction = 0;
        !          9121: 
        !          9122:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          9123:         return (NULL);
        !          9124: 
        !          9125:     if (topLevel) {
        !          9126:        attr = xmlSchemaGetPropNode(node, "name");
        !          9127:        if (attr == NULL) {
        !          9128:            xmlSchemaPMissingAttrErr(ctxt,
        !          9129:                XML_SCHEMAP_S4S_ATTR_MISSING,
        !          9130:                NULL, node,
        !          9131:                "name", NULL);
        !          9132:            return (NULL);
        !          9133:        } else {
        !          9134:            if (xmlSchemaPValAttrNode(ctxt,
        !          9135:                NULL, attr,
        !          9136:                xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
        !          9137:                return (NULL);
        !          9138:            /*
        !          9139:            * Skip built-in types.
        !          9140:            */
        !          9141:            if (ctxt->isS4S) {
        !          9142:                xmlSchemaTypePtr biType;
        !          9143: 
        !          9144:                if (ctxt->isRedefine) {
        !          9145:                    /*
        !          9146:                    * REDEFINE: Disallow redefinition of built-in-types.
        !          9147:                    * TODO: It seems that the spec does not say anything
        !          9148:                    * about this case.
        !          9149:                    */
        !          9150:                    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
        !          9151:                        NULL, node,
        !          9152:                        "Redefinition of built-in simple types is not "
        !          9153:                        "supported", NULL);
        !          9154:                    return(NULL);
        !          9155:                }
        !          9156:                biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
        !          9157:                if (biType != NULL)
        !          9158:                    return (biType);
        !          9159:            }
        !          9160:        }
        !          9161:     }
        !          9162:     /*
        !          9163:     * TargetNamespace:
        !          9164:     * SPEC "The �actual value� of the targetNamespace [attribute]
        !          9165:     * of the <schema> ancestor element information item if present,
        !          9166:     * otherwise �absent�.
        !          9167:     */
        !          9168:     if (topLevel == 0) {
        !          9169: #ifdef ENABLE_NAMED_LOCALS
        !          9170:         char buf[40];
        !          9171: #endif
        !          9172:        /*
        !          9173:        * Parse as local simple type definition.
        !          9174:        */
        !          9175: #ifdef ENABLE_NAMED_LOCALS
        !          9176:         snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1);
        !          9177:        type = xmlSchemaAddType(ctxt, schema,
        !          9178:            XML_SCHEMA_TYPE_SIMPLE,
        !          9179:            xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
        !          9180:            ctxt->targetNamespace, node, 0);
        !          9181: #else
        !          9182:        type = xmlSchemaAddType(ctxt, schema,
        !          9183:            XML_SCHEMA_TYPE_SIMPLE,
        !          9184:            NULL, ctxt->targetNamespace, node, 0);
        !          9185: #endif
        !          9186:        if (type == NULL)
        !          9187:            return (NULL);
        !          9188:        type->type = XML_SCHEMA_TYPE_SIMPLE;
        !          9189:        type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
        !          9190:        /*
        !          9191:        * Check for illegal attributes.
        !          9192:        */
        !          9193:        attr = node->properties;
        !          9194:        while (attr != NULL) {
        !          9195:            if (attr->ns == NULL) {
        !          9196:                if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
        !          9197:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          9198:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9199:                }
        !          9200:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          9201:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          9202:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9203:            }
        !          9204:            attr = attr->next;
        !          9205:        }
        !          9206:     } else {
        !          9207:        /*
        !          9208:        * Parse as global simple type definition.
        !          9209:        *
        !          9210:        * Note that attrValue is the value of the attribute "name" here.
        !          9211:        */
        !          9212:        type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE,
        !          9213:            attrValue, ctxt->targetNamespace, node, 1);
        !          9214:        if (type == NULL)
        !          9215:            return (NULL);
        !          9216:        type->type = XML_SCHEMA_TYPE_SIMPLE;
        !          9217:        type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
        !          9218:        type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
        !          9219:        /*
        !          9220:        * Check for illegal attributes.
        !          9221:        */
        !          9222:        attr = node->properties;
        !          9223:        while (attr != NULL) {
        !          9224:            if (attr->ns == NULL) {
        !          9225:                if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          9226:                    (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          9227:                    (!xmlStrEqual(attr->name, BAD_CAST "final"))) {
        !          9228:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          9229:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9230:                }
        !          9231:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          9232:                xmlSchemaPIllegalAttrErr(ctxt,
        !          9233:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9234:            }
        !          9235:            attr = attr->next;
        !          9236:        }
        !          9237:        /*
        !          9238:        * Attribute "final".
        !          9239:        */
        !          9240:        attr = xmlSchemaGetPropNode(node, "final");
        !          9241:        if (attr == NULL) {
        !          9242:            if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
        !          9243:                type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
        !          9244:            if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
        !          9245:                type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
        !          9246:            if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
        !          9247:                type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
        !          9248:        } else {
        !          9249:            attrValue = xmlSchemaGetProp(ctxt, node, "final");
        !          9250:            if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
        !          9251:                -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
        !          9252:                XML_SCHEMAS_TYPE_FINAL_LIST,
        !          9253:                XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
        !          9254: 
        !          9255:                xmlSchemaPSimpleTypeErr(ctxt,
        !          9256:                    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          9257:                    WXS_BASIC_CAST type, (xmlNodePtr) attr,
        !          9258:                    NULL, "(#all | List of (list | union | restriction)",
        !          9259:                    attrValue, NULL, NULL, NULL);
        !          9260:            }
        !          9261:        }
        !          9262:     }
        !          9263:     type->targetNamespace = ctxt->targetNamespace;
        !          9264:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          9265:     /*
        !          9266:     * And now for the children...
        !          9267:     */
        !          9268:     oldCtxtType = ctxt->ctxtType;
        !          9269: 
        !          9270:     ctxt->ctxtType = type;
        !          9271: 
        !          9272:     child = node->children;
        !          9273:     if (IS_SCHEMA(child, "annotation")) {
        !          9274:         type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          9275:         child = child->next;
        !          9276:     }
        !          9277:     if (child == NULL) {
        !          9278:        xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING,
        !          9279:            NULL, node, child, NULL,
        !          9280:            "(annotation?, (restriction | list | union))");
        !          9281:     } else if (IS_SCHEMA(child, "restriction")) {
        !          9282:         xmlSchemaParseRestriction(ctxt, schema, child,
        !          9283:            XML_SCHEMA_TYPE_SIMPLE);
        !          9284:        hasRestriction = 1;
        !          9285:         child = child->next;
        !          9286:     } else if (IS_SCHEMA(child, "list")) {
        !          9287:         xmlSchemaParseList(ctxt, schema, child);
        !          9288:         child = child->next;
        !          9289:     } else if (IS_SCHEMA(child, "union")) {
        !          9290:         xmlSchemaParseUnion(ctxt, schema, child);
        !          9291:         child = child->next;
        !          9292:     }
        !          9293:     if (child != NULL) {
        !          9294:        xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          9295:            NULL, node, child, NULL,
        !          9296:            "(annotation?, (restriction | list | union))");
        !          9297:     }
        !          9298:     /*
        !          9299:     * REDEFINE: SPEC src-redefine (5)
        !          9300:     * "Within the [children], each <simpleType> must have a
        !          9301:     * <restriction> among its [children] ... the �actual value� of whose
        !          9302:     * base [attribute] must be the same as the �actual value� of its own
        !          9303:     * name attribute plus target namespace;"
        !          9304:     */
        !          9305:     if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
        !          9306:        xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
        !          9307:            NULL, node, "This is a redefinition, thus the "
        !          9308:            "<simpleType> must have a <restriction> child", NULL);
        !          9309:     }
        !          9310: 
        !          9311:     ctxt->ctxtType = oldCtxtType;
        !          9312:     return (type);
        !          9313: }
        !          9314: 
        !          9315: /**
        !          9316:  * xmlSchemaParseModelGroupDefRef:
        !          9317:  * @ctxt:  the parser context
        !          9318:  * @schema: the schema being built
        !          9319:  * @node:  the node
        !          9320:  *
        !          9321:  * Parses a reference to a model group definition.
        !          9322:  *
        !          9323:  * We will return a particle component with a qname-component or
        !          9324:  * NULL in case of an error.
        !          9325:  */
        !          9326: static xmlSchemaTreeItemPtr
        !          9327: xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
        !          9328:                               xmlSchemaPtr schema,
        !          9329:                               xmlNodePtr node)
        !          9330: {
        !          9331:     xmlSchemaParticlePtr item;
        !          9332:     xmlNodePtr child = NULL;
        !          9333:     xmlAttrPtr attr;
        !          9334:     const xmlChar *ref = NULL, *refNs = NULL;
        !          9335:     int min, max;
        !          9336: 
        !          9337:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          9338:         return (NULL);
        !          9339: 
        !          9340:     attr = xmlSchemaGetPropNode(node, "ref");
        !          9341:     if (attr == NULL) {
        !          9342:        xmlSchemaPMissingAttrErr(ctxt,
        !          9343:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          9344:            NULL, node, "ref", NULL);
        !          9345:        return (NULL);
        !          9346:     } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL,
        !          9347:        attr, &refNs, &ref) != 0) {
        !          9348:        return (NULL);
        !          9349:     }
        !          9350:     xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
        !          9351:     min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
        !          9352:     max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
        !          9353:        "(xs:nonNegativeInteger | unbounded)");
        !          9354:     /*
        !          9355:     * Check for illegal attributes.
        !          9356:     */
        !          9357:     attr = node->properties;
        !          9358:     while (attr != NULL) {
        !          9359:        if (attr->ns == NULL) {
        !          9360:            if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
        !          9361:                (!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          9362:                (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
        !          9363:                (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) {
        !          9364:                xmlSchemaPIllegalAttrErr(ctxt,
        !          9365:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9366:            }
        !          9367:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          9368:            xmlSchemaPIllegalAttrErr(ctxt,
        !          9369:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9370:        }
        !          9371:        attr = attr->next;
        !          9372:     }
        !          9373:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          9374:     item = xmlSchemaAddParticle(ctxt, node, min, max);
        !          9375:     if (item == NULL)
        !          9376:        return (NULL);
        !          9377:     /*
        !          9378:     * Create a qname-reference and set as the term; it will be substituted
        !          9379:     * for the model group after the reference has been resolved.
        !          9380:     */
        !          9381:     item->children = (xmlSchemaTreeItemPtr)
        !          9382:        xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs);
        !          9383:     xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max);
        !          9384:     /*
        !          9385:     * And now for the children...
        !          9386:     */
        !          9387:     child = node->children;
        !          9388:     /* TODO: Is annotation even allowed for a model group reference? */
        !          9389:     if (IS_SCHEMA(child, "annotation")) {
        !          9390:        /*
        !          9391:        * TODO: What to do exactly with the annotation?
        !          9392:        */
        !          9393:        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          9394:        child = child->next;
        !          9395:     }
        !          9396:     if (child != NULL) {
        !          9397:        xmlSchemaPContentErr(ctxt,
        !          9398:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          9399:            NULL, node, child, NULL,
        !          9400:            "(annotation?)");
        !          9401:     }
        !          9402:     /*
        !          9403:     * Corresponds to no component at all if minOccurs==maxOccurs==0.
        !          9404:     */
        !          9405:     if ((min == 0) && (max == 0))
        !          9406:        return (NULL);
        !          9407: 
        !          9408:     return ((xmlSchemaTreeItemPtr) item);
        !          9409: }
        !          9410: 
        !          9411: /**
        !          9412:  * xmlSchemaParseModelGroupDefinition:
        !          9413:  * @ctxt:  a schema validation context
        !          9414:  * @schema:  the schema being built
        !          9415:  * @node:  a subtree containing XML Schema informations
        !          9416:  *
        !          9417:  * Parses a XML schema model group definition.
        !          9418:  *
        !          9419:  * Note that the contraint src-redefine (6.2) can't be applied until
        !          9420:  * references have been resolved. So we will do this at the
        !          9421:  * component fixup level.
        !          9422:  *
        !          9423:  * *WARNING* this interface is highly subject to change
        !          9424:  *
        !          9425:  * Returns -1 in case of error, 0 if the declaration is improper and
        !          9426:  *         1 in case of success.
        !          9427:  */
        !          9428: static xmlSchemaModelGroupDefPtr
        !          9429: xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
        !          9430:                                   xmlSchemaPtr schema,
        !          9431:                                   xmlNodePtr node)
        !          9432: {
        !          9433:     xmlSchemaModelGroupDefPtr item;
        !          9434:     xmlNodePtr child = NULL;
        !          9435:     xmlAttrPtr attr;
        !          9436:     const xmlChar *name;
        !          9437: 
        !          9438:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          9439:         return (NULL);
        !          9440: 
        !          9441:     attr = xmlSchemaGetPropNode(node, "name");
        !          9442:     if (attr == NULL) {
        !          9443:        xmlSchemaPMissingAttrErr(ctxt,
        !          9444:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          9445:            NULL, node,
        !          9446:            "name", NULL);
        !          9447:        return (NULL);
        !          9448:     } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
        !          9449:        xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
        !          9450:        return (NULL);
        !          9451:     }
        !          9452:     item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name,
        !          9453:        ctxt->targetNamespace, node);
        !          9454:     if (item == NULL)
        !          9455:        return (NULL);
        !          9456:     /*
        !          9457:     * Check for illegal attributes.
        !          9458:     */
        !          9459:     attr = node->properties;
        !          9460:     while (attr != NULL) {
        !          9461:        if (attr->ns == NULL) {
        !          9462:            if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
        !          9463:                (!xmlStrEqual(attr->name, BAD_CAST "id"))) {
        !          9464:                xmlSchemaPIllegalAttrErr(ctxt,
        !          9465:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9466:            }
        !          9467:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          9468:            xmlSchemaPIllegalAttrErr(ctxt,
        !          9469:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          9470:        }
        !          9471:        attr = attr->next;
        !          9472:     }
        !          9473:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          9474:     /*
        !          9475:     * And now for the children...
        !          9476:     */
        !          9477:     child = node->children;
        !          9478:     if (IS_SCHEMA(child, "annotation")) {
        !          9479:        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          9480:        child = child->next;
        !          9481:     }
        !          9482:     if (IS_SCHEMA(child, "all")) {
        !          9483:        item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
        !          9484:            XML_SCHEMA_TYPE_ALL, 0);
        !          9485:        child = child->next;
        !          9486:     } else if (IS_SCHEMA(child, "choice")) {
        !          9487:        item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
        !          9488:            XML_SCHEMA_TYPE_CHOICE, 0);
        !          9489:        child = child->next;
        !          9490:     } else if (IS_SCHEMA(child, "sequence")) {
        !          9491:        item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
        !          9492:            XML_SCHEMA_TYPE_SEQUENCE, 0);
        !          9493:        child = child->next;
        !          9494:     }
        !          9495: 
        !          9496: 
        !          9497: 
        !          9498:     if (child != NULL) {
        !          9499:        xmlSchemaPContentErr(ctxt,
        !          9500:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          9501:            NULL, node, child, NULL,
        !          9502:            "(annotation?, (all | choice | sequence)?)");
        !          9503:     }
        !          9504:     return (item);
        !          9505: }
        !          9506: 
        !          9507: /**
        !          9508:  * xmlSchemaCleanupDoc:
        !          9509:  * @ctxt:  a schema validation context
        !          9510:  * @node:  the root of the document.
        !          9511:  *
        !          9512:  * removes unwanted nodes in a schemas document tree
        !          9513:  */
        !          9514: static void
        !          9515: xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root)
        !          9516: {
        !          9517:     xmlNodePtr delete, cur;
        !          9518: 
        !          9519:     if ((ctxt == NULL) || (root == NULL)) return;
        !          9520: 
        !          9521:     /*
        !          9522:      * Remove all the blank text nodes
        !          9523:      */
        !          9524:     delete = NULL;
        !          9525:     cur = root;
        !          9526:     while (cur != NULL) {
        !          9527:         if (delete != NULL) {
        !          9528:             xmlUnlinkNode(delete);
        !          9529:             xmlFreeNode(delete);
        !          9530:             delete = NULL;
        !          9531:         }
        !          9532:         if (cur->type == XML_TEXT_NODE) {
        !          9533:             if (IS_BLANK_NODE(cur)) {
        !          9534:                 if (xmlNodeGetSpacePreserve(cur) != 1) {
        !          9535:                     delete = cur;
        !          9536:                 }
        !          9537:             }
        !          9538:         } else if ((cur->type != XML_ELEMENT_NODE) &&
        !          9539:                    (cur->type != XML_CDATA_SECTION_NODE)) {
        !          9540:             delete = cur;
        !          9541:             goto skip_children;
        !          9542:         }
        !          9543: 
        !          9544:         /*
        !          9545:          * Skip to next node
        !          9546:          */
        !          9547:         if (cur->children != NULL) {
        !          9548:             if ((cur->children->type != XML_ENTITY_DECL) &&
        !          9549:                 (cur->children->type != XML_ENTITY_REF_NODE) &&
        !          9550:                 (cur->children->type != XML_ENTITY_NODE)) {
        !          9551:                 cur = cur->children;
        !          9552:                 continue;
        !          9553:             }
        !          9554:         }
        !          9555:       skip_children:
        !          9556:         if (cur->next != NULL) {
        !          9557:             cur = cur->next;
        !          9558:             continue;
        !          9559:         }
        !          9560: 
        !          9561:         do {
        !          9562:             cur = cur->parent;
        !          9563:             if (cur == NULL)
        !          9564:                 break;
        !          9565:             if (cur == root) {
        !          9566:                 cur = NULL;
        !          9567:                 break;
        !          9568:             }
        !          9569:             if (cur->next != NULL) {
        !          9570:                 cur = cur->next;
        !          9571:                 break;
        !          9572:             }
        !          9573:         } while (cur != NULL);
        !          9574:     }
        !          9575:     if (delete != NULL) {
        !          9576:         xmlUnlinkNode(delete);
        !          9577:         xmlFreeNode(delete);
        !          9578:         delete = NULL;
        !          9579:     }
        !          9580: }
        !          9581: 
        !          9582: 
        !          9583: static void
        !          9584: xmlSchemaClearSchemaDefaults(xmlSchemaPtr schema)
        !          9585: {
        !          9586:     if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
        !          9587:        schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
        !          9588: 
        !          9589:     if (schema->flags & XML_SCHEMAS_QUALIF_ATTR)
        !          9590:        schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
        !          9591: 
        !          9592:     if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
        !          9593:        schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
        !          9594:     if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
        !          9595:        schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
        !          9596:     if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
        !          9597:        schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
        !          9598:     if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
        !          9599:        schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
        !          9600: 
        !          9601:     if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
        !          9602:        schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
        !          9603:     if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
        !          9604:        schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
        !          9605:     if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
        !          9606:        schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
        !          9607: }
        !          9608: 
        !          9609: static int
        !          9610: xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
        !          9611:                             xmlSchemaPtr schema,
        !          9612:                             xmlNodePtr node)
        !          9613: {
        !          9614:     xmlAttrPtr attr;
        !          9615:     const xmlChar *val;
        !          9616:     int res = 0, oldErrs = ctxt->nberrors;
        !          9617: 
        !          9618:     /*
        !          9619:     * Those flags should be moved to the parser context flags,
        !          9620:     * since they are not visible at the component level. I.e.
        !          9621:     * they are used if processing schema *documents* only.
        !          9622:     */
        !          9623:     res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          9624:     HFAILURE;
        !          9625: 
        !          9626:     /*
        !          9627:     * Since the version is of type xs:token, we won't bother to
        !          9628:     * check it.
        !          9629:     */
        !          9630:     /* REMOVED:
        !          9631:     attr = xmlSchemaGetPropNode(node, "version");
        !          9632:     if (attr != NULL) {
        !          9633:        res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr,
        !          9634:            xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val);
        !          9635:        HFAILURE;
        !          9636:     }
        !          9637:     */
        !          9638:     attr = xmlSchemaGetPropNode(node, "targetNamespace");
        !          9639:     if (attr != NULL) {
        !          9640:        res = xmlSchemaPValAttrNode(ctxt, NULL, attr,
        !          9641:            xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
        !          9642:        HFAILURE;
        !          9643:        if (res != 0) {
        !          9644:            ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
        !          9645:            goto exit;
        !          9646:        }
        !          9647:     }
        !          9648:     attr = xmlSchemaGetPropNode(node, "elementFormDefault");
        !          9649:     if (attr != NULL) {
        !          9650:        val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          9651:        res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
        !          9652:            XML_SCHEMAS_QUALIF_ELEM);
        !          9653:        HFAILURE;
        !          9654:        if (res != 0) {
        !          9655:            xmlSchemaPSimpleTypeErr(ctxt,
        !          9656:                XML_SCHEMAP_ELEMFORMDEFAULT_VALUE,
        !          9657:                NULL, (xmlNodePtr) attr, NULL,
        !          9658:                "(qualified | unqualified)", val, NULL, NULL, NULL);
        !          9659:        }
        !          9660:     }
        !          9661:     attr = xmlSchemaGetPropNode(node, "attributeFormDefault");
        !          9662:     if (attr != NULL) {
        !          9663:        val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          9664:        res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
        !          9665:            XML_SCHEMAS_QUALIF_ATTR);
        !          9666:        HFAILURE;
        !          9667:        if (res != 0) {
        !          9668:            xmlSchemaPSimpleTypeErr(ctxt,
        !          9669:                XML_SCHEMAP_ATTRFORMDEFAULT_VALUE,
        !          9670:                NULL, (xmlNodePtr) attr, NULL,
        !          9671:                "(qualified | unqualified)", val, NULL, NULL, NULL);
        !          9672:        }
        !          9673:     }
        !          9674:     attr = xmlSchemaGetPropNode(node, "finalDefault");
        !          9675:     if (attr != NULL) {
        !          9676:        val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          9677:        res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
        !          9678:            XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
        !          9679:            XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
        !          9680:            -1,
        !          9681:            XML_SCHEMAS_FINAL_DEFAULT_LIST,
        !          9682:            XML_SCHEMAS_FINAL_DEFAULT_UNION);
        !          9683:        HFAILURE;
        !          9684:        if (res != 0) {
        !          9685:            xmlSchemaPSimpleTypeErr(ctxt,
        !          9686:                XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          9687:                NULL, (xmlNodePtr) attr, NULL,
        !          9688:                "(#all | List of (extension | restriction | list | union))",
        !          9689:                val, NULL, NULL, NULL);
        !          9690:        }
        !          9691:     }
        !          9692:     attr = xmlSchemaGetPropNode(node, "blockDefault");
        !          9693:     if (attr != NULL) {
        !          9694:        val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
        !          9695:        res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
        !          9696:            XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
        !          9697:            XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
        !          9698:            XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
        !          9699:        HFAILURE;
        !          9700:        if (res != 0) {
        !          9701:            xmlSchemaPSimpleTypeErr(ctxt,
        !          9702:                XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          9703:                NULL, (xmlNodePtr) attr, NULL,
        !          9704:                "(#all | List of (extension | restriction | substitution))",
        !          9705:                val, NULL, NULL, NULL);
        !          9706:        }
        !          9707:     }
        !          9708: 
        !          9709: exit:
        !          9710:     if (oldErrs != ctxt->nberrors)
        !          9711:        res = ctxt->err;
        !          9712:     return(res);
        !          9713: exit_failure:
        !          9714:     return(-1);
        !          9715: }
        !          9716: 
        !          9717: /**
        !          9718:  * xmlSchemaParseSchemaTopLevel:
        !          9719:  * @ctxt:  a schema validation context
        !          9720:  * @schema:  the schemas
        !          9721:  * @nodes:  the list of top level nodes
        !          9722:  *
        !          9723:  * Returns the internal XML Schema structure built from the resource or
        !          9724:  *         NULL in case of error
        !          9725:  */
        !          9726: static int
        !          9727: xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
        !          9728:                              xmlSchemaPtr schema, xmlNodePtr nodes)
        !          9729: {
        !          9730:     xmlNodePtr child;
        !          9731:     xmlSchemaAnnotPtr annot;
        !          9732:     int res = 0, oldErrs, tmpOldErrs;
        !          9733: 
        !          9734:     if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL))
        !          9735:         return(-1);
        !          9736: 
        !          9737:     oldErrs = ctxt->nberrors;
        !          9738:     child = nodes;
        !          9739:     while ((IS_SCHEMA(child, "include")) ||
        !          9740:           (IS_SCHEMA(child, "import")) ||
        !          9741:           (IS_SCHEMA(child, "redefine")) ||
        !          9742:           (IS_SCHEMA(child, "annotation"))) {
        !          9743:        if (IS_SCHEMA(child, "annotation")) {
        !          9744:            annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          9745:            if (schema->annot == NULL)
        !          9746:                schema->annot = annot;
        !          9747:            else
        !          9748:                xmlSchemaFreeAnnot(annot);
        !          9749:        } else if (IS_SCHEMA(child, "import")) {
        !          9750:            tmpOldErrs = ctxt->nberrors;
        !          9751:            res = xmlSchemaParseImport(ctxt, schema, child);
        !          9752:            HFAILURE;
        !          9753:            HSTOP(ctxt);
        !          9754:            if (tmpOldErrs != ctxt->nberrors)
        !          9755:                goto exit;
        !          9756:        } else if (IS_SCHEMA(child, "include")) {
        !          9757:            tmpOldErrs = ctxt->nberrors;
        !          9758:            res = xmlSchemaParseInclude(ctxt, schema, child);
        !          9759:            HFAILURE;
        !          9760:            HSTOP(ctxt);
        !          9761:            if (tmpOldErrs != ctxt->nberrors)
        !          9762:                goto exit;
        !          9763:        } else if (IS_SCHEMA(child, "redefine")) {
        !          9764:            tmpOldErrs = ctxt->nberrors;
        !          9765:            res = xmlSchemaParseRedefine(ctxt, schema, child);
        !          9766:            HFAILURE;
        !          9767:            HSTOP(ctxt);
        !          9768:            if (tmpOldErrs != ctxt->nberrors)
        !          9769:                goto exit;
        !          9770:        }
        !          9771:        child = child->next;
        !          9772:     }
        !          9773:     /*
        !          9774:     * URGENT TODO: Change the functions to return int results.
        !          9775:     * We need especially to catch internal errors.
        !          9776:     */
        !          9777:     while (child != NULL) {
        !          9778:        if (IS_SCHEMA(child, "complexType")) {
        !          9779:            xmlSchemaParseComplexType(ctxt, schema, child, 1);
        !          9780:            child = child->next;
        !          9781:        } else if (IS_SCHEMA(child, "simpleType")) {
        !          9782:            xmlSchemaParseSimpleType(ctxt, schema, child, 1);
        !          9783:            child = child->next;
        !          9784:        } else if (IS_SCHEMA(child, "element")) {
        !          9785:            xmlSchemaParseElement(ctxt, schema, child, NULL, 1);
        !          9786:            child = child->next;
        !          9787:        } else if (IS_SCHEMA(child, "attribute")) {
        !          9788:            xmlSchemaParseGlobalAttribute(ctxt, schema, child);
        !          9789:            child = child->next;
        !          9790:        } else if (IS_SCHEMA(child, "attributeGroup")) {
        !          9791:            xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child);
        !          9792:            child = child->next;
        !          9793:        } else if (IS_SCHEMA(child, "group")) {
        !          9794:            xmlSchemaParseModelGroupDefinition(ctxt, schema, child);
        !          9795:            child = child->next;
        !          9796:        } else if (IS_SCHEMA(child, "notation")) {
        !          9797:            xmlSchemaParseNotation(ctxt, schema, child);
        !          9798:            child = child->next;
        !          9799:        } else {
        !          9800:            xmlSchemaPContentErr(ctxt,
        !          9801:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          9802:                NULL, child->parent, child,
        !          9803:                NULL, "((include | import | redefine | annotation)*, "
        !          9804:                "(((simpleType | complexType | group | attributeGroup) "
        !          9805:                "| element | attribute | notation), annotation*)*)");
        !          9806:            child = child->next;
        !          9807:        }
        !          9808:        while (IS_SCHEMA(child, "annotation")) {
        !          9809:            /*
        !          9810:            * TODO: We should add all annotations.
        !          9811:            */
        !          9812:            annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          9813:            if (schema->annot == NULL)
        !          9814:                schema->annot = annot;
        !          9815:            else
        !          9816:                xmlSchemaFreeAnnot(annot);
        !          9817:            child = child->next;
        !          9818:        }
        !          9819:     }
        !          9820: exit:
        !          9821:     ctxt->ctxtType = NULL;
        !          9822:     if (oldErrs != ctxt->nberrors)
        !          9823:        res = ctxt->err;
        !          9824:     return(res);
        !          9825: exit_failure:
        !          9826:     return(-1);
        !          9827: }
        !          9828: 
        !          9829: static xmlSchemaSchemaRelationPtr
        !          9830: xmlSchemaSchemaRelationCreate(void)
        !          9831: {
        !          9832:     xmlSchemaSchemaRelationPtr ret;
        !          9833: 
        !          9834:     ret = (xmlSchemaSchemaRelationPtr)
        !          9835:        xmlMalloc(sizeof(xmlSchemaSchemaRelation));
        !          9836:     if (ret == NULL) {
        !          9837:        xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL);
        !          9838:        return(NULL);
        !          9839:     }
        !          9840:     memset(ret, 0, sizeof(xmlSchemaSchemaRelation));
        !          9841:     return(ret);
        !          9842: }
        !          9843: 
        !          9844: #if 0
        !          9845: static void
        !          9846: xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
        !          9847: {
        !          9848:     xmlFree(rel);
        !          9849: }
        !          9850: #endif
        !          9851: 
        !          9852: static void
        !          9853: xmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
        !          9854: {
        !          9855:     xmlSchemaRedefPtr prev;
        !          9856: 
        !          9857:     while (redef != NULL) {
        !          9858:        prev = redef;
        !          9859:        redef = redef->next;
        !          9860:        xmlFree(prev);
        !          9861:     }
        !          9862: }
        !          9863: 
        !          9864: static void
        !          9865: xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
        !          9866: {
        !          9867:     /*
        !          9868:     * After the construction context has been freed, there will be
        !          9869:     * no schema graph available any more. Only the schema buckets
        !          9870:     * will stay alive, which are put into the "schemasImports" and
        !          9871:     * "includes" slots of the xmlSchema.
        !          9872:     */
        !          9873:     if (con->buckets != NULL)
        !          9874:        xmlSchemaItemListFree(con->buckets);
        !          9875:     if (con->pending != NULL)
        !          9876:        xmlSchemaItemListFree(con->pending);
        !          9877:     if (con->substGroups != NULL)
        !          9878:        xmlHashFree(con->substGroups,
        !          9879:            (xmlHashDeallocator) xmlSchemaSubstGroupFree);
        !          9880:     if (con->redefs != NULL)
        !          9881:        xmlSchemaRedefListFree(con->redefs);
        !          9882:     if (con->dict != NULL)
        !          9883:        xmlDictFree(con->dict);
        !          9884:     xmlFree(con);
        !          9885: }
        !          9886: 
        !          9887: static xmlSchemaConstructionCtxtPtr
        !          9888: xmlSchemaConstructionCtxtCreate(xmlDictPtr dict)
        !          9889: {
        !          9890:     xmlSchemaConstructionCtxtPtr ret;
        !          9891: 
        !          9892:     ret = (xmlSchemaConstructionCtxtPtr)
        !          9893:        xmlMalloc(sizeof(xmlSchemaConstructionCtxt));
        !          9894:     if (ret == NULL) {
        !          9895:         xmlSchemaPErrMemory(NULL,
        !          9896:            "allocating schema construction context", NULL);
        !          9897:         return (NULL);
        !          9898:     }
        !          9899:     memset(ret, 0, sizeof(xmlSchemaConstructionCtxt));
        !          9900: 
        !          9901:     ret->buckets = xmlSchemaItemListCreate();
        !          9902:     if (ret->buckets == NULL) {
        !          9903:        xmlSchemaPErrMemory(NULL,
        !          9904:            "allocating list of schema buckets", NULL);
        !          9905:        xmlFree(ret);
        !          9906:         return (NULL);
        !          9907:     }
        !          9908:     ret->pending = xmlSchemaItemListCreate();
        !          9909:     if (ret->pending == NULL) {
        !          9910:        xmlSchemaPErrMemory(NULL,
        !          9911:            "allocating list of pending global components", NULL);
        !          9912:        xmlSchemaConstructionCtxtFree(ret);
        !          9913:         return (NULL);
        !          9914:     }
        !          9915:     ret->dict = dict;
        !          9916:     xmlDictReference(dict);
        !          9917:     return(ret);
        !          9918: }
        !          9919: 
        !          9920: static xmlSchemaParserCtxtPtr
        !          9921: xmlSchemaParserCtxtCreate(void)
        !          9922: {
        !          9923:     xmlSchemaParserCtxtPtr ret;
        !          9924: 
        !          9925:     ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt));
        !          9926:     if (ret == NULL) {
        !          9927:         xmlSchemaPErrMemory(NULL, "allocating schema parser context",
        !          9928:                             NULL);
        !          9929:         return (NULL);
        !          9930:     }
        !          9931:     memset(ret, 0, sizeof(xmlSchemaParserCtxt));
        !          9932:     ret->type = XML_SCHEMA_CTXT_PARSER;
        !          9933:     ret->attrProhibs = xmlSchemaItemListCreate();
        !          9934:     if (ret->attrProhibs == NULL) {
        !          9935:        xmlFree(ret);
        !          9936:        return(NULL);
        !          9937:     }
        !          9938:     return(ret);
        !          9939: }
        !          9940: 
        !          9941: /**
        !          9942:  * xmlSchemaNewParserCtxtUseDict:
        !          9943:  * @URL:  the location of the schema
        !          9944:  * @dict: the dictionary to be used
        !          9945:  *
        !          9946:  * Create an XML Schemas parse context for that file/resource expected
        !          9947:  * to contain an XML Schemas file.
        !          9948:  *
        !          9949:  * Returns the parser context or NULL in case of error
        !          9950:  */
        !          9951: static xmlSchemaParserCtxtPtr
        !          9952: xmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict)
        !          9953: {
        !          9954:     xmlSchemaParserCtxtPtr ret;
        !          9955: 
        !          9956:     ret = xmlSchemaParserCtxtCreate();
        !          9957:     if (ret == NULL)
        !          9958:         return (NULL);
        !          9959:     ret->dict = dict;
        !          9960:     xmlDictReference(dict);
        !          9961:     if (URL != NULL)
        !          9962:        ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1);
        !          9963:     return (ret);
        !          9964: }
        !          9965: 
        !          9966: static int
        !          9967: xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
        !          9968: {
        !          9969:     if (vctxt->pctxt == NULL) {
        !          9970:         if (vctxt->schema != NULL)
        !          9971:            vctxt->pctxt =
        !          9972:                xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict);
        !          9973:        else
        !          9974:            vctxt->pctxt = xmlSchemaNewParserCtxt("*");
        !          9975:        if (vctxt->pctxt == NULL) {
        !          9976:            VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt",
        !          9977:                "failed to create a temp. parser context");
        !          9978:            return (-1);
        !          9979:        }
        !          9980:        /* TODO: Pass user data. */
        !          9981:        xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
        !          9982:            vctxt->warning, vctxt->errCtxt);
        !          9983:        xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
        !          9984:            vctxt->errCtxt);
        !          9985:     }
        !          9986:     return (0);
        !          9987: }
        !          9988: 
        !          9989: /**
        !          9990:  * xmlSchemaGetSchemaBucket:
        !          9991:  * @pctxt: the schema parser context
        !          9992:  * @schemaLocation: the URI of the schema document
        !          9993:  *
        !          9994:  * Returns a schema bucket if it was already parsed.
        !          9995:  *
        !          9996:  * Returns a schema bucket if it was already parsed from
        !          9997:  *         @schemaLocation, NULL otherwise.
        !          9998:  */
        !          9999: static xmlSchemaBucketPtr
        !          10000: xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
        !          10001:                            const xmlChar *schemaLocation)
        !          10002: {
        !          10003:     xmlSchemaBucketPtr cur;
        !          10004:     xmlSchemaItemListPtr list;
        !          10005: 
        !          10006:     list = pctxt->constructor->buckets;
        !          10007:     if (list->nbItems == 0)
        !          10008:        return(NULL);
        !          10009:     else {
        !          10010:        int i;
        !          10011:        for (i = 0; i < list->nbItems; i++) {
        !          10012:            cur = (xmlSchemaBucketPtr) list->items[i];
        !          10013:            /* Pointer comparison! */
        !          10014:            if (cur->schemaLocation == schemaLocation)
        !          10015:                return(cur);
        !          10016:        }
        !          10017:     }
        !          10018:     return(NULL);
        !          10019: }
        !          10020: 
        !          10021: static xmlSchemaBucketPtr
        !          10022: xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
        !          10023:                                     const xmlChar *schemaLocation,
        !          10024:                                     const xmlChar *targetNamespace)
        !          10025: {
        !          10026:     xmlSchemaBucketPtr cur;
        !          10027:     xmlSchemaItemListPtr list;
        !          10028: 
        !          10029:     list = pctxt->constructor->buckets;
        !          10030:     if (list->nbItems == 0)
        !          10031:        return(NULL);
        !          10032:     else {
        !          10033:        int i;
        !          10034:        for (i = 0; i < list->nbItems; i++) {
        !          10035:            cur = (xmlSchemaBucketPtr) list->items[i];
        !          10036:            /* Pointer comparison! */
        !          10037:            if ((cur->origTargetNamespace == NULL) &&
        !          10038:                (cur->schemaLocation == schemaLocation) &&
        !          10039:                (cur->targetNamespace == targetNamespace))
        !          10040:                return(cur);
        !          10041:        }
        !          10042:     }
        !          10043:     return(NULL);
        !          10044: }
        !          10045: 
        !          10046: 
        !          10047: #define IS_BAD_SCHEMA_DOC(b) \
        !          10048:     (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
        !          10049: 
        !          10050: static xmlSchemaBucketPtr
        !          10051: xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
        !          10052:                                 const xmlChar *targetNamespace,
        !          10053:                                 int imported)
        !          10054: {
        !          10055:     xmlSchemaBucketPtr cur;
        !          10056:     xmlSchemaItemListPtr list;
        !          10057: 
        !          10058:     list = pctxt->constructor->buckets;
        !          10059:     if (list->nbItems == 0)
        !          10060:        return(NULL);
        !          10061:     else {
        !          10062:        int i;
        !          10063:        for (i = 0; i < list->nbItems; i++) {
        !          10064:            cur = (xmlSchemaBucketPtr) list->items[i];
        !          10065:            if ((! IS_BAD_SCHEMA_DOC(cur)) &&
        !          10066:                (cur->origTargetNamespace == targetNamespace) &&
        !          10067:                ((imported && cur->imported) ||
        !          10068:                 ((!imported) && (!cur->imported))))
        !          10069:                return(cur);
        !          10070:        }
        !          10071:     }
        !          10072:     return(NULL);
        !          10073: }
        !          10074: 
        !          10075: static int
        !          10076: xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
        !          10077:                     xmlSchemaPtr schema,
        !          10078:                     xmlSchemaBucketPtr bucket)
        !          10079: {
        !          10080:     int oldFlags;
        !          10081:     xmlDocPtr oldDoc;
        !          10082:     xmlNodePtr node;
        !          10083:     int ret, oldErrs;
        !          10084:     xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
        !          10085: 
        !          10086:     /*
        !          10087:     * Save old values; reset the *main* schema.
        !          10088:     * URGENT TODO: This is not good; move the per-document information
        !          10089:     * to the parser. Get rid of passing the main schema to the
        !          10090:     * parsing functions.
        !          10091:     */
        !          10092:     oldFlags = schema->flags;
        !          10093:     oldDoc = schema->doc;
        !          10094:     if (schema->flags != 0)
        !          10095:        xmlSchemaClearSchemaDefaults(schema);
        !          10096:     schema->doc = bucket->doc;
        !          10097:     pctxt->schema = schema;
        !          10098:     /*
        !          10099:     * Keep the current target namespace on the parser *not* on the
        !          10100:     * main schema.
        !          10101:     */
        !          10102:     pctxt->targetNamespace = bucket->targetNamespace;
        !          10103:     WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
        !          10104: 
        !          10105:     if ((bucket->targetNamespace != NULL) &&
        !          10106:        xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
        !          10107:        /*
        !          10108:        * We are parsing the schema for schemas!
        !          10109:        */
        !          10110:        pctxt->isS4S = 1;
        !          10111:     }
        !          10112:     /* Mark it as parsed, even if parsing fails. */
        !          10113:     bucket->parsed++;
        !          10114:     /* Compile the schema doc. */
        !          10115:     node = xmlDocGetRootElement(bucket->doc);
        !          10116:     ret = xmlSchemaParseSchemaElement(pctxt, schema, node);
        !          10117:     if (ret != 0)
        !          10118:        goto exit;
        !          10119:     /* An empty schema; just get out. */
        !          10120:     if (node->children == NULL)
        !          10121:        goto exit;
        !          10122:     oldErrs = pctxt->nberrors;
        !          10123:     ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children);
        !          10124:     if (ret != 0)
        !          10125:        goto exit;
        !          10126:     /*
        !          10127:     * TODO: Not nice, but I'm not 100% sure we will get always an error
        !          10128:     * as a result of the obove functions; so better rely on pctxt->err
        !          10129:     * as well.
        !          10130:     */
        !          10131:     if ((ret == 0) && (oldErrs != pctxt->nberrors)) {
        !          10132:        ret = pctxt->err;
        !          10133:        goto exit;
        !          10134:     }
        !          10135: 
        !          10136: exit:
        !          10137:     WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
        !          10138:     /* Restore schema values. */
        !          10139:     schema->doc = oldDoc;
        !          10140:     schema->flags = oldFlags;
        !          10141:     return(ret);
        !          10142: }
        !          10143: 
        !          10144: static int
        !          10145: xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
        !          10146:                     xmlSchemaPtr schema,
        !          10147:                     xmlSchemaBucketPtr bucket)
        !          10148: {
        !          10149:     xmlSchemaParserCtxtPtr newpctxt;
        !          10150:     int res = 0;
        !          10151: 
        !          10152:     if (bucket == NULL)
        !          10153:        return(0);
        !          10154:     if (bucket->parsed) {
        !          10155:        PERROR_INT("xmlSchemaParseNewDoc",
        !          10156:            "reparsing a schema doc");
        !          10157:        return(-1);
        !          10158:     }
        !          10159:     if (bucket->doc == NULL) {
        !          10160:        PERROR_INT("xmlSchemaParseNewDoc",
        !          10161:            "parsing a schema doc, but there's no doc");
        !          10162:        return(-1);
        !          10163:     }
        !          10164:     if (pctxt->constructor == NULL) {
        !          10165:        PERROR_INT("xmlSchemaParseNewDoc",
        !          10166:            "no constructor");
        !          10167:        return(-1);
        !          10168:     }
        !          10169:     /* Create and init the temporary parser context. */
        !          10170:     newpctxt = xmlSchemaNewParserCtxtUseDict(
        !          10171:        (const char *) bucket->schemaLocation, pctxt->dict);
        !          10172:     if (newpctxt == NULL)
        !          10173:        return(-1);
        !          10174:     newpctxt->constructor = pctxt->constructor;
        !          10175:     /*
        !          10176:     * TODO: Can we avoid that the parser knows about the main schema?
        !          10177:     * It would be better if he knows about the current schema bucket
        !          10178:     * only.
        !          10179:     */
        !          10180:     newpctxt->schema = schema;
        !          10181:     xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
        !          10182:        pctxt->errCtxt);
        !          10183:     xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
        !          10184:        pctxt->errCtxt);
        !          10185:     newpctxt->counter = pctxt->counter;
        !          10186: 
        !          10187: 
        !          10188:     res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket);
        !          10189: 
        !          10190:     /* Channel back errors and cleanup the temporary parser context. */
        !          10191:     if (res != 0)
        !          10192:        pctxt->err = res;
        !          10193:     pctxt->nberrors += newpctxt->nberrors;
        !          10194:     pctxt->counter = newpctxt->counter;
        !          10195:     newpctxt->constructor = NULL;
        !          10196:     /* Free the parser context. */
        !          10197:     xmlSchemaFreeParserCtxt(newpctxt);
        !          10198:     return(res);
        !          10199: }
        !          10200: 
        !          10201: static void
        !          10202: xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
        !          10203:                                xmlSchemaSchemaRelationPtr rel)
        !          10204: {
        !          10205:     xmlSchemaSchemaRelationPtr cur = bucket->relations;
        !          10206: 
        !          10207:     if (cur == NULL) {
        !          10208:        bucket->relations = rel;
        !          10209:        return;
        !          10210:     }
        !          10211:     while (cur->next != NULL)
        !          10212:        cur = cur->next;
        !          10213:     cur->next = rel;
        !          10214: }
        !          10215: 
        !          10216: 
        !          10217: static const xmlChar *
        !          10218: xmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location,
        !          10219:                          xmlNodePtr ctxtNode)
        !          10220: {
        !          10221:     /*
        !          10222:     * Build an absolue location URI.
        !          10223:     */
        !          10224:     if (location != NULL) {
        !          10225:        if (ctxtNode == NULL)
        !          10226:            return(location);
        !          10227:        else {
        !          10228:            xmlChar *base, *URI;
        !          10229:            const xmlChar *ret = NULL;
        !          10230: 
        !          10231:            base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
        !          10232:            if (base == NULL) {
        !          10233:                URI = xmlBuildURI(location, ctxtNode->doc->URL);
        !          10234:            } else {
        !          10235:                URI = xmlBuildURI(location, base);
        !          10236:                xmlFree(base);
        !          10237:            }
        !          10238:            if (URI != NULL) {
        !          10239:                ret = xmlDictLookup(dict, URI, -1);
        !          10240:                xmlFree(URI);
        !          10241:                return(ret);
        !          10242:            }
        !          10243:        }
        !          10244:     }
        !          10245:     return(NULL);
        !          10246: }
        !          10247: 
        !          10248: 
        !          10249: 
        !          10250: /**
        !          10251:  * xmlSchemaAddSchemaDoc:
        !          10252:  * @pctxt:  a schema validation context
        !          10253:  * @schema:  the schema being built
        !          10254:  * @node:  a subtree containing XML Schema informations
        !          10255:  *
        !          10256:  * Parse an included (and to-be-redefined) XML schema document.
        !          10257:  *
        !          10258:  * Returns 0 on success, a positive error code on errors and
        !          10259:  *         -1 in case of an internal or API error.
        !          10260:  */
        !          10261: 
        !          10262: static int
        !          10263: xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
        !          10264:                int type, /* import or include or redefine */
        !          10265:                const xmlChar *schemaLocation,
        !          10266:                xmlDocPtr schemaDoc,
        !          10267:                const char *schemaBuffer,
        !          10268:                int schemaBufferLen,
        !          10269:                xmlNodePtr invokingNode,
        !          10270:                const xmlChar *sourceTargetNamespace,
        !          10271:                const xmlChar *importNamespace,
        !          10272:                xmlSchemaBucketPtr *bucket)
        !          10273: {
        !          10274:     const xmlChar *targetNamespace = NULL;
        !          10275:     xmlSchemaSchemaRelationPtr relation = NULL;
        !          10276:     xmlDocPtr doc = NULL;
        !          10277:     int res = 0, err = 0, located = 0, preserveDoc = 0;
        !          10278:     xmlSchemaBucketPtr bkt = NULL;
        !          10279: 
        !          10280:     if (bucket != NULL)
        !          10281:        *bucket = NULL;
        !          10282: 
        !          10283:     switch (type) {
        !          10284:        case XML_SCHEMA_SCHEMA_IMPORT:
        !          10285:        case XML_SCHEMA_SCHEMA_MAIN:
        !          10286:            err = XML_SCHEMAP_SRC_IMPORT;
        !          10287:            break;
        !          10288:        case XML_SCHEMA_SCHEMA_INCLUDE:
        !          10289:            err = XML_SCHEMAP_SRC_INCLUDE;
        !          10290:            break;
        !          10291:        case XML_SCHEMA_SCHEMA_REDEFINE:
        !          10292:            err = XML_SCHEMAP_SRC_REDEFINE;
        !          10293:            break;
        !          10294:     }
        !          10295: 
        !          10296: 
        !          10297:     /* Special handling for the main schema:
        !          10298:     * skip the location and relation logic and just parse the doc.
        !          10299:     * We need just a bucket to be returned in this case.
        !          10300:     */
        !          10301:     if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
        !          10302:        goto doc_load;
        !          10303: 
        !          10304:     /* Note that we expect the location to be an absulute URI. */
        !          10305:     if (schemaLocation != NULL) {
        !          10306:        bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
        !          10307:        if ((bkt != NULL) &&
        !          10308:            (pctxt->constructor->bucket == bkt)) {
        !          10309:            /* Report self-imports/inclusions/redefinitions. */
        !          10310: 
        !          10311:            xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
        !          10312:                invokingNode, NULL,
        !          10313:                "The schema must not import/include/redefine itself",
        !          10314:                NULL, NULL);
        !          10315:            goto exit;
        !          10316:        }
        !          10317:     }
        !          10318:     /*
        !          10319:     * Create a relation for the graph of schemas.
        !          10320:     */
        !          10321:     relation = xmlSchemaSchemaRelationCreate();
        !          10322:     if (relation == NULL)
        !          10323:        return(-1);
        !          10324:     xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
        !          10325:        relation);
        !          10326:     relation->type = type;
        !          10327: 
        !          10328:     /*
        !          10329:     * Save the namespace import information.
        !          10330:     */
        !          10331:     if (WXS_IS_BUCKET_IMPMAIN(type)) {
        !          10332:        relation->importNamespace = importNamespace;
        !          10333:        if (schemaLocation == NULL) {
        !          10334:            /*
        !          10335:            * No location; this is just an import of the namespace.
        !          10336:            * Note that we don't assign a bucket to the relation
        !          10337:            * in this case.
        !          10338:            */
        !          10339:            goto exit;
        !          10340:        }
        !          10341:        targetNamespace = importNamespace;
        !          10342:     }
        !          10343: 
        !          10344:     /* Did we already fetch the doc? */
        !          10345:     if (bkt != NULL) {
        !          10346:        if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) {
        !          10347:            /*
        !          10348:            * We included/redefined and then try to import a schema,
        !          10349:            * but the new location provided for import was different.
        !          10350:            */
        !          10351:            if (schemaLocation == NULL)
        !          10352:                schemaLocation = BAD_CAST "in_memory_buffer";
        !          10353:            if (!xmlStrEqual(schemaLocation,
        !          10354:                bkt->schemaLocation)) {
        !          10355:                xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
        !          10356:                    invokingNode, NULL,
        !          10357:                    "The schema document '%s' cannot be imported, since "
        !          10358:                    "it was already included or redefined",
        !          10359:                    schemaLocation, NULL);
        !          10360:                goto exit;
        !          10361:            }
        !          10362:        } else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) {
        !          10363:            /*
        !          10364:            * We imported and then try to include/redefine a schema,
        !          10365:            * but the new location provided for the include/redefine
        !          10366:            * was different.
        !          10367:            */
        !          10368:            if (schemaLocation == NULL)
        !          10369:                schemaLocation = BAD_CAST "in_memory_buffer";
        !          10370:            if (!xmlStrEqual(schemaLocation,
        !          10371:                bkt->schemaLocation)) {
        !          10372:                xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
        !          10373:                    invokingNode, NULL,
        !          10374:                    "The schema document '%s' cannot be included or "
        !          10375:                    "redefined, since it was already imported",
        !          10376:                    schemaLocation, NULL);
        !          10377:                goto exit;
        !          10378:            }
        !          10379:        }
        !          10380:     }
        !          10381: 
        !          10382:     if (WXS_IS_BUCKET_IMPMAIN(type)) {
        !          10383:        /*
        !          10384:        * Given that the schemaLocation [attribute] is only a hint, it is open
        !          10385:        * to applications to ignore all but the first <import> for a given
        !          10386:        * namespace, regardless of the �actual value� of schemaLocation, but
        !          10387:        * such a strategy risks missing useful information when new
        !          10388:        * schemaLocations are offered.
        !          10389:        *
        !          10390:        * We will use the first <import> that comes with a location.
        !          10391:        * Further <import>s *with* a location, will result in an error.
        !          10392:        * TODO: Better would be to just report a warning here, but
        !          10393:        * we'll try it this way until someone complains.
        !          10394:        *
        !          10395:        * Schema Document Location Strategy:
        !          10396:        * 3 Based on the namespace name, identify an existing schema document,
        !          10397:        * either as a resource which is an XML document or a <schema> element
        !          10398:        * information item, in some local schema repository;
        !          10399:        * 5 Attempt to resolve the namespace name to locate such a resource.
        !          10400:        *
        !          10401:        * NOTE: (3) and (5) are not supported.
        !          10402:        */
        !          10403:        if (bkt != NULL) {
        !          10404:            relation->bucket = bkt;
        !          10405:            goto exit;
        !          10406:        }
        !          10407:        bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
        !          10408:            importNamespace, 1);
        !          10409: 
        !          10410:        if (bkt != NULL) {
        !          10411:            relation->bucket = bkt;
        !          10412:            if (bkt->schemaLocation == NULL) {
        !          10413:                /* First given location of the schema; load the doc. */
        !          10414:                bkt->schemaLocation = schemaLocation;
        !          10415:            } else {
        !          10416:                if (!xmlStrEqual(schemaLocation,
        !          10417:                    bkt->schemaLocation)) {
        !          10418:                    /*
        !          10419:                    * Additional location given; just skip it.
        !          10420:                    * URGENT TODO: We should report a warning here.
        !          10421:                    * res = XML_SCHEMAP_SRC_IMPORT;
        !          10422:                    */
        !          10423:                    if (schemaLocation == NULL)
        !          10424:                        schemaLocation = BAD_CAST "in_memory_buffer";
        !          10425: 
        !          10426:                    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          10427:                        XML_SCHEMAP_WARN_SKIP_SCHEMA,
        !          10428:                        invokingNode, NULL,
        !          10429:                        "Skipping import of schema located at '%s' for the "
        !          10430:                        "namespace '%s', since this namespace was already "
        !          10431:                        "imported with the schema located at '%s'",
        !          10432:                        schemaLocation, importNamespace, bkt->schemaLocation);
        !          10433:                }
        !          10434:                goto exit;
        !          10435:            }
        !          10436:        }
        !          10437:        /*
        !          10438:        * No bucket + first location: load the doc and create a
        !          10439:        * bucket.
        !          10440:        */
        !          10441:     } else {
        !          10442:        /* <include> and <redefine> */
        !          10443:        if (bkt != NULL) {
        !          10444: 
        !          10445:            if ((bkt->origTargetNamespace == NULL) &&
        !          10446:                (bkt->targetNamespace != sourceTargetNamespace)) {
        !          10447:                xmlSchemaBucketPtr chamel;
        !          10448: 
        !          10449:                /*
        !          10450:                * Chameleon include/redefine: skip loading only if it was
        !          10451:                * aleady build for the targetNamespace of the including
        !          10452:                * schema.
        !          10453:                */
        !          10454:                /*
        !          10455:                * URGENT TODO: If the schema is a chameleon-include then copy
        !          10456:                * the components into the including schema and modify the
        !          10457:                * targetNamespace of those components, do nothing otherwise.
        !          10458:                * NOTE: This is currently worked-around by compiling the
        !          10459:                * chameleon for every destinct including targetNamespace; thus
        !          10460:                * not performant at the moment.
        !          10461:                * TODO: Check when the namespace in wildcards for chameleons
        !          10462:                * needs to be converted: before we built wildcard intersections
        !          10463:                * or after.
        !          10464:                *   Answer: after!
        !          10465:                */
        !          10466:                chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
        !          10467:                    schemaLocation, sourceTargetNamespace);
        !          10468:                if (chamel != NULL) {
        !          10469:                    /* A fitting chameleon was already parsed; NOP. */
        !          10470:                    relation->bucket = chamel;
        !          10471:                    goto exit;
        !          10472:                }
        !          10473:                /*
        !          10474:                * We need to parse the chameleon again for a different
        !          10475:                * targetNamespace.
        !          10476:                * CHAMELEON TODO: Optimize this by only parsing the
        !          10477:                * chameleon once, and then copying the components to
        !          10478:                * the new targetNamespace.
        !          10479:                */
        !          10480:                bkt = NULL;
        !          10481:            } else {
        !          10482:                relation->bucket = bkt;
        !          10483:                goto exit;
        !          10484:            }
        !          10485:        }
        !          10486:     }
        !          10487:     if ((bkt != NULL) && (bkt->doc != NULL)) {
        !          10488:        PERROR_INT("xmlSchemaAddSchemaDoc",
        !          10489:            "trying to load a schema doc, but a doc is already "
        !          10490:            "assigned to the schema bucket");
        !          10491:        goto exit_failure;
        !          10492:     }
        !          10493: 
        !          10494: doc_load:
        !          10495:     /*
        !          10496:     * Load the document.
        !          10497:     */
        !          10498:     if (schemaDoc != NULL) {
        !          10499:        doc = schemaDoc;
        !          10500:        /* Don' free this one, since it was provided by the caller. */
        !          10501:        preserveDoc = 1;
        !          10502:        /* TODO: Does the context or the doc hold the location? */
        !          10503:        if (schemaDoc->URL != NULL)
        !          10504:            schemaLocation = xmlDictLookup(pctxt->dict,
        !          10505:                schemaDoc->URL, -1);
        !          10506:         else
        !          10507:            schemaLocation = BAD_CAST "in_memory_buffer";
        !          10508:     } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) {
        !          10509:        xmlParserCtxtPtr parserCtxt;
        !          10510: 
        !          10511:        parserCtxt = xmlNewParserCtxt();
        !          10512:        if (parserCtxt == NULL) {
        !          10513:            xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, "
        !          10514:                "allocating a parser context", NULL);
        !          10515:            goto exit_failure;
        !          10516:        }
        !          10517:        if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) {
        !          10518:            /*
        !          10519:            * TODO: Do we have to burden the schema parser dict with all
        !          10520:            * the content of the schema doc?
        !          10521:            */
        !          10522:            xmlDictFree(parserCtxt->dict);
        !          10523:            parserCtxt->dict = pctxt->dict;
        !          10524:            xmlDictReference(parserCtxt->dict);
        !          10525:        }
        !          10526:        if (schemaLocation != NULL) {
        !          10527:            /* Parse from file. */
        !          10528:            doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation,
        !          10529:                NULL, SCHEMAS_PARSE_OPTIONS);
        !          10530:        } else if (schemaBuffer != NULL) {
        !          10531:            /* Parse from memory buffer. */
        !          10532:            doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen,
        !          10533:                NULL, NULL, SCHEMAS_PARSE_OPTIONS);
        !          10534:            schemaLocation = BAD_CAST "in_memory_buffer";
        !          10535:            if (doc != NULL)
        !          10536:                doc->URL = xmlStrdup(schemaLocation);
        !          10537:        }
        !          10538:        /*
        !          10539:        * For <import>:
        !          10540:        * 2.1 The referent is (a fragment of) a resource which is an
        !          10541:        * XML document (see clause 1.1), which in turn corresponds to
        !          10542:        * a <schema> element information item in a well-formed information
        !          10543:        * set, which in turn corresponds to a valid schema.
        !          10544:        * TODO: (2.1) fragments of XML documents are not supported.
        !          10545:        *
        !          10546:        * 2.2 The referent is a <schema> element information item in
        !          10547:        * a well-formed information set, which in turn corresponds
        !          10548:        * to a valid schema.
        !          10549:        * TODO: (2.2) is not supported.
        !          10550:        */
        !          10551:        if (doc == NULL) {
        !          10552:            xmlErrorPtr lerr;
        !          10553:            lerr = xmlGetLastError();
        !          10554:            /*
        !          10555:            * Check if this a parser error, or if the document could
        !          10556:            * just not be located.
        !          10557:            * TODO: Try to find specific error codes to react only on
        !          10558:            * localisation failures.
        !          10559:            */
        !          10560:            if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) {
        !          10561:                /*
        !          10562:                * We assume a parser error here.
        !          10563:                */
        !          10564:                located = 1;
        !          10565:                /* TODO: Error code ?? */
        !          10566:                res = XML_SCHEMAP_SRC_IMPORT_2_1;
        !          10567:                xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
        !          10568:                    invokingNode, NULL,
        !          10569:                    "Failed to parse the XML resource '%s'",
        !          10570:                    schemaLocation, NULL);
        !          10571:            }
        !          10572:        }
        !          10573:        xmlFreeParserCtxt(parserCtxt);
        !          10574:        if ((doc == NULL) && located)
        !          10575:            goto exit_error;
        !          10576:     } else {
        !          10577:        xmlSchemaPErr(pctxt, NULL,
        !          10578:            XML_SCHEMAP_NOTHING_TO_PARSE,
        !          10579:            "No information for parsing was provided with the "
        !          10580:            "given schema parser context.\n",
        !          10581:            NULL, NULL);
        !          10582:        goto exit_failure;
        !          10583:     }
        !          10584:     /*
        !          10585:     * Preprocess the document.
        !          10586:     */
        !          10587:     if (doc != NULL) {
        !          10588:        xmlNodePtr docElem = NULL;
        !          10589: 
        !          10590:        located = 1;
        !          10591:        docElem = xmlDocGetRootElement(doc);
        !          10592:        if (docElem == NULL) {
        !          10593:            xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT,
        !          10594:                invokingNode, NULL,
        !          10595:                "The document '%s' has no document element",
        !          10596:                schemaLocation, NULL);
        !          10597:            goto exit_error;
        !          10598:        }
        !          10599:        /*
        !          10600:        * Remove all the blank text nodes.
        !          10601:        */
        !          10602:        xmlSchemaCleanupDoc(pctxt, docElem);
        !          10603:        /*
        !          10604:        * Check the schema's top level element.
        !          10605:        */
        !          10606:        if (!IS_SCHEMA(docElem, "schema")) {
        !          10607:            xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA,
        !          10608:                invokingNode, NULL,
        !          10609:                "The XML document '%s' is not a schema document",
        !          10610:                schemaLocation, NULL);
        !          10611:            goto exit_error;
        !          10612:        }
        !          10613:        /*
        !          10614:        * Note that we don't apply a type check for the
        !          10615:        * targetNamespace value here.
        !          10616:        */
        !          10617:        targetNamespace = xmlSchemaGetProp(pctxt, docElem,
        !          10618:            "targetNamespace");
        !          10619:     }
        !          10620: 
        !          10621: /* after_doc_loading: */
        !          10622:     if ((bkt == NULL) && located) {
        !          10623:        /* Only create a bucket if the schema was located. */
        !          10624:         bkt = xmlSchemaBucketCreate(pctxt, type,
        !          10625:            targetNamespace);
        !          10626:        if (bkt == NULL)
        !          10627:            goto exit_failure;
        !          10628:     }
        !          10629:     if (bkt != NULL) {
        !          10630:        bkt->schemaLocation = schemaLocation;
        !          10631:        bkt->located = located;
        !          10632:        if (doc != NULL) {
        !          10633:            bkt->doc = doc;
        !          10634:            bkt->targetNamespace = targetNamespace;
        !          10635:            bkt->origTargetNamespace = targetNamespace;
        !          10636:            if (preserveDoc)
        !          10637:                bkt->preserveDoc = 1;
        !          10638:        }
        !          10639:        if (WXS_IS_BUCKET_IMPMAIN(type))
        !          10640:            bkt->imported++;
        !          10641:            /*
        !          10642:            * Add it to the graph of schemas.
        !          10643:            */
        !          10644:        if (relation != NULL)
        !          10645:            relation->bucket = bkt;
        !          10646:     }
        !          10647: 
        !          10648: exit:
        !          10649:     /*
        !          10650:     * Return the bucket explicitely; this is needed for the
        !          10651:     * main schema.
        !          10652:     */
        !          10653:     if (bucket != NULL)
        !          10654:        *bucket = bkt;
        !          10655:     return (0);
        !          10656: 
        !          10657: exit_error:
        !          10658:     if ((doc != NULL) && (! preserveDoc)) {
        !          10659:        xmlFreeDoc(doc);
        !          10660:        if (bkt != NULL)
        !          10661:            bkt->doc = NULL;
        !          10662:     }
        !          10663:     return(pctxt->err);
        !          10664: 
        !          10665: exit_failure:
        !          10666:     if ((doc != NULL) && (! preserveDoc)) {
        !          10667:        xmlFreeDoc(doc);
        !          10668:        if (bkt != NULL)
        !          10669:            bkt->doc = NULL;
        !          10670:     }
        !          10671:     return (-1);
        !          10672: }
        !          10673: 
        !          10674: /**
        !          10675:  * xmlSchemaParseImport:
        !          10676:  * @ctxt:  a schema validation context
        !          10677:  * @schema:  the schema being built
        !          10678:  * @node:  a subtree containing XML Schema informations
        !          10679:  *
        !          10680:  * parse a XML schema Import definition
        !          10681:  * *WARNING* this interface is highly subject to change
        !          10682:  *
        !          10683:  * Returns 0 in case of success, a positive error code if
        !          10684:  * not valid and -1 in case of an internal error.
        !          10685:  */
        !          10686: static int
        !          10687: xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
        !          10688:                      xmlNodePtr node)
        !          10689: {
        !          10690:     xmlNodePtr child;
        !          10691:     const xmlChar *namespaceName = NULL, *schemaLocation = NULL;
        !          10692:     const xmlChar *thisTargetNamespace;
        !          10693:     xmlAttrPtr attr;
        !          10694:     int ret = 0;
        !          10695:     xmlSchemaBucketPtr bucket = NULL;
        !          10696: 
        !          10697:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          10698:         return (-1);
        !          10699: 
        !          10700:     /*
        !          10701:     * Check for illegal attributes.
        !          10702:     */
        !          10703:     attr = node->properties;
        !          10704:     while (attr != NULL) {
        !          10705:        if (attr->ns == NULL) {
        !          10706:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          10707:                (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
        !          10708:                (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
        !          10709:                xmlSchemaPIllegalAttrErr(pctxt,
        !          10710:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          10711:            }
        !          10712:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          10713:            xmlSchemaPIllegalAttrErr(pctxt,
        !          10714:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          10715:        }
        !          10716:        attr = attr->next;
        !          10717:     }
        !          10718:     /*
        !          10719:     * Extract and validate attributes.
        !          10720:     */
        !          10721:     if (xmlSchemaPValAttr(pctxt, NULL, node,
        !          10722:        "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
        !          10723:        &namespaceName) != 0) {
        !          10724:        xmlSchemaPSimpleTypeErr(pctxt,
        !          10725:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          10726:            NULL, node,
        !          10727:            xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
        !          10728:            NULL, namespaceName, NULL, NULL, NULL);
        !          10729:        return (pctxt->err);
        !          10730:     }
        !          10731: 
        !          10732:     if (xmlSchemaPValAttr(pctxt, NULL, node,
        !          10733:        "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
        !          10734:        &schemaLocation) != 0) {
        !          10735:        xmlSchemaPSimpleTypeErr(pctxt,
        !          10736:            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          10737:            NULL, node,
        !          10738:            xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
        !          10739:            NULL, namespaceName, NULL, NULL, NULL);
        !          10740:        return (pctxt->err);
        !          10741:     }
        !          10742:     /*
        !          10743:     * And now for the children...
        !          10744:     */
        !          10745:     child = node->children;
        !          10746:     if (IS_SCHEMA(child, "annotation")) {
        !          10747:         /*
        !          10748:          * the annotation here is simply discarded ...
        !          10749:         * TODO: really?
        !          10750:          */
        !          10751:         child = child->next;
        !          10752:     }
        !          10753:     if (child != NULL) {
        !          10754:        xmlSchemaPContentErr(pctxt,
        !          10755:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          10756:            NULL, node, child, NULL,
        !          10757:            "(annotation?)");
        !          10758:     }
        !          10759:     /*
        !          10760:     * Apply additional constraints.
        !          10761:     *
        !          10762:     * Note that it is important to use the original @targetNamespace
        !          10763:     * (or none at all), to rule out imports of schemas _with_ a
        !          10764:     * @targetNamespace if the importing schema is a chameleon schema
        !          10765:     * (with no @targetNamespace).
        !          10766:     */
        !          10767:     thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
        !          10768:     if (namespaceName != NULL) {
        !          10769:        /*
        !          10770:        * 1.1 If the namespace [attribute] is present, then its �actual value�
        !          10771:        * must not match the �actual value� of the enclosing <schema>'s
        !          10772:        * targetNamespace [attribute].
        !          10773:        */
        !          10774:        if (xmlStrEqual(thisTargetNamespace, namespaceName)) {
        !          10775:            xmlSchemaPCustomErr(pctxt,
        !          10776:                XML_SCHEMAP_SRC_IMPORT_1_1,
        !          10777:                NULL, node,
        !          10778:                "The value of the attribute 'namespace' must not match "
        !          10779:                "the target namespace '%s' of the importing schema",
        !          10780:                thisTargetNamespace);
        !          10781:            return (pctxt->err);
        !          10782:        }
        !          10783:     } else {
        !          10784:        /*
        !          10785:        * 1.2 If the namespace [attribute] is not present, then the enclosing
        !          10786:        * <schema> must have a targetNamespace [attribute].
        !          10787:        */
        !          10788:        if (thisTargetNamespace == NULL) {
        !          10789:            xmlSchemaPCustomErr(pctxt,
        !          10790:                XML_SCHEMAP_SRC_IMPORT_1_2,
        !          10791:                NULL, node,
        !          10792:                "The attribute 'namespace' must be existent if "
        !          10793:                "the importing schema has no target namespace",
        !          10794:                NULL);
        !          10795:            return (pctxt->err);
        !          10796:        }
        !          10797:     }
        !          10798:     /*
        !          10799:     * Locate and acquire the schema document.
        !          10800:     */
        !          10801:     if (schemaLocation != NULL)
        !          10802:        schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
        !          10803:            schemaLocation, node);
        !          10804:     ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
        !          10805:        schemaLocation, NULL, NULL, 0, node, thisTargetNamespace,
        !          10806:        namespaceName, &bucket);
        !          10807: 
        !          10808:     if (ret != 0)
        !          10809:        return(ret);
        !          10810: 
        !          10811:     /*
        !          10812:     * For <import>: "It is *not* an error for the application
        !          10813:     * schema reference strategy to fail."
        !          10814:     * So just don't parse if no schema document was found.
        !          10815:     * Note that we will get no bucket if the schema could not be
        !          10816:     * located or if there was no schemaLocation.
        !          10817:     */
        !          10818:     if ((bucket == NULL) && (schemaLocation != NULL)) {
        !          10819:        xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          10820:            XML_SCHEMAP_WARN_UNLOCATED_SCHEMA,
        !          10821:            node, NULL,
        !          10822:            "Failed to locate a schema at location '%s'. "
        !          10823:            "Skipping the import", schemaLocation, NULL, NULL);
        !          10824:     }
        !          10825: 
        !          10826:     if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) {
        !          10827:        ret = xmlSchemaParseNewDoc(pctxt, schema, bucket);
        !          10828:     }
        !          10829: 
        !          10830:     return (ret);
        !          10831: }
        !          10832: 
        !          10833: static int
        !          10834: xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
        !          10835:                                     xmlSchemaPtr schema,
        !          10836:                                     xmlNodePtr node,
        !          10837:                                     xmlChar **schemaLocation,
        !          10838:                                     int type)
        !          10839: {
        !          10840:     xmlAttrPtr attr;
        !          10841: 
        !          10842:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL) ||
        !          10843:        (schemaLocation == NULL))
        !          10844:         return (-1);
        !          10845: 
        !          10846:     *schemaLocation = NULL;
        !          10847:     /*
        !          10848:     * Check for illegal attributes.
        !          10849:     * Applies for both <include> and <redefine>.
        !          10850:     */
        !          10851:     attr = node->properties;
        !          10852:     while (attr != NULL) {
        !          10853:        if (attr->ns == NULL) {
        !          10854:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          10855:                (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
        !          10856:                xmlSchemaPIllegalAttrErr(pctxt,
        !          10857:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          10858:            }
        !          10859:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          10860:            xmlSchemaPIllegalAttrErr(pctxt,
        !          10861:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          10862:        }
        !          10863:        attr = attr->next;
        !          10864:     }
        !          10865:     xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
        !          10866:     /*
        !          10867:     * Preliminary step, extract the URI-Reference and make an URI
        !          10868:     * from the base.
        !          10869:     */
        !          10870:     /*
        !          10871:     * Attribute "schemaLocation" is mandatory.
        !          10872:     */
        !          10873:     attr = xmlSchemaGetPropNode(node, "schemaLocation");
        !          10874:     if (attr != NULL) {
        !          10875:         xmlChar *base = NULL;
        !          10876:         xmlChar *uri = NULL;
        !          10877: 
        !          10878:        if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
        !          10879:            xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
        !          10880:            (const xmlChar **) schemaLocation) != 0)
        !          10881:            goto exit_error;
        !          10882:        base = xmlNodeGetBase(node->doc, node);
        !          10883:        if (base == NULL) {
        !          10884:            uri = xmlBuildURI(*schemaLocation, node->doc->URL);
        !          10885:        } else {
        !          10886:            uri = xmlBuildURI(*schemaLocation, base);
        !          10887:            xmlFree(base);
        !          10888:        }
        !          10889:        if (uri == NULL) {
        !          10890:            PERROR_INT("xmlSchemaParseIncludeOrRedefine",
        !          10891:                "could not build an URI from the schemaLocation")
        !          10892:            goto exit_failure;
        !          10893:        }
        !          10894:        (*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1);
        !          10895:        xmlFree(uri);
        !          10896:     } else {
        !          10897:        xmlSchemaPMissingAttrErr(pctxt,
        !          10898:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          10899:            NULL, node, "schemaLocation", NULL);
        !          10900:        goto exit_error;
        !          10901:     }
        !          10902:     /*
        !          10903:     * Report self-inclusion and self-redefinition.
        !          10904:     */
        !          10905:     if (xmlStrEqual(*schemaLocation, pctxt->URL)) {
        !          10906:        if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
        !          10907:            xmlSchemaPCustomErr(pctxt,
        !          10908:                XML_SCHEMAP_SRC_REDEFINE,
        !          10909:                NULL, node,
        !          10910:                "The schema document '%s' cannot redefine itself.",
        !          10911:                *schemaLocation);
        !          10912:        } else {
        !          10913:            xmlSchemaPCustomErr(pctxt,
        !          10914:                XML_SCHEMAP_SRC_INCLUDE,
        !          10915:                NULL, node,
        !          10916:                "The schema document '%s' cannot include itself.",
        !          10917:                *schemaLocation);
        !          10918:        }
        !          10919:        goto exit_error;
        !          10920:     }
        !          10921: 
        !          10922:     return(0);
        !          10923: exit_error:
        !          10924:     return(pctxt->err);
        !          10925: exit_failure:
        !          10926:     return(-1);
        !          10927: }
        !          10928: 
        !          10929: static int
        !          10930: xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
        !          10931:                                xmlSchemaPtr schema,
        !          10932:                                xmlNodePtr node,
        !          10933:                                int type)
        !          10934: {
        !          10935:     xmlNodePtr child = NULL;
        !          10936:     const xmlChar *schemaLocation = NULL;
        !          10937:     int res = 0; /* hasRedefinitions = 0 */
        !          10938:     int isChameleon = 0, wasChameleon = 0;
        !          10939:     xmlSchemaBucketPtr bucket = NULL;
        !          10940: 
        !          10941:     if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
        !          10942:         return (-1);
        !          10943: 
        !          10944:     /*
        !          10945:     * Parse attributes. Note that the returned schemaLocation will
        !          10946:     * be already converted to an absolute URI.
        !          10947:     */
        !          10948:     res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema,
        !          10949:        node, (xmlChar **) (&schemaLocation), type);
        !          10950:     if (res != 0)
        !          10951:        return(res);
        !          10952:     /*
        !          10953:     * Load and add the schema document.
        !          10954:     */
        !          10955:     res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL,
        !          10956:        NULL, 0, node, pctxt->targetNamespace, NULL, &bucket);
        !          10957:     if (res != 0)
        !          10958:        return(res);
        !          10959:     /*
        !          10960:     * If we get no schema bucket back, then this means that the schema
        !          10961:     * document could not be located or was broken XML or was not
        !          10962:     * a schema document.
        !          10963:     */
        !          10964:     if ((bucket == NULL) || (bucket->doc == NULL)) {
        !          10965:        if (type == XML_SCHEMA_SCHEMA_INCLUDE) {
        !          10966:            /*
        !          10967:            * WARNING for <include>:
        !          10968:            * We will raise an error if the schema cannot be located
        !          10969:            * for inclusions, since the that was the feedback from the
        !          10970:            * schema people. I.e. the following spec piece will *not* be
        !          10971:            * satisfied:
        !          10972:            * SPEC src-include: "It is not an error for the �actual value� of the
        !          10973:            * schemaLocation [attribute] to fail to resolve it all, in which
        !          10974:            * case no corresponding inclusion is performed.
        !          10975:            * So do we need a warning report here?"
        !          10976:            */
        !          10977:            res = XML_SCHEMAP_SRC_INCLUDE;
        !          10978:            xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
        !          10979:                node, NULL,
        !          10980:                "Failed to load the document '%s' for inclusion",
        !          10981:                schemaLocation, NULL);
        !          10982:        } else {
        !          10983:            /*
        !          10984:            * NOTE: This was changed to raise an error even if no redefinitions
        !          10985:            * are specified.
        !          10986:            *
        !          10987:            * SPEC src-redefine (1)
        !          10988:            * "If there are any element information items among the [children]
        !          10989:            * other than <annotation> then the �actual value� of the
        !          10990:            * schemaLocation [attribute] must successfully resolve."
        !          10991:            * TODO: Ask the WG if a the location has always to resolve
        !          10992:            * here as well!
        !          10993:            */
        !          10994:            res = XML_SCHEMAP_SRC_REDEFINE;
        !          10995:            xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
        !          10996:                node, NULL,
        !          10997:                "Failed to load the document '%s' for redefinition",
        !          10998:                schemaLocation, NULL);
        !          10999:        }
        !          11000:     } else {
        !          11001:        /*
        !          11002:        * Check targetNamespace sanity before parsing the new schema.
        !          11003:        * TODO: Note that we won't check further content if the
        !          11004:        * targetNamespace was bad.
        !          11005:        */
        !          11006:        if (bucket->origTargetNamespace != NULL) {
        !          11007:            /*
        !          11008:            * SPEC src-include (2.1)
        !          11009:            * "SII has a targetNamespace [attribute], and its �actual
        !          11010:            * value� is identical to the �actual value� of the targetNamespace
        !          11011:            * [attribute] of SII� (which must have such an [attribute])."
        !          11012:            */
        !          11013:            if (pctxt->targetNamespace == NULL) {
        !          11014:                xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          11015:                    XML_SCHEMAP_SRC_INCLUDE,
        !          11016:                    node, NULL,
        !          11017:                    "The target namespace of the included/redefined schema "
        !          11018:                    "'%s' has to be absent, since the including/redefining "
        !          11019:                    "schema has no target namespace",
        !          11020:                    schemaLocation, NULL);
        !          11021:                goto exit_error;
        !          11022:            } else if (!xmlStrEqual(bucket->origTargetNamespace,
        !          11023:                pctxt->targetNamespace)) {
        !          11024:                /* TODO: Change error function. */
        !          11025:                xmlSchemaPCustomErrExt(pctxt,
        !          11026:                    XML_SCHEMAP_SRC_INCLUDE,
        !          11027:                    NULL, node,
        !          11028:                    "The target namespace '%s' of the included/redefined "
        !          11029:                    "schema '%s' differs from '%s' of the "
        !          11030:                    "including/redefining schema",
        !          11031:                    bucket->origTargetNamespace, schemaLocation,
        !          11032:                    pctxt->targetNamespace);
        !          11033:                goto exit_error;
        !          11034:            }
        !          11035:        } else if (pctxt->targetNamespace != NULL) {
        !          11036:            /*
        !          11037:            * Chameleons: the original target namespace will
        !          11038:            * differ from the resulting namespace.
        !          11039:            */
        !          11040:            isChameleon = 1;
        !          11041:            if (bucket->parsed &&
        !          11042:                bucket->origTargetNamespace != NULL) {
        !          11043:                xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          11044:                    XML_SCHEMAP_SRC_INCLUDE,
        !          11045:                    node, NULL,
        !          11046:                    "The target namespace of the included/redefined schema "
        !          11047:                    "'%s' has to be absent or the same as the "
        !          11048:                    "including/redefining schema's target namespace",
        !          11049:                    schemaLocation, NULL);
        !          11050:                goto exit_error;
        !          11051:            }
        !          11052:            bucket->targetNamespace = pctxt->targetNamespace;
        !          11053:        }
        !          11054:     }
        !          11055:     /*
        !          11056:     * Parse the schema.
        !          11057:     */
        !          11058:     if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) {
        !          11059:        if (isChameleon) {
        !          11060:            /* TODO: Get rid of this flag on the schema itself. */
        !          11061:            if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
        !          11062:                schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
        !          11063:            } else
        !          11064:                wasChameleon = 1;
        !          11065:        }
        !          11066:        xmlSchemaParseNewDoc(pctxt, schema, bucket);
        !          11067:        /* Restore chameleon flag. */
        !          11068:        if (isChameleon && (!wasChameleon))
        !          11069:            schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
        !          11070:     }
        !          11071:     /*
        !          11072:     * And now for the children...
        !          11073:     */
        !          11074:     child = node->children;
        !          11075:     if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
        !          11076:        /*
        !          11077:        * Parse (simpleType | complexType | group | attributeGroup))*
        !          11078:        */
        !          11079:        pctxt->redefined = bucket;
        !          11080:        /*
        !          11081:        * How to proceed if the redefined schema was not located?
        !          11082:        */
        !          11083:        pctxt->isRedefine = 1;
        !          11084:        while (IS_SCHEMA(child, "annotation") ||
        !          11085:            IS_SCHEMA(child, "simpleType") ||
        !          11086:            IS_SCHEMA(child, "complexType") ||
        !          11087:            IS_SCHEMA(child, "group") ||
        !          11088:            IS_SCHEMA(child, "attributeGroup")) {
        !          11089:            if (IS_SCHEMA(child, "annotation")) {
        !          11090:                /*
        !          11091:                * TODO: discard or not?
        !          11092:                */
        !          11093:            } else if (IS_SCHEMA(child, "simpleType")) {
        !          11094:                xmlSchemaParseSimpleType(pctxt, schema, child, 1);
        !          11095:            } else if (IS_SCHEMA(child, "complexType")) {
        !          11096:                xmlSchemaParseComplexType(pctxt, schema, child, 1);
        !          11097:                /* hasRedefinitions = 1; */
        !          11098:            } else if (IS_SCHEMA(child, "group")) {
        !          11099:                /* hasRedefinitions = 1; */
        !          11100:                xmlSchemaParseModelGroupDefinition(pctxt,
        !          11101:                    schema, child);
        !          11102:            } else if (IS_SCHEMA(child, "attributeGroup")) {
        !          11103:                /* hasRedefinitions = 1; */
        !          11104:                xmlSchemaParseAttributeGroupDefinition(pctxt, schema,
        !          11105:                    child);
        !          11106:            }
        !          11107:            child = child->next;
        !          11108:        }
        !          11109:        pctxt->redefined = NULL;
        !          11110:        pctxt->isRedefine = 0;
        !          11111:     } else {
        !          11112:        if (IS_SCHEMA(child, "annotation")) {
        !          11113:            /*
        !          11114:            * TODO: discard or not?
        !          11115:            */
        !          11116:            child = child->next;
        !          11117:        }
        !          11118:     }
        !          11119:     if (child != NULL) {
        !          11120:        res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED;
        !          11121:        if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
        !          11122:            xmlSchemaPContentErr(pctxt, res,
        !          11123:                NULL, node, child, NULL,
        !          11124:                "(annotation | (simpleType | complexType | group | attributeGroup))*");
        !          11125:        } else {
        !          11126:             xmlSchemaPContentErr(pctxt, res,
        !          11127:                NULL, node, child, NULL,
        !          11128:                "(annotation?)");
        !          11129:        }
        !          11130:     }
        !          11131:     return(res);
        !          11132: 
        !          11133: exit_error:
        !          11134:     return(pctxt->err);
        !          11135: }
        !          11136: 
        !          11137: static int
        !          11138: xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
        !          11139:                        xmlNodePtr node)
        !          11140: {
        !          11141:     int res;
        !          11142: #ifndef ENABLE_REDEFINE
        !          11143:     TODO
        !          11144:     return(0);
        !          11145: #endif
        !          11146:     res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
        !          11147:        XML_SCHEMA_SCHEMA_REDEFINE);
        !          11148:     if (res != 0)
        !          11149:        return(res);
        !          11150:     return(0);
        !          11151: }
        !          11152: 
        !          11153: static int
        !          11154: xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
        !          11155:                        xmlNodePtr node)
        !          11156: {
        !          11157:     int res;
        !          11158: 
        !          11159:     res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
        !          11160:        XML_SCHEMA_SCHEMA_INCLUDE);
        !          11161:     if (res != 0)
        !          11162:        return(res);
        !          11163:     return(0);
        !          11164: }
        !          11165: 
        !          11166: /**
        !          11167:  * xmlSchemaParseModelGroup:
        !          11168:  * @ctxt:  a schema validation context
        !          11169:  * @schema:  the schema being built
        !          11170:  * @node:  a subtree containing XML Schema informations
        !          11171:  * @type: the "compositor" type
        !          11172:  * @particleNeeded: if a a model group with a particle
        !          11173:  *
        !          11174:  * parse a XML schema Sequence definition.
        !          11175:  * Applies parts of:
        !          11176:  *   Schema Representation Constraint:
        !          11177:  *     Redefinition Constraints and Semantics (src-redefine)
        !          11178:  *     (6.1), (6.1.1), (6.1.2)
        !          11179:  *
        !          11180:  *   Schema Component Constraint:
        !          11181:  *     All Group Limited (cos-all-limited) (2)
        !          11182:  *     TODO: Actually this should go to component-level checks,
        !          11183:  *     but is done here due to performance. Move it to an other layer
        !          11184:  *     is schema construction via an API is implemented.
        !          11185:  *
        !          11186:  * *WARNING* this interface is highly subject to change
        !          11187:  *
        !          11188:  * Returns -1 in case of error, 0 if the declaration is improper and
        !          11189:  *         1 in case of success.
        !          11190:  */
        !          11191: static xmlSchemaTreeItemPtr
        !          11192: xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          11193:                         xmlNodePtr node, xmlSchemaTypeType type,
        !          11194:                         int withParticle)
        !          11195: {
        !          11196:     xmlSchemaModelGroupPtr item;
        !          11197:     xmlSchemaParticlePtr particle = NULL;
        !          11198:     xmlNodePtr child = NULL;
        !          11199:     xmlAttrPtr attr;
        !          11200:     int min = 1, max = 1, isElemRef, hasRefs = 0;
        !          11201: 
        !          11202:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          11203:         return (NULL);
        !          11204:     /*
        !          11205:     * Create a model group with the given compositor.
        !          11206:     */
        !          11207:     item = xmlSchemaAddModelGroup(ctxt, schema, type, node);
        !          11208:     if (item == NULL)
        !          11209:        return (NULL);
        !          11210: 
        !          11211:     if (withParticle) {
        !          11212:        if (type == XML_SCHEMA_TYPE_ALL) {
        !          11213:            min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)");
        !          11214:            max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1");
        !          11215:        } else {
        !          11216:            /* choice + sequence */
        !          11217:            min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
        !          11218:            max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
        !          11219:                "(xs:nonNegativeInteger | unbounded)");
        !          11220:        }
        !          11221:        xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
        !          11222:        /*
        !          11223:        * Create a particle
        !          11224:        */
        !          11225:        particle = xmlSchemaAddParticle(ctxt, node, min, max);
        !          11226:        if (particle == NULL)
        !          11227:            return (NULL);
        !          11228:        particle->children = (xmlSchemaTreeItemPtr) item;
        !          11229:        /*
        !          11230:        * Check for illegal attributes.
        !          11231:        */
        !          11232:        attr = node->properties;
        !          11233:        while (attr != NULL) {
        !          11234:            if (attr->ns == NULL) {
        !          11235:                if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          11236:                    (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
        !          11237:                    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) {
        !          11238:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          11239:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11240:                }
        !          11241:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          11242:                xmlSchemaPIllegalAttrErr(ctxt,
        !          11243:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11244:            }
        !          11245:            attr = attr->next;
        !          11246:        }
        !          11247:     } else {
        !          11248:        /*
        !          11249:        * Check for illegal attributes.
        !          11250:        */
        !          11251:        attr = node->properties;
        !          11252:        while (attr != NULL) {
        !          11253:            if (attr->ns == NULL) {
        !          11254:                if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
        !          11255:                    xmlSchemaPIllegalAttrErr(ctxt,
        !          11256:                        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11257:                }
        !          11258:            } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          11259:                xmlSchemaPIllegalAttrErr(ctxt,
        !          11260:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11261:            }
        !          11262:            attr = attr->next;
        !          11263:        }
        !          11264:     }
        !          11265: 
        !          11266:     /*
        !          11267:     * Extract and validate attributes.
        !          11268:     */
        !          11269:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          11270:     /*
        !          11271:     * And now for the children...
        !          11272:     */
        !          11273:     child = node->children;
        !          11274:     if (IS_SCHEMA(child, "annotation")) {
        !          11275:         item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          11276:         child = child->next;
        !          11277:     }
        !          11278:     if (type == XML_SCHEMA_TYPE_ALL) {
        !          11279:        xmlSchemaParticlePtr part, last = NULL;
        !          11280: 
        !          11281:        while (IS_SCHEMA(child, "element")) {
        !          11282:            part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
        !          11283:                schema, child, &isElemRef, 0);
        !          11284:            /*
        !          11285:            * SPEC cos-all-limited (2)
        !          11286:            * "The {max occurs} of all the particles in the {particles}
        !          11287:            * of the ('all') group must be 0 or 1.
        !          11288:            */
        !          11289:            if (part != NULL) {
        !          11290:                if (isElemRef)
        !          11291:                    hasRefs++;
        !          11292:                if (part->minOccurs > 1) {
        !          11293:                    xmlSchemaPCustomErr(ctxt,
        !          11294:                        XML_SCHEMAP_COS_ALL_LIMITED,
        !          11295:                        NULL, child,
        !          11296:                        "Invalid value for minOccurs (must be 0 or 1)",
        !          11297:                        NULL);
        !          11298:                    /* Reset to 1. */
        !          11299:                    part->minOccurs = 1;
        !          11300:                }
        !          11301:                if (part->maxOccurs > 1) {
        !          11302:                    xmlSchemaPCustomErr(ctxt,
        !          11303:                        XML_SCHEMAP_COS_ALL_LIMITED,
        !          11304:                        NULL, child,
        !          11305:                        "Invalid value for maxOccurs (must be 0 or 1)",
        !          11306:                        NULL);
        !          11307:                    /* Reset to 1. */
        !          11308:                    part->maxOccurs = 1;
        !          11309:                }
        !          11310:                if (last == NULL)
        !          11311:                    item->children = (xmlSchemaTreeItemPtr) part;
        !          11312:                else
        !          11313:                    last->next = (xmlSchemaTreeItemPtr) part;
        !          11314:                last = part;
        !          11315:            }
        !          11316:            child = child->next;
        !          11317:        }
        !          11318:        if (child != NULL) {
        !          11319:            xmlSchemaPContentErr(ctxt,
        !          11320:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11321:                NULL, node, child, NULL,
        !          11322:                "(annotation?, (annotation?, element*)");
        !          11323:        }
        !          11324:     } else {
        !          11325:        /* choice + sequence */
        !          11326:        xmlSchemaTreeItemPtr part = NULL, last = NULL;
        !          11327: 
        !          11328:        while ((IS_SCHEMA(child, "element")) ||
        !          11329:            (IS_SCHEMA(child, "group")) ||
        !          11330:            (IS_SCHEMA(child, "any")) ||
        !          11331:            (IS_SCHEMA(child, "choice")) ||
        !          11332:            (IS_SCHEMA(child, "sequence"))) {
        !          11333: 
        !          11334:            if (IS_SCHEMA(child, "element")) {
        !          11335:                part = (xmlSchemaTreeItemPtr)
        !          11336:                    xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0);
        !          11337:                if (part && isElemRef)
        !          11338:                    hasRefs++;
        !          11339:            } else if (IS_SCHEMA(child, "group")) {
        !          11340:                part =
        !          11341:                    xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
        !          11342:                if (part != NULL)
        !          11343:                    hasRefs++;
        !          11344:                /*
        !          11345:                * Handle redefinitions.
        !          11346:                */
        !          11347:                if (ctxt->isRedefine && ctxt->redef &&
        !          11348:                    (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
        !          11349:                    part && part->children)
        !          11350:                {
        !          11351:                    if ((xmlSchemaGetQNameRefName(part->children) ==
        !          11352:                            ctxt->redef->refName) &&
        !          11353:                        (xmlSchemaGetQNameRefTargetNs(part->children) ==
        !          11354:                            ctxt->redef->refTargetNs))
        !          11355:                    {
        !          11356:                        /*
        !          11357:                        * SPEC src-redefine:
        !          11358:                        * (6.1) "If it has a <group> among its contents at
        !          11359:                        * some level the �actual value� of whose ref
        !          11360:                        * [attribute] is the same as the �actual value� of
        !          11361:                        * its own name attribute plus target namespace, then
        !          11362:                        * all of the following must be true:"
        !          11363:                        * (6.1.1) "It must have exactly one such group."
        !          11364:                        */
        !          11365:                        if (ctxt->redefCounter != 0) {
        !          11366:                            xmlChar *str = NULL;
        !          11367: 
        !          11368:                            xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          11369:                                XML_SCHEMAP_SRC_REDEFINE, child, NULL,
        !          11370:                                "The redefining model group definition "
        !          11371:                                "'%s' must not contain more than one "
        !          11372:                                "reference to the redefined definition",
        !          11373:                                xmlSchemaFormatQName(&str,
        !          11374:                                    ctxt->redef->refTargetNs,
        !          11375:                                    ctxt->redef->refName),
        !          11376:                                NULL);
        !          11377:                            FREE_AND_NULL(str)
        !          11378:                            part = NULL;
        !          11379:                        } else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
        !          11380:                            ((WXS_PARTICLE(part))->maxOccurs != 1))
        !          11381:                        {
        !          11382:                            xmlChar *str = NULL;
        !          11383:                            /*
        !          11384:                            * SPEC src-redefine:
        !          11385:                            * (6.1.2) "The �actual value� of both that
        !          11386:                            * group's minOccurs and maxOccurs [attribute]
        !          11387:                            * must be 1 (or �absent�).
        !          11388:                            */
        !          11389:                            xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          11390:                                XML_SCHEMAP_SRC_REDEFINE, child, NULL,
        !          11391:                                "The redefining model group definition "
        !          11392:                                "'%s' must not contain a reference to the "
        !          11393:                                "redefined definition with a "
        !          11394:                                "maxOccurs/minOccurs other than 1",
        !          11395:                                xmlSchemaFormatQName(&str,
        !          11396:                                    ctxt->redef->refTargetNs,
        !          11397:                                    ctxt->redef->refName),
        !          11398:                                NULL);
        !          11399:                            FREE_AND_NULL(str)
        !          11400:                            part = NULL;
        !          11401:                        }
        !          11402:                        ctxt->redef->reference = WXS_BASIC_CAST part;
        !          11403:                        ctxt->redefCounter++;
        !          11404:                    }
        !          11405:                }
        !          11406:            } else if (IS_SCHEMA(child, "any")) {
        !          11407:                part = (xmlSchemaTreeItemPtr)
        !          11408:                    xmlSchemaParseAny(ctxt, schema, child);
        !          11409:            } else if (IS_SCHEMA(child, "choice")) {
        !          11410:                part = xmlSchemaParseModelGroup(ctxt, schema, child,
        !          11411:                    XML_SCHEMA_TYPE_CHOICE, 1);
        !          11412:            } else if (IS_SCHEMA(child, "sequence")) {
        !          11413:                part = xmlSchemaParseModelGroup(ctxt, schema, child,
        !          11414:                    XML_SCHEMA_TYPE_SEQUENCE, 1);
        !          11415:            }
        !          11416:            if (part != NULL) {
        !          11417:                if (last == NULL)
        !          11418:                    item->children = part;
        !          11419:                else
        !          11420:                    last->next = part;
        !          11421:                last = part;
        !          11422:            }
        !          11423:            child = child->next;
        !          11424:        }
        !          11425:        if (child != NULL) {
        !          11426:            xmlSchemaPContentErr(ctxt,
        !          11427:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11428:                NULL, node, child, NULL,
        !          11429:                "(annotation?, (element | group | choice | sequence | any)*)");
        !          11430:        }
        !          11431:     }
        !          11432:     if ((max == 0) && (min == 0))
        !          11433:        return (NULL);
        !          11434:     if (hasRefs) {
        !          11435:        /*
        !          11436:        * We need to resolve references.
        !          11437:        */
        !          11438:        WXS_ADD_PENDING(ctxt, item);
        !          11439:     }
        !          11440:     if (withParticle)
        !          11441:        return ((xmlSchemaTreeItemPtr) particle);
        !          11442:     else
        !          11443:        return ((xmlSchemaTreeItemPtr) item);
        !          11444: }
        !          11445: 
        !          11446: /**
        !          11447:  * xmlSchemaParseRestriction:
        !          11448:  * @ctxt:  a schema validation context
        !          11449:  * @schema:  the schema being built
        !          11450:  * @node:  a subtree containing XML Schema informations
        !          11451:  *
        !          11452:  * parse a XML schema Restriction definition
        !          11453:  * *WARNING* this interface is highly subject to change
        !          11454:  *
        !          11455:  * Returns the type definition or NULL in case of error
        !          11456:  */
        !          11457: static xmlSchemaTypePtr
        !          11458: xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          11459:                           xmlNodePtr node, xmlSchemaTypeType parentType)
        !          11460: {
        !          11461:     xmlSchemaTypePtr type;
        !          11462:     xmlNodePtr child = NULL;
        !          11463:     xmlAttrPtr attr;
        !          11464: 
        !          11465:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          11466:         return (NULL);
        !          11467:     /* Not a component, don't create it. */
        !          11468:     type = ctxt->ctxtType;
        !          11469:     type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
        !          11470: 
        !          11471:     /*
        !          11472:     * Check for illegal attributes.
        !          11473:     */
        !          11474:     attr = node->properties;
        !          11475:     while (attr != NULL) {
        !          11476:        if (attr->ns == NULL) {
        !          11477:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          11478:                (!xmlStrEqual(attr->name, BAD_CAST "base"))) {
        !          11479:                xmlSchemaPIllegalAttrErr(ctxt,
        !          11480:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11481:            }
        !          11482:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          11483:            xmlSchemaPIllegalAttrErr(ctxt,
        !          11484:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11485:        }
        !          11486:        attr = attr->next;
        !          11487:     }
        !          11488:     /*
        !          11489:     * Extract and validate attributes.
        !          11490:     */
        !          11491:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          11492:     /*
        !          11493:     * Attribute
        !          11494:     */
        !          11495:     /*
        !          11496:     * Extract the base type. The "base" attribute is mandatory if inside
        !          11497:     * a complex type or if redefining.
        !          11498:     *
        !          11499:     * SPEC (1.2) "...otherwise (<restriction> has no <simpleType> "
        !          11500:     * among its [children]), the simple type definition which is
        !          11501:     * the {content type} of the type definition �resolved� to by
        !          11502:     * the �actual value� of the base [attribute]"
        !          11503:     */
        !          11504:     if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base",
        !          11505:        &(type->baseNs), &(type->base)) == 0)
        !          11506:     {
        !          11507:        if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) {
        !          11508:            xmlSchemaPMissingAttrErr(ctxt,
        !          11509:                XML_SCHEMAP_S4S_ATTR_MISSING,
        !          11510:                NULL, node, "base", NULL);
        !          11511:        } else if ((ctxt->isRedefine) &&
        !          11512:            (type->flags & XML_SCHEMAS_TYPE_GLOBAL))
        !          11513:        {
        !          11514:            if (type->base == NULL) {
        !          11515:                xmlSchemaPMissingAttrErr(ctxt,
        !          11516:                    XML_SCHEMAP_S4S_ATTR_MISSING,
        !          11517:                    NULL, node, "base", NULL);
        !          11518:            } else if ((! xmlStrEqual(type->base, type->name)) ||
        !          11519:                (! xmlStrEqual(type->baseNs, type->targetNamespace)))
        !          11520:            {
        !          11521:                xmlChar *str1 = NULL, *str2 = NULL;
        !          11522:                /*
        !          11523:                * REDEFINE: SPEC src-redefine (5)
        !          11524:                * "Within the [children], each <simpleType> must have a
        !          11525:                * <restriction> among its [children] ... the �actual value� of
        !          11526:                * whose base [attribute] must be the same as the �actual value�
        !          11527:                * of its own name attribute plus target namespace;"
        !          11528:                */
        !          11529:                xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE,
        !          11530:                    NULL, node, "This is a redefinition, but the QName "
        !          11531:                    "value '%s' of the 'base' attribute does not match the "
        !          11532:                    "type's designation '%s'",
        !          11533:                    xmlSchemaFormatQName(&str1, type->baseNs, type->base),
        !          11534:                    xmlSchemaFormatQName(&str2, type->targetNamespace,
        !          11535:                        type->name), NULL);
        !          11536:                FREE_AND_NULL(str1);
        !          11537:                FREE_AND_NULL(str2);
        !          11538:                /* Avoid confusion and erase the values. */
        !          11539:                type->base = NULL;
        !          11540:                type->baseNs = NULL;
        !          11541:            }
        !          11542:        }
        !          11543:     }
        !          11544:     /*
        !          11545:     * And now for the children...
        !          11546:     */
        !          11547:     child = node->children;
        !          11548:     if (IS_SCHEMA(child, "annotation")) {
        !          11549:        /*
        !          11550:        * Add the annotation to the simple type ancestor.
        !          11551:        */
        !          11552:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          11553:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          11554:         child = child->next;
        !          11555:     }
        !          11556:     if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
        !          11557:        /*
        !          11558:        * Corresponds to <simpleType><restriction><simpleType>.
        !          11559:        */
        !          11560:        if (IS_SCHEMA(child, "simpleType")) {
        !          11561:            if (type->base != NULL) {
        !          11562:                /*
        !          11563:                * src-restriction-base-or-simpleType
        !          11564:                * Either the base [attribute] or the simpleType [child] of the
        !          11565:                * <restriction> element must be present, but not both.
        !          11566:                */
        !          11567:                xmlSchemaPContentErr(ctxt,
        !          11568:                    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
        !          11569:                    NULL, node, child,
        !          11570:                    "The attribute 'base' and the <simpleType> child are "
        !          11571:                    "mutually exclusive", NULL);
        !          11572:            } else {
        !          11573:                type->baseType = (xmlSchemaTypePtr)
        !          11574:                    xmlSchemaParseSimpleType(ctxt, schema, child, 0);
        !          11575:            }
        !          11576:            child = child->next;
        !          11577:        } else if (type->base == NULL) {
        !          11578:            xmlSchemaPContentErr(ctxt,
        !          11579:                XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
        !          11580:                NULL, node, child,
        !          11581:                "Either the attribute 'base' or a <simpleType> child "
        !          11582:                "must be present", NULL);
        !          11583:        }
        !          11584:     } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
        !          11585:        /*
        !          11586:        * Corresponds to <complexType><complexContent><restriction>...
        !          11587:        * followed by:
        !          11588:        *
        !          11589:        * Model groups <all>, <choice> and <sequence>.
        !          11590:        */
        !          11591:        if (IS_SCHEMA(child, "all")) {
        !          11592:            type->subtypes = (xmlSchemaTypePtr)
        !          11593:                xmlSchemaParseModelGroup(ctxt, schema, child,
        !          11594:                    XML_SCHEMA_TYPE_ALL, 1);
        !          11595:            child = child->next;
        !          11596:        } else if (IS_SCHEMA(child, "choice")) {
        !          11597:            type->subtypes = (xmlSchemaTypePtr)
        !          11598:                xmlSchemaParseModelGroup(ctxt,
        !          11599:                    schema, child, XML_SCHEMA_TYPE_CHOICE, 1);
        !          11600:            child = child->next;
        !          11601:        } else if (IS_SCHEMA(child, "sequence")) {
        !          11602:            type->subtypes = (xmlSchemaTypePtr)
        !          11603:                xmlSchemaParseModelGroup(ctxt, schema, child,
        !          11604:                    XML_SCHEMA_TYPE_SEQUENCE, 1);
        !          11605:            child = child->next;
        !          11606:        /*
        !          11607:        * Model group reference <group>.
        !          11608:        */
        !          11609:        } else if (IS_SCHEMA(child, "group")) {
        !          11610:            type->subtypes = (xmlSchemaTypePtr)
        !          11611:                xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
        !          11612:            /*
        !          11613:            * Note that the reference will be resolved in
        !          11614:            * xmlSchemaResolveTypeReferences();
        !          11615:            */
        !          11616:            child = child->next;
        !          11617:        }
        !          11618:     } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
        !          11619:        /*
        !          11620:        * Corresponds to <complexType><simpleContent><restriction>...
        !          11621:        *
        !          11622:        * "1.1 the simple type definition corresponding to the <simpleType>
        !          11623:        * among the [children] of <restriction> if there is one;"
        !          11624:        */
        !          11625:        if (IS_SCHEMA(child, "simpleType")) {
        !          11626:            /*
        !          11627:            * We will store the to-be-restricted simple type in
        !          11628:            * type->contentTypeDef *temporarily*.
        !          11629:            */
        !          11630:            type->contentTypeDef = (xmlSchemaTypePtr)
        !          11631:                xmlSchemaParseSimpleType(ctxt, schema, child, 0);
        !          11632:            if ( type->contentTypeDef == NULL)
        !          11633:                return (NULL);
        !          11634:            child = child->next;
        !          11635:        }
        !          11636:     }
        !          11637: 
        !          11638:     if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
        !          11639:        (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
        !          11640:        xmlSchemaFacetPtr facet, lastfacet = NULL;
        !          11641:        /*
        !          11642:        * Corresponds to <complexType><simpleContent><restriction>...
        !          11643:        * <simpleType><restriction>...
        !          11644:        */
        !          11645: 
        !          11646:        /*
        !          11647:        * Add the facets to the simple type ancestor.
        !          11648:        */
        !          11649:        /*
        !          11650:        * TODO: Datatypes: 4.1.3 Constraints on XML Representation of
        !          11651:        * Simple Type Definition Schema Representation Constraint:
        !          11652:        * *Single Facet Value*
        !          11653:        */
        !          11654:        while ((IS_SCHEMA(child, "minInclusive")) ||
        !          11655:            (IS_SCHEMA(child, "minExclusive")) ||
        !          11656:            (IS_SCHEMA(child, "maxInclusive")) ||
        !          11657:            (IS_SCHEMA(child, "maxExclusive")) ||
        !          11658:            (IS_SCHEMA(child, "totalDigits")) ||
        !          11659:            (IS_SCHEMA(child, "fractionDigits")) ||
        !          11660:            (IS_SCHEMA(child, "pattern")) ||
        !          11661:            (IS_SCHEMA(child, "enumeration")) ||
        !          11662:            (IS_SCHEMA(child, "whiteSpace")) ||
        !          11663:            (IS_SCHEMA(child, "length")) ||
        !          11664:            (IS_SCHEMA(child, "maxLength")) ||
        !          11665:            (IS_SCHEMA(child, "minLength"))) {
        !          11666:            facet = xmlSchemaParseFacet(ctxt, schema, child);
        !          11667:            if (facet != NULL) {
        !          11668:                if (lastfacet == NULL)
        !          11669:                    type->facets = facet;
        !          11670:                else
        !          11671:                    lastfacet->next = facet;
        !          11672:                lastfacet = facet;
        !          11673:                lastfacet->next = NULL;
        !          11674:            }
        !          11675:            child = child->next;
        !          11676:        }
        !          11677:        /*
        !          11678:        * Create links for derivation and validation.
        !          11679:        */
        !          11680:        if (type->facets != NULL) {
        !          11681:            xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL;
        !          11682: 
        !          11683:            facet = type->facets;
        !          11684:            do {
        !          11685:                facetLink = (xmlSchemaFacetLinkPtr)
        !          11686:                    xmlMalloc(sizeof(xmlSchemaFacetLink));
        !          11687:                if (facetLink == NULL) {
        !          11688:                    xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL);
        !          11689:                    xmlFree(facetLink);
        !          11690:                    return (NULL);
        !          11691:                }
        !          11692:                facetLink->facet = facet;
        !          11693:                facetLink->next = NULL;
        !          11694:                if (lastFacetLink == NULL)
        !          11695:                    type->facetSet = facetLink;
        !          11696:                else
        !          11697:                    lastFacetLink->next = facetLink;
        !          11698:                lastFacetLink = facetLink;
        !          11699:                facet = facet->next;
        !          11700:            } while (facet != NULL);
        !          11701:        }
        !          11702:     }
        !          11703:     if (type->type == XML_SCHEMA_TYPE_COMPLEX) {
        !          11704:        /*
        !          11705:        * Attribute uses/declarations.
        !          11706:        */
        !          11707:        if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
        !          11708:            (xmlSchemaItemListPtr *) &(type->attrUses),
        !          11709:            XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
        !          11710:            return(NULL);
        !          11711:        /*
        !          11712:        * Attribute wildcard.
        !          11713:        */
        !          11714:        if (IS_SCHEMA(child, "anyAttribute")) {
        !          11715:            type->attributeWildcard =
        !          11716:                xmlSchemaParseAnyAttribute(ctxt, schema, child);
        !          11717:            child = child->next;
        !          11718:        }
        !          11719:     }
        !          11720:     if (child != NULL) {
        !          11721:        if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
        !          11722:            xmlSchemaPContentErr(ctxt,
        !          11723:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11724:                NULL, node, child, NULL,
        !          11725:                "annotation?, (group | all | choice | sequence)?, "
        !          11726:                "((attribute | attributeGroup)*, anyAttribute?))");
        !          11727:        } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
        !          11728:             xmlSchemaPContentErr(ctxt,
        !          11729:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11730:                NULL, node, child, NULL,
        !          11731:                "(annotation?, (simpleType?, (minExclusive | minInclusive | "
        !          11732:                "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
        !          11733:                "length | minLength | maxLength | enumeration | whiteSpace | "
        !          11734:                "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
        !          11735:        } else {
        !          11736:            /* Simple type */
        !          11737:            xmlSchemaPContentErr(ctxt,
        !          11738:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11739:                NULL, node, child, NULL,
        !          11740:                "(annotation?, (simpleType?, (minExclusive | minInclusive | "
        !          11741:                "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
        !          11742:                "length | minLength | maxLength | enumeration | whiteSpace | "
        !          11743:                "pattern)*))");
        !          11744:        }
        !          11745:     }
        !          11746:     return (NULL);
        !          11747: }
        !          11748: 
        !          11749: /**
        !          11750:  * xmlSchemaParseExtension:
        !          11751:  * @ctxt:  a schema validation context
        !          11752:  * @schema:  the schema being built
        !          11753:  * @node:  a subtree containing XML Schema informations
        !          11754:  *
        !          11755:  * Parses an <extension>, which is found inside a
        !          11756:  * <simpleContent> or <complexContent>.
        !          11757:  * *WARNING* this interface is highly subject to change.
        !          11758:  *
        !          11759:  * TODO: Returns the type definition or NULL in case of error
        !          11760:  */
        !          11761: static xmlSchemaTypePtr
        !          11762: xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          11763:                         xmlNodePtr node, xmlSchemaTypeType parentType)
        !          11764: {
        !          11765:     xmlSchemaTypePtr type;
        !          11766:     xmlNodePtr child = NULL;
        !          11767:     xmlAttrPtr attr;
        !          11768: 
        !          11769:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          11770:         return (NULL);
        !          11771:     /* Not a component, don't create it. */
        !          11772:     type = ctxt->ctxtType;
        !          11773:     type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
        !          11774: 
        !          11775:     /*
        !          11776:     * Check for illegal attributes.
        !          11777:     */
        !          11778:     attr = node->properties;
        !          11779:     while (attr != NULL) {
        !          11780:        if (attr->ns == NULL) {
        !          11781:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          11782:                (!xmlStrEqual(attr->name, BAD_CAST "base"))) {
        !          11783:                xmlSchemaPIllegalAttrErr(ctxt,
        !          11784:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11785:            }
        !          11786:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          11787:            xmlSchemaPIllegalAttrErr(ctxt,
        !          11788:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11789:        }
        !          11790:        attr = attr->next;
        !          11791:     }
        !          11792: 
        !          11793:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          11794: 
        !          11795:     /*
        !          11796:     * Attribute "base" - mandatory.
        !          11797:     */
        !          11798:     if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node,
        !          11799:        "base", &(type->baseNs), &(type->base)) == 0) &&
        !          11800:        (type->base == NULL)) {
        !          11801:        xmlSchemaPMissingAttrErr(ctxt,
        !          11802:            XML_SCHEMAP_S4S_ATTR_MISSING,
        !          11803:            NULL, node, "base", NULL);
        !          11804:     }
        !          11805:     /*
        !          11806:     * And now for the children...
        !          11807:     */
        !          11808:     child = node->children;
        !          11809:     if (IS_SCHEMA(child, "annotation")) {
        !          11810:        /*
        !          11811:        * Add the annotation to the type ancestor.
        !          11812:        */
        !          11813:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          11814:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          11815:         child = child->next;
        !          11816:     }
        !          11817:     if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
        !          11818:        /*
        !          11819:        * Corresponds to <complexType><complexContent><extension>... and:
        !          11820:        *
        !          11821:        * Model groups <all>, <choice>, <sequence> and <group>.
        !          11822:        */
        !          11823:        if (IS_SCHEMA(child, "all")) {
        !          11824:            type->subtypes = (xmlSchemaTypePtr)
        !          11825:                xmlSchemaParseModelGroup(ctxt, schema,
        !          11826:                    child, XML_SCHEMA_TYPE_ALL, 1);
        !          11827:            child = child->next;
        !          11828:        } else if (IS_SCHEMA(child, "choice")) {
        !          11829:            type->subtypes = (xmlSchemaTypePtr)
        !          11830:                xmlSchemaParseModelGroup(ctxt, schema,
        !          11831:                    child, XML_SCHEMA_TYPE_CHOICE, 1);
        !          11832:            child = child->next;
        !          11833:        } else if (IS_SCHEMA(child, "sequence")) {
        !          11834:            type->subtypes = (xmlSchemaTypePtr)
        !          11835:                xmlSchemaParseModelGroup(ctxt, schema,
        !          11836:                child, XML_SCHEMA_TYPE_SEQUENCE, 1);
        !          11837:            child = child->next;
        !          11838:        } else if (IS_SCHEMA(child, "group")) {
        !          11839:            type->subtypes = (xmlSchemaTypePtr)
        !          11840:                xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
        !          11841:            /*
        !          11842:            * Note that the reference will be resolved in
        !          11843:            * xmlSchemaResolveTypeReferences();
        !          11844:            */
        !          11845:            child = child->next;
        !          11846:        }
        !          11847:     }
        !          11848:     if (child != NULL) {
        !          11849:        /*
        !          11850:        * Attribute uses/declarations.
        !          11851:        */
        !          11852:        if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
        !          11853:            (xmlSchemaItemListPtr *) &(type->attrUses),
        !          11854:            XML_SCHEMA_TYPE_EXTENSION, NULL) == -1)
        !          11855:            return(NULL);
        !          11856:        /*
        !          11857:        * Attribute wildcard.
        !          11858:        */
        !          11859:        if (IS_SCHEMA(child, "anyAttribute")) {
        !          11860:            ctxt->ctxtType->attributeWildcard =
        !          11861:                xmlSchemaParseAnyAttribute(ctxt, schema, child);
        !          11862:            child = child->next;
        !          11863:        }
        !          11864:     }
        !          11865:     if (child != NULL) {
        !          11866:        if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
        !          11867:            /* Complex content extension. */
        !          11868:            xmlSchemaPContentErr(ctxt,
        !          11869:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11870:                NULL, node, child, NULL,
        !          11871:                "(annotation?, ((group | all | choice | sequence)?, "
        !          11872:                "((attribute | attributeGroup)*, anyAttribute?)))");
        !          11873:        } else {
        !          11874:            /* Simple content extension. */
        !          11875:            xmlSchemaPContentErr(ctxt,
        !          11876:                XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11877:                NULL, node, child, NULL,
        !          11878:                "(annotation?, ((attribute | attributeGroup)*, "
        !          11879:                "anyAttribute?))");
        !          11880:        }
        !          11881:     }
        !          11882:     return (NULL);
        !          11883: }
        !          11884: 
        !          11885: /**
        !          11886:  * xmlSchemaParseSimpleContent:
        !          11887:  * @ctxt:  a schema validation context
        !          11888:  * @schema:  the schema being built
        !          11889:  * @node:  a subtree containing XML Schema informations
        !          11890:  *
        !          11891:  * parse a XML schema SimpleContent definition
        !          11892:  * *WARNING* this interface is highly subject to change
        !          11893:  *
        !          11894:  * Returns the type definition or NULL in case of error
        !          11895:  */
        !          11896: static int
        !          11897: xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
        !          11898:                             xmlSchemaPtr schema, xmlNodePtr node,
        !          11899:                            int *hasRestrictionOrExtension)
        !          11900: {
        !          11901:     xmlSchemaTypePtr type;
        !          11902:     xmlNodePtr child = NULL;
        !          11903:     xmlAttrPtr attr;
        !          11904: 
        !          11905:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
        !          11906:        (hasRestrictionOrExtension == NULL))
        !          11907:         return (-1);
        !          11908:     *hasRestrictionOrExtension = 0;
        !          11909:     /* Not a component, don't create it. */
        !          11910:     type = ctxt->ctxtType;
        !          11911:     type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
        !          11912:     /*
        !          11913:     * Check for illegal attributes.
        !          11914:     */
        !          11915:     attr = node->properties;
        !          11916:     while (attr != NULL) {
        !          11917:        if (attr->ns == NULL) {
        !          11918:            if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) {
        !          11919:                xmlSchemaPIllegalAttrErr(ctxt,
        !          11920:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11921:            }
        !          11922:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          11923:            xmlSchemaPIllegalAttrErr(ctxt,
        !          11924:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          11925:        }
        !          11926:        attr = attr->next;
        !          11927:     }
        !          11928: 
        !          11929:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          11930: 
        !          11931:     /*
        !          11932:     * And now for the children...
        !          11933:     */
        !          11934:     child = node->children;
        !          11935:     if (IS_SCHEMA(child, "annotation")) {
        !          11936:        /*
        !          11937:        * Add the annotation to the complex type ancestor.
        !          11938:        */
        !          11939:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          11940:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          11941:         child = child->next;
        !          11942:     }
        !          11943:     if (child == NULL) {
        !          11944:        xmlSchemaPContentErr(ctxt,
        !          11945:            XML_SCHEMAP_S4S_ELEM_MISSING,
        !          11946:            NULL, node, NULL, NULL,
        !          11947:            "(annotation?, (restriction | extension))");
        !          11948:     }
        !          11949:     if (child == NULL) {
        !          11950:        xmlSchemaPContentErr(ctxt,
        !          11951:            XML_SCHEMAP_S4S_ELEM_MISSING,
        !          11952:            NULL, node, NULL, NULL,
        !          11953:            "(annotation?, (restriction | extension))");
        !          11954:     }
        !          11955:     if (IS_SCHEMA(child, "restriction")) {
        !          11956:         xmlSchemaParseRestriction(ctxt, schema, child,
        !          11957:            XML_SCHEMA_TYPE_SIMPLE_CONTENT);
        !          11958:        (*hasRestrictionOrExtension) = 1;
        !          11959:         child = child->next;
        !          11960:     } else if (IS_SCHEMA(child, "extension")) {
        !          11961:         xmlSchemaParseExtension(ctxt, schema, child,
        !          11962:            XML_SCHEMA_TYPE_SIMPLE_CONTENT);
        !          11963:        (*hasRestrictionOrExtension) = 1;
        !          11964:         child = child->next;
        !          11965:     }
        !          11966:     if (child != NULL) {
        !          11967:        xmlSchemaPContentErr(ctxt,
        !          11968:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          11969:            NULL, node, child, NULL,
        !          11970:            "(annotation?, (restriction | extension))");
        !          11971:     }
        !          11972:     return (0);
        !          11973: }
        !          11974: 
        !          11975: /**
        !          11976:  * xmlSchemaParseComplexContent:
        !          11977:  * @ctxt:  a schema validation context
        !          11978:  * @schema:  the schema being built
        !          11979:  * @node:  a subtree containing XML Schema informations
        !          11980:  *
        !          11981:  * parse a XML schema ComplexContent definition
        !          11982:  * *WARNING* this interface is highly subject to change
        !          11983:  *
        !          11984:  * Returns the type definition or NULL in case of error
        !          11985:  */
        !          11986: static int
        !          11987: xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
        !          11988:                              xmlSchemaPtr schema, xmlNodePtr node,
        !          11989:                             int *hasRestrictionOrExtension)
        !          11990: {
        !          11991:     xmlSchemaTypePtr type;
        !          11992:     xmlNodePtr child = NULL;
        !          11993:     xmlAttrPtr attr;
        !          11994: 
        !          11995:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
        !          11996:        (hasRestrictionOrExtension == NULL))
        !          11997:         return (-1);
        !          11998:     *hasRestrictionOrExtension = 0;
        !          11999:     /* Not a component, don't create it. */
        !          12000:     type = ctxt->ctxtType;
        !          12001:     /*
        !          12002:     * Check for illegal attributes.
        !          12003:     */
        !          12004:     attr = node->properties;
        !          12005:     while (attr != NULL) {
        !          12006:        if (attr->ns == NULL) {
        !          12007:            if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
        !          12008:                (!xmlStrEqual(attr->name, BAD_CAST "mixed")))
        !          12009:            {
        !          12010:                xmlSchemaPIllegalAttrErr(ctxt,
        !          12011:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          12012:            }
        !          12013:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          12014:            xmlSchemaPIllegalAttrErr(ctxt,
        !          12015:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          12016:        }
        !          12017:        attr = attr->next;
        !          12018:     }
        !          12019: 
        !          12020:     xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          12021: 
        !          12022:     /*
        !          12023:     * Set the 'mixed' on the complex type ancestor.
        !          12024:     */
        !          12025:     if (xmlGetBooleanProp(ctxt, node, "mixed", 0))  {
        !          12026:        if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
        !          12027:            type->flags |= XML_SCHEMAS_TYPE_MIXED;
        !          12028:     }
        !          12029:     child = node->children;
        !          12030:     if (IS_SCHEMA(child, "annotation")) {
        !          12031:        /*
        !          12032:        * Add the annotation to the complex type ancestor.
        !          12033:        */
        !          12034:        xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
        !          12035:            xmlSchemaParseAnnotation(ctxt, child, 1));
        !          12036:         child = child->next;
        !          12037:     }
        !          12038:     if (child == NULL) {
        !          12039:        xmlSchemaPContentErr(ctxt,
        !          12040:            XML_SCHEMAP_S4S_ELEM_MISSING,
        !          12041:            NULL, node, NULL,
        !          12042:            NULL, "(annotation?, (restriction | extension))");
        !          12043:     }
        !          12044:     if (child == NULL) {
        !          12045:        xmlSchemaPContentErr(ctxt,
        !          12046:            XML_SCHEMAP_S4S_ELEM_MISSING,
        !          12047:            NULL, node, NULL,
        !          12048:            NULL, "(annotation?, (restriction | extension))");
        !          12049:     }
        !          12050:     if (IS_SCHEMA(child, "restriction")) {
        !          12051:         xmlSchemaParseRestriction(ctxt, schema, child,
        !          12052:            XML_SCHEMA_TYPE_COMPLEX_CONTENT);
        !          12053:        (*hasRestrictionOrExtension) = 1;
        !          12054:         child = child->next;
        !          12055:     } else if (IS_SCHEMA(child, "extension")) {
        !          12056:         xmlSchemaParseExtension(ctxt, schema, child,
        !          12057:            XML_SCHEMA_TYPE_COMPLEX_CONTENT);
        !          12058:        (*hasRestrictionOrExtension) = 1;
        !          12059:         child = child->next;
        !          12060:     }
        !          12061:     if (child != NULL) {
        !          12062:        xmlSchemaPContentErr(ctxt,
        !          12063:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          12064:            NULL, node, child,
        !          12065:            NULL, "(annotation?, (restriction | extension))");
        !          12066:     }
        !          12067:     return (0);
        !          12068: }
        !          12069: 
        !          12070: /**
        !          12071:  * xmlSchemaParseComplexType:
        !          12072:  * @ctxt:  a schema validation context
        !          12073:  * @schema:  the schema being built
        !          12074:  * @node:  a subtree containing XML Schema informations
        !          12075:  *
        !          12076:  * parse a XML schema Complex Type definition
        !          12077:  * *WARNING* this interface is highly subject to change
        !          12078:  *
        !          12079:  * Returns the type definition or NULL in case of error
        !          12080:  */
        !          12081: static xmlSchemaTypePtr
        !          12082: xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
        !          12083:                           xmlNodePtr node, int topLevel)
        !          12084: {
        !          12085:     xmlSchemaTypePtr type, ctxtType;
        !          12086:     xmlNodePtr child = NULL;
        !          12087:     const xmlChar *name = NULL;
        !          12088:     xmlAttrPtr attr;
        !          12089:     const xmlChar *attrValue;
        !          12090: #ifdef ENABLE_NAMED_LOCALS
        !          12091:     char buf[40];
        !          12092: #endif
        !          12093:     int final = 0, block = 0, hasRestrictionOrExtension = 0;
        !          12094: 
        !          12095: 
        !          12096:     if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
        !          12097:         return (NULL);
        !          12098: 
        !          12099:     ctxtType = ctxt->ctxtType;
        !          12100: 
        !          12101:     if (topLevel) {
        !          12102:        attr = xmlSchemaGetPropNode(node, "name");
        !          12103:        if (attr == NULL) {
        !          12104:            xmlSchemaPMissingAttrErr(ctxt,
        !          12105:                XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL);
        !          12106:            return (NULL);
        !          12107:        } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
        !          12108:            xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
        !          12109:            return (NULL);
        !          12110:        }
        !          12111:     }
        !          12112: 
        !          12113:     if (topLevel == 0) {
        !          12114:        /*
        !          12115:        * Parse as local complex type definition.
        !          12116:        */
        !          12117: #ifdef ENABLE_NAMED_LOCALS
        !          12118:         snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1);
        !          12119:        type = xmlSchemaAddType(ctxt, schema,
        !          12120:            XML_SCHEMA_TYPE_COMPLEX,
        !          12121:            xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
        !          12122:            ctxt->targetNamespace, node, 0);
        !          12123: #else
        !          12124:        type = xmlSchemaAddType(ctxt, schema,
        !          12125:            XML_SCHEMA_TYPE_COMPLEX,
        !          12126:            NULL, ctxt->targetNamespace, node, 0);
        !          12127: #endif
        !          12128:        if (type == NULL)
        !          12129:            return (NULL);
        !          12130:        name = type->name;
        !          12131:        type->node = node;
        !          12132:        type->type = XML_SCHEMA_TYPE_COMPLEX;
        !          12133:        /*
        !          12134:        * TODO: We need the target namespace.
        !          12135:        */
        !          12136:     } else {
        !          12137:        /*
        !          12138:        * Parse as global complex type definition.
        !          12139:        */
        !          12140:        type = xmlSchemaAddType(ctxt, schema,
        !          12141:            XML_SCHEMA_TYPE_COMPLEX,
        !          12142:            name, ctxt->targetNamespace, node, 1);
        !          12143:        if (type == NULL)
        !          12144:            return (NULL);
        !          12145:        type->node = node;
        !          12146:        type->type = XML_SCHEMA_TYPE_COMPLEX;
        !          12147:        type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
        !          12148:     }
        !          12149:     type->targetNamespace = ctxt->targetNamespace;
        !          12150:     /*
        !          12151:     * Handle attributes.
        !          12152:     */
        !          12153:     attr = node->properties;
        !          12154:     while (attr != NULL) {
        !          12155:        if (attr->ns == NULL) {
        !          12156:            if (xmlStrEqual(attr->name, BAD_CAST "id")) {
        !          12157:                /*
        !          12158:                * Attribute "id".
        !          12159:                */
        !          12160:                xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
        !          12161:            } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) {
        !          12162:                /*
        !          12163:                * Attribute "mixed".
        !          12164:                */
        !          12165:                if (xmlSchemaPGetBoolNodeValue(ctxt,
        !          12166:                        NULL, (xmlNodePtr) attr))
        !          12167:                    type->flags |= XML_SCHEMAS_TYPE_MIXED;
        !          12168:            } else if (topLevel) {
        !          12169:                /*
        !          12170:                * Attributes of global complex type definitions.
        !          12171:                */
        !          12172:                if (xmlStrEqual(attr->name, BAD_CAST "name")) {
        !          12173:                    /* Pass. */
        !          12174:                } else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) {
        !          12175:                    /*
        !          12176:                    * Attribute "abstract".
        !          12177:                    */
        !          12178:                    if (xmlSchemaPGetBoolNodeValue(ctxt,
        !          12179:                            NULL, (xmlNodePtr) attr))
        !          12180:                        type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
        !          12181:                } else if (xmlStrEqual(attr->name, BAD_CAST "final")) {
        !          12182:                    /*
        !          12183:                    * Attribute "final".
        !          12184:                    */
        !          12185:                    attrValue = xmlSchemaGetNodeContent(ctxt,
        !          12186:                        (xmlNodePtr) attr);
        !          12187:                    if (xmlSchemaPValAttrBlockFinal(attrValue,
        !          12188:                        &(type->flags),
        !          12189:                        -1,
        !          12190:                        XML_SCHEMAS_TYPE_FINAL_EXTENSION,
        !          12191:                        XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
        !          12192:                        -1, -1, -1) != 0)
        !          12193:                    {
        !          12194:                        xmlSchemaPSimpleTypeErr(ctxt,
        !          12195:                            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          12196:                            NULL, (xmlNodePtr) attr, NULL,
        !          12197:                            "(#all | List of (extension | restriction))",
        !          12198:                            attrValue, NULL, NULL, NULL);
        !          12199:                    } else
        !          12200:                        final = 1;
        !          12201:                } else if (xmlStrEqual(attr->name, BAD_CAST "block")) {
        !          12202:                    /*
        !          12203:                    * Attribute "block".
        !          12204:                    */
        !          12205:                    attrValue = xmlSchemaGetNodeContent(ctxt,
        !          12206:                        (xmlNodePtr) attr);
        !          12207:                    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
        !          12208:                        -1,
        !          12209:                        XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
        !          12210:                        XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
        !          12211:                        -1, -1, -1) != 0) {
        !          12212:                        xmlSchemaPSimpleTypeErr(ctxt,
        !          12213:                            XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
        !          12214:                            NULL, (xmlNodePtr) attr, NULL,
        !          12215:                            "(#all | List of (extension | restriction)) ",
        !          12216:                            attrValue, NULL, NULL, NULL);
        !          12217:                    } else
        !          12218:                        block = 1;
        !          12219:                } else {
        !          12220:                        xmlSchemaPIllegalAttrErr(ctxt,
        !          12221:                            XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          12222:                }
        !          12223:            } else {
        !          12224:                xmlSchemaPIllegalAttrErr(ctxt,
        !          12225:                    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          12226:            }
        !          12227:        } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
        !          12228:            xmlSchemaPIllegalAttrErr(ctxt,
        !          12229:                XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
        !          12230:        }
        !          12231:        attr = attr->next;
        !          12232:     }
        !          12233:     if (! block) {
        !          12234:        /*
        !          12235:        * Apply default "block" values.
        !          12236:        */
        !          12237:        if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
        !          12238:            type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
        !          12239:        if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
        !          12240:            type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
        !          12241:     }
        !          12242:     if (! final) {
        !          12243:        /*
        !          12244:        * Apply default "block" values.
        !          12245:        */
        !          12246:        if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
        !          12247:            type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
        !          12248:        if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
        !          12249:            type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
        !          12250:     }
        !          12251:     /*
        !          12252:     * And now for the children...
        !          12253:     */
        !          12254:     child = node->children;
        !          12255:     if (IS_SCHEMA(child, "annotation")) {
        !          12256:         type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
        !          12257:         child = child->next;
        !          12258:     }
        !          12259:     ctxt->ctxtType = type;
        !          12260:     if (IS_SCHEMA(child, "simpleContent")) {
        !          12261:        /*
        !          12262:        * <complexType><simpleContent>...
        !          12263:        * 3.4.3 : 2.2
        !          12264:        * Specifying mixed='true' when the <simpleContent>
        !          12265:        * alternative is chosen has no effect
        !          12266:        */
        !          12267:        if (type->flags & XML_SCHEMAS_TYPE_MIXED)
        !          12268:            type->flags ^= XML_SCHEMAS_TYPE_MIXED;
        !          12269:         xmlSchemaParseSimpleContent(ctxt, schema, child,
        !          12270:            &hasRestrictionOrExtension);
        !          12271:         child = child->next;
        !          12272:     } else if (IS_SCHEMA(child, "complexContent")) {
        !          12273:        /*
        !          12274:        * <complexType><complexContent>...
        !          12275:        */
        !          12276:        type->contentType = XML_SCHEMA_CONTENT_EMPTY;
        !          12277:         xmlSchemaParseComplexContent(ctxt, schema, child,
        !          12278:            &hasRestrictionOrExtension);
        !          12279:         child = child->next;
        !          12280:     } else {
        !          12281:        /*
        !          12282:        * E.g <complexType><sequence>... or <complexType><attribute>... etc.
        !          12283:        *
        !          12284:        * SPEC
        !          12285:        * "...the third alternative (neither <simpleContent> nor
        !          12286:        * <complexContent>) is chosen. This case is understood as shorthand
        !          12287:        * for complex content restricting the �ur-type definition�, and the
        !          12288:        * details of the mappings should be modified as necessary.
        !          12289:        */
        !          12290:        type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
        !          12291:        type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
        !          12292:        /*
        !          12293:        * Parse model groups.
        !          12294:        */
        !          12295:         if (IS_SCHEMA(child, "all")) {
        !          12296:             type->subtypes = (xmlSchemaTypePtr)
        !          12297:                xmlSchemaParseModelGroup(ctxt, schema, child,
        !          12298:                    XML_SCHEMA_TYPE_ALL, 1);
        !          12299:             child = child->next;
        !          12300:         } else if (IS_SCHEMA(child, "choice")) {
        !          12301:             type->subtypes = (xmlSchemaTypePtr)
        !          12302:                xmlSchemaParseModelGroup(ctxt, schema, child,
        !          12303:                    XML_SCHEMA_TYPE_CHOICE, 1);
        !          12304:             child = child->next;
        !          12305:         } else if (IS_SCHEMA(child, "sequence")) {
        !          12306:             type->subtypes = (xmlSchemaTypePtr)
        !          12307:                xmlSchemaParseModelGroup(ctxt, schema, child,
        !          12308:                    XML_SCHEMA_TYPE_SEQUENCE, 1);
        !          12309:             child = child->next;
        !          12310:         } else if (IS_SCHEMA(child, "group")) {
        !          12311:             type->subtypes = (xmlSchemaTypePtr)
        !          12312:                xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
        !          12313:            /*
        !          12314:            * Note that the reference will be resolved in
        !          12315:            * xmlSchemaResolveTypeReferences();
        !          12316:            */
        !          12317:             child = child->next;
        !          12318:         }
        !          12319:        /*
        !          12320:        * Parse attribute decls/refs.
        !          12321:        */
        !          12322:         if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
        !          12323:            (xmlSchemaItemListPtr *) &(type->attrUses),
        !          12324:            XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
        !          12325:            return(NULL);
        !          12326:        /*
        !          12327:        * Parse attribute wildcard.
        !          12328:        */
        !          12329:        if (IS_SCHEMA(child, "anyAttribute")) {
        !          12330:            type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child);
        !          12331:            child = child->next;
        !          12332:        }
        !          12333:     }
        !          12334:     if (child != NULL) {
        !          12335:        xmlSchemaPContentErr(ctxt,
        !          12336:            XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
        !          12337:            NULL, node, child,
        !          12338:            NULL, "(annotation?, (simpleContent | complexContent | "
        !          12339:            "((group | all | choice | sequence)?, ((attribute | "
        !          12340:            "attributeGroup)*, anyAttribute?))))");
        !          12341:     }
        !          12342:     /*
        !          12343:     * REDEFINE: SPEC src-redefine (5)
        !          12344:     */
        !          12345:     if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
        !          12346:        xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
        !          12347:            NULL, node, "This is a redefinition, thus the "
        !          12348:            "<complexType> must have a <restriction> or <extension> "
        !          12349:            "grand-child", NULL);
        !          12350:     }
        !          12351:     ctxt->ctxtType = ctxtType;
        !          12352:     return (type);
        !          12353: }
        !          12354: 
        !          12355: /************************************************************************
        !          12356:  *                                                                     *
        !          12357:  *                     Validating using Schemas                        *
        !          12358:  *                                                                     *
        !          12359:  ************************************************************************/
        !          12360: 
        !          12361: /************************************************************************
        !          12362:  *                                                                     *
        !          12363:  *                     Reading/Writing Schemas                         *
        !          12364:  *                                                                     *
        !          12365:  ************************************************************************/
        !          12366: 
        !          12367: #if 0 /* Will be enabled if it is clear what options are needed. */
        !          12368: /**
        !          12369:  * xmlSchemaParserCtxtSetOptions:
        !          12370:  * @ctxt:      a schema parser context
        !          12371:  * @options: a combination of xmlSchemaParserOption
        !          12372:  *
        !          12373:  * Sets the options to be used during the parse.
        !          12374:  *
        !          12375:  * Returns 0 in case of success, -1 in case of an
        !          12376:  * API error.
        !          12377:  */
        !          12378: static int
        !          12379: xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
        !          12380:                              int options)
        !          12381: 
        !          12382: {
        !          12383:     int i;
        !          12384: 
        !          12385:     if (ctxt == NULL)
        !          12386:        return (-1);
        !          12387:     /*
        !          12388:     * WARNING: Change the start value if adding to the
        !          12389:     * xmlSchemaParseOption.
        !          12390:     */
        !          12391:     for (i = 1; i < (int) sizeof(int) * 8; i++) {
        !          12392:         if (options & 1<<i) {
        !          12393:            return (-1);
        !          12394:         }
        !          12395:     }
        !          12396:     ctxt->options = options;
        !          12397:     return (0);
        !          12398: }
        !          12399: 
        !          12400: /**
        !          12401:  * xmlSchemaValidCtxtGetOptions:
        !          12402:  * @ctxt: a schema parser context
        !          12403:  *
        !          12404:  * Returns the option combination of the parser context.
        !          12405:  */
        !          12406: static int
        !          12407: xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
        !          12408: 
        !          12409: {
        !          12410:     if (ctxt == NULL)
        !          12411:        return (-1);
        !          12412:     else
        !          12413:        return (ctxt->options);
        !          12414: }
        !          12415: #endif
        !          12416: 
        !          12417: /**
        !          12418:  * xmlSchemaNewParserCtxt:
        !          12419:  * @URL:  the location of the schema
        !          12420:  *
        !          12421:  * Create an XML Schemas parse context for that file/resource expected
        !          12422:  * to contain an XML Schemas file.
        !          12423:  *
        !          12424:  * Returns the parser context or NULL in case of error
        !          12425:  */
        !          12426: xmlSchemaParserCtxtPtr
        !          12427: xmlSchemaNewParserCtxt(const char *URL)
        !          12428: {
        !          12429:     xmlSchemaParserCtxtPtr ret;
        !          12430: 
        !          12431:     if (URL == NULL)
        !          12432:         return (NULL);
        !          12433: 
        !          12434:     ret = xmlSchemaParserCtxtCreate();
        !          12435:     if (ret == NULL)
        !          12436:        return(NULL);
        !          12437:     ret->dict = xmlDictCreate();
        !          12438:     ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1);
        !          12439:     return (ret);
        !          12440: }
        !          12441: 
        !          12442: /**
        !          12443:  * xmlSchemaNewMemParserCtxt:
        !          12444:  * @buffer:  a pointer to a char array containing the schemas
        !          12445:  * @size:  the size of the array
        !          12446:  *
        !          12447:  * Create an XML Schemas parse context for that memory buffer expected
        !          12448:  * to contain an XML Schemas file.
        !          12449:  *
        !          12450:  * Returns the parser context or NULL in case of error
        !          12451:  */
        !          12452: xmlSchemaParserCtxtPtr
        !          12453: xmlSchemaNewMemParserCtxt(const char *buffer, int size)
        !          12454: {
        !          12455:     xmlSchemaParserCtxtPtr ret;
        !          12456: 
        !          12457:     if ((buffer == NULL) || (size <= 0))
        !          12458:         return (NULL);
        !          12459:     ret = xmlSchemaParserCtxtCreate();
        !          12460:     if (ret == NULL)
        !          12461:        return(NULL);
        !          12462:     ret->buffer = buffer;
        !          12463:     ret->size = size;
        !          12464:     ret->dict = xmlDictCreate();
        !          12465:     return (ret);
        !          12466: }
        !          12467: 
        !          12468: /**
        !          12469:  * xmlSchemaNewDocParserCtxt:
        !          12470:  * @doc:  a preparsed document tree
        !          12471:  *
        !          12472:  * Create an XML Schemas parse context for that document.
        !          12473:  * NB. The document may be modified during the parsing process.
        !          12474:  *
        !          12475:  * Returns the parser context or NULL in case of error
        !          12476:  */
        !          12477: xmlSchemaParserCtxtPtr
        !          12478: xmlSchemaNewDocParserCtxt(xmlDocPtr doc)
        !          12479: {
        !          12480:     xmlSchemaParserCtxtPtr ret;
        !          12481: 
        !          12482:     if (doc == NULL)
        !          12483:       return (NULL);
        !          12484:     ret = xmlSchemaParserCtxtCreate();
        !          12485:     if (ret == NULL)
        !          12486:        return(NULL);
        !          12487:     ret->doc = doc;
        !          12488:     ret->dict = xmlDictCreate();
        !          12489:     /* The application has responsibility for the document */
        !          12490:     ret->preserve = 1;
        !          12491: 
        !          12492:     return (ret);
        !          12493: }
        !          12494: 
        !          12495: /**
        !          12496:  * xmlSchemaFreeParserCtxt:
        !          12497:  * @ctxt:  the schema parser context
        !          12498:  *
        !          12499:  * Free the resources associated to the schema parser context
        !          12500:  */
        !          12501: void
        !          12502: xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
        !          12503: {
        !          12504:     if (ctxt == NULL)
        !          12505:         return;
        !          12506:     if (ctxt->doc != NULL && !ctxt->preserve)
        !          12507:         xmlFreeDoc(ctxt->doc);
        !          12508:     if (ctxt->vctxt != NULL) {
        !          12509:        xmlSchemaFreeValidCtxt(ctxt->vctxt);
        !          12510:     }
        !          12511:     if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) {
        !          12512:        xmlSchemaConstructionCtxtFree(ctxt->constructor);
        !          12513:        ctxt->constructor = NULL;
        !          12514:        ctxt->ownsConstructor = 0;
        !          12515:     }
        !          12516:     if (ctxt->attrProhibs != NULL)
        !          12517:        xmlSchemaItemListFree(ctxt->attrProhibs);
        !          12518:     xmlDictFree(ctxt->dict);
        !          12519:     xmlFree(ctxt);
        !          12520: }
        !          12521: 
        !          12522: /************************************************************************
        !          12523:  *                                                                     *
        !          12524:  *                     Building the content models                     *
        !          12525:  *                                                                     *
        !          12526:  ************************************************************************/
        !          12527: 
        !          12528: /**
        !          12529:  * xmlSchemaBuildContentModelForSubstGroup:
        !          12530:  *
        !          12531:  * Returns 1 if nillable, 0 otherwise
        !          12532:  */
        !          12533: static int
        !          12534: xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
        !          12535:        xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end)
        !          12536: {
        !          12537:     xmlAutomataStatePtr start, tmp;
        !          12538:     xmlSchemaElementPtr elemDecl, member;
        !          12539:     xmlSchemaSubstGroupPtr substGroup;
        !          12540:     int i;
        !          12541:     int ret = 0;
        !          12542: 
        !          12543:     elemDecl = (xmlSchemaElementPtr) particle->children;
        !          12544:     /*
        !          12545:     * Wrap the substitution group with a CHOICE.
        !          12546:     */
        !          12547:     start = pctxt->state;
        !          12548:     if (end == NULL)
        !          12549:        end = xmlAutomataNewState(pctxt->am);
        !          12550:     substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
        !          12551:     if (substGroup == NULL) {
        !          12552:        xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
        !          12553:            XML_SCHEMAP_INTERNAL,
        !          12554:            "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
        !          12555:            "declaration is marked having a subst. group but none "
        !          12556:            "available.\n", elemDecl->name, NULL);
        !          12557:        return(0);
        !          12558:     }
        !          12559:     if (counter >= 0) {
        !          12560:        /*
        !          12561:        * NOTE that we put the declaration in, even if it's abstract.
        !          12562:        * However, an error will be raised during *validation* if an element
        !          12563:        * information item shall be validated against an abstract element
        !          12564:        * declaration.
        !          12565:        */
        !          12566:        tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter);
        !          12567:         xmlAutomataNewTransition2(pctxt->am, tmp, end,
        !          12568:                    elemDecl->name, elemDecl->targetNamespace, elemDecl);
        !          12569:        /*
        !          12570:        * Add subst. group members.
        !          12571:        */
        !          12572:        for (i = 0; i < substGroup->members->nbItems; i++) {
        !          12573:            member = (xmlSchemaElementPtr) substGroup->members->items[i];
        !          12574:             xmlAutomataNewTransition2(pctxt->am, tmp, end,
        !          12575:                               member->name, member->targetNamespace, member);
        !          12576:        }
        !          12577:     } else if (particle->maxOccurs == 1) {
        !          12578:        /*
        !          12579:        * NOTE that we put the declaration in, even if it's abstract,
        !          12580:        */
        !          12581:        xmlAutomataNewEpsilon(pctxt->am,
        !          12582:            xmlAutomataNewTransition2(pctxt->am,
        !          12583:            start, NULL,
        !          12584:            elemDecl->name, elemDecl->targetNamespace, elemDecl), end);
        !          12585:        /*
        !          12586:        * Add subst. group members.
        !          12587:        */
        !          12588:        for (i = 0; i < substGroup->members->nbItems; i++) {
        !          12589:            member = (xmlSchemaElementPtr) substGroup->members->items[i];
        !          12590:            /*
        !          12591:            * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2()
        !          12592:            *  was incorrectly used instead of xmlAutomataNewTransition2()
        !          12593:            *  (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL
        !          12594:            *  section in xmlSchemaBuildAContentModel() ).
        !          12595:            * TODO: Check if xmlAutomataNewOnceTrans2() was instead
        !          12596:            *  intended for the above "counter" section originally. I.e.,
        !          12597:            *  check xs:all with subst-groups.
        !          12598:            *
        !          12599:            * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL,
        !          12600:            *                  member->name, member->targetNamespace,
        !          12601:            *                  1, 1, member);
        !          12602:            */
        !          12603:            tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL,
        !          12604:                member->name, member->targetNamespace, member);
        !          12605:            xmlAutomataNewEpsilon(pctxt->am, tmp, end);
        !          12606:        }
        !          12607:     } else {
        !          12608:        xmlAutomataStatePtr hop;
        !          12609:        int maxOccurs = particle->maxOccurs == UNBOUNDED ?
        !          12610:            UNBOUNDED : particle->maxOccurs - 1;
        !          12611:        int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
        !          12612: 
        !          12613:        counter =
        !          12614:            xmlAutomataNewCounter(pctxt->am, minOccurs,
        !          12615:            maxOccurs);
        !          12616:        hop = xmlAutomataNewState(pctxt->am);
        !          12617: 
        !          12618:        xmlAutomataNewEpsilon(pctxt->am,
        !          12619:            xmlAutomataNewTransition2(pctxt->am,
        !          12620:            start, NULL,
        !          12621:            elemDecl->name, elemDecl->targetNamespace, elemDecl),
        !          12622:            hop);
        !          12623:        /*
        !          12624:         * Add subst. group members.
        !          12625:         */
        !          12626:        for (i = 0; i < substGroup->members->nbItems; i++) {
        !          12627:            member = (xmlSchemaElementPtr) substGroup->members->items[i];
        !          12628:            xmlAutomataNewEpsilon(pctxt->am,
        !          12629:                xmlAutomataNewTransition2(pctxt->am,
        !          12630:                start, NULL,
        !          12631:                member->name, member->targetNamespace, member),
        !          12632:                hop);
        !          12633:        }
        !          12634:        xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
        !          12635:        xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
        !          12636:     }
        !          12637:     if (particle->minOccurs == 0) {
        !          12638:        xmlAutomataNewEpsilon(pctxt->am, start, end);
        !          12639:         ret = 1;
        !          12640:     }
        !          12641:     pctxt->state = end;
        !          12642:     return(ret);
        !          12643: }
        !          12644: 
        !          12645: /**
        !          12646:  * xmlSchemaBuildContentModelForElement:
        !          12647:  *
        !          12648:  * Returns 1 if nillable, 0 otherwise
        !          12649:  */
        !          12650: static int
        !          12651: xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
        !          12652:                                     xmlSchemaParticlePtr particle)
        !          12653: {
        !          12654:     int ret = 0;
        !          12655: 
        !          12656:     if (((xmlSchemaElementPtr) particle->children)->flags &
        !          12657:        XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
        !          12658:        /*
        !          12659:        * Substitution groups.
        !          12660:        */
        !          12661:        ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL);
        !          12662:     } else {
        !          12663:        xmlSchemaElementPtr elemDecl;
        !          12664:        xmlAutomataStatePtr start;
        !          12665: 
        !          12666:        elemDecl = (xmlSchemaElementPtr) particle->children;
        !          12667: 
        !          12668:        if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
        !          12669:            return(0);
        !          12670:        if (particle->maxOccurs == 1) {
        !          12671:            start = ctxt->state;
        !          12672:            ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
        !          12673:                    elemDecl->name, elemDecl->targetNamespace, elemDecl);
        !          12674:        } else if ((particle->maxOccurs >= UNBOUNDED) &&
        !          12675:                   (particle->minOccurs < 2)) {
        !          12676:            /* Special case. */
        !          12677:            start = ctxt->state;
        !          12678:            ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
        !          12679:                elemDecl->name, elemDecl->targetNamespace, elemDecl);
        !          12680:            ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
        !          12681:                elemDecl->name, elemDecl->targetNamespace, elemDecl);
        !          12682:        } else {
        !          12683:            int counter;
        !          12684:            int maxOccurs = particle->maxOccurs == UNBOUNDED ?
        !          12685:                            UNBOUNDED : particle->maxOccurs - 1;
        !          12686:            int minOccurs = particle->minOccurs < 1 ?
        !          12687:                            0 : particle->minOccurs - 1;
        !          12688: 
        !          12689:            start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
        !          12690:            counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
        !          12691:            ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
        !          12692:                elemDecl->name, elemDecl->targetNamespace, elemDecl);
        !          12693:            xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter);
        !          12694:            ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
        !          12695:                NULL, counter);
        !          12696:        }
        !          12697:        if (particle->minOccurs == 0) {
        !          12698:            xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state);
        !          12699:             ret = 1;
        !          12700:         }
        !          12701:     }
        !          12702:     return(ret);
        !          12703: }
        !          12704: 
        !          12705: /**
        !          12706:  * xmlSchemaBuildAContentModel:
        !          12707:  * @ctxt:  the schema parser context
        !          12708:  * @particle:  the particle component
        !          12709:  * @name:  the complex type's name whose content is being built
        !          12710:  *
        !          12711:  * Create the automaton for the {content type} of a complex type.
        !          12712:  *
        !          12713:  * Returns 1 if the content is nillable, 0 otherwise
        !          12714:  */
        !          12715: static int
        !          12716: xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
        !          12717:                            xmlSchemaParticlePtr particle)
        !          12718: {
        !          12719:     int ret = 0, tmp2;
        !          12720: 
        !          12721:     if (particle == NULL) {
        !          12722:        PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL");
        !          12723:        return(1);
        !          12724:     }
        !          12725:     if (particle->children == NULL) {
        !          12726:        /*
        !          12727:        * Just return in this case. A missing "term" of the particle
        !          12728:        * might arise due to an invalid "term" component.
        !          12729:        */
        !          12730:        return(1);
        !          12731:     }
        !          12732: 
        !          12733:     switch (particle->children->type) {
        !          12734:        case XML_SCHEMA_TYPE_ANY: {
        !          12735:            xmlAutomataStatePtr start, end;
        !          12736:            xmlSchemaWildcardPtr wild;
        !          12737:            xmlSchemaWildcardNsPtr ns;
        !          12738: 
        !          12739:            wild = (xmlSchemaWildcardPtr) particle->children;
        !          12740: 
        !          12741:            start = pctxt->state;
        !          12742:            end = xmlAutomataNewState(pctxt->am);
        !          12743: 
        !          12744:            if (particle->maxOccurs == 1) {
        !          12745:                if (wild->any == 1) {
        !          12746:                    /*
        !          12747:                    * We need to add both transitions:
        !          12748:                    *
        !          12749:                    * 1. the {"*", "*"} for elements in a namespace.
        !          12750:                    */
        !          12751:                    pctxt->state =
        !          12752:                        xmlAutomataNewTransition2(pctxt->am,
        !          12753:                        start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
        !          12754:                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
        !          12755:                    /*
        !          12756:                    * 2. the {"*"} for elements in no namespace.
        !          12757:                    */
        !          12758:                    pctxt->state =
        !          12759:                        xmlAutomataNewTransition2(pctxt->am,
        !          12760:                        start, NULL, BAD_CAST "*", NULL, wild);
        !          12761:                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
        !          12762: 
        !          12763:                } else if (wild->nsSet != NULL) {
        !          12764:                    ns = wild->nsSet;
        !          12765:                    do {
        !          12766:                        pctxt->state = start;
        !          12767:                        pctxt->state = xmlAutomataNewTransition2(pctxt->am,
        !          12768:                            pctxt->state, NULL, BAD_CAST "*", ns->value, wild);
        !          12769:                        xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
        !          12770:                        ns = ns->next;
        !          12771:                    } while (ns != NULL);
        !          12772: 
        !          12773:                } else if (wild->negNsSet != NULL) {
        !          12774:                    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
        !          12775:                        start, end, BAD_CAST "*", wild->negNsSet->value,
        !          12776:                        wild);
        !          12777:                }
        !          12778:            } else {
        !          12779:                int counter;
        !          12780:                xmlAutomataStatePtr hop;
        !          12781:                int maxOccurs =
        !          12782:                    particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
        !          12783:                                            particle->maxOccurs - 1;
        !          12784:                int minOccurs =
        !          12785:                    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
        !          12786: 
        !          12787:                counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
        !          12788:                hop = xmlAutomataNewState(pctxt->am);
        !          12789:                if (wild->any == 1) {
        !          12790:                    pctxt->state =
        !          12791:                        xmlAutomataNewTransition2(pctxt->am,
        !          12792:                        start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
        !          12793:                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
        !          12794:                    pctxt->state =
        !          12795:                        xmlAutomataNewTransition2(pctxt->am,
        !          12796:                        start, NULL, BAD_CAST "*", NULL, wild);
        !          12797:                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
        !          12798:                } else if (wild->nsSet != NULL) {
        !          12799:                    ns = wild->nsSet;
        !          12800:                    do {
        !          12801:                        pctxt->state =
        !          12802:                            xmlAutomataNewTransition2(pctxt->am,
        !          12803:                                start, NULL, BAD_CAST "*", ns->value, wild);
        !          12804:                        xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
        !          12805:                        ns = ns->next;
        !          12806:                    } while (ns != NULL);
        !          12807: 
        !          12808:                } else if (wild->negNsSet != NULL) {
        !          12809:                    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
        !          12810:                        start, hop, BAD_CAST "*", wild->negNsSet->value,
        !          12811:                        wild);
        !          12812:                }
        !          12813:                xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
        !          12814:                xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
        !          12815:            }
        !          12816:            if (particle->minOccurs == 0) {
        !          12817:                xmlAutomataNewEpsilon(pctxt->am, start, end);
        !          12818:                 ret = 1;
        !          12819:            }
        !          12820:            pctxt->state = end;
        !          12821:             break;
        !          12822:        }
        !          12823:         case XML_SCHEMA_TYPE_ELEMENT:
        !          12824:            ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
        !          12825:            break;
        !          12826:         case XML_SCHEMA_TYPE_SEQUENCE:{
        !          12827:             xmlSchemaTreeItemPtr sub;
        !          12828: 
        !          12829:             ret = 1;
        !          12830:             /*
        !          12831:              * If max and min occurances are default (1) then
        !          12832:              * simply iterate over the particles of the <sequence>.
        !          12833:              */
        !          12834:             if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
        !          12835:                 sub = particle->children->children;
        !          12836: 
        !          12837:                 while (sub != NULL) {
        !          12838:                     tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12839:                                         (xmlSchemaParticlePtr) sub);
        !          12840:                     if (tmp2 != 1) ret = 0;
        !          12841:                     sub = sub->next;
        !          12842:                 }
        !          12843:             } else {
        !          12844:                 xmlAutomataStatePtr oldstate = pctxt->state;
        !          12845: 
        !          12846:                 if (particle->maxOccurs >= UNBOUNDED) {
        !          12847:                     if (particle->minOccurs > 1) {
        !          12848:                         xmlAutomataStatePtr tmp;
        !          12849:                         int counter;
        !          12850: 
        !          12851:                         pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
        !          12852:                             oldstate, NULL);
        !          12853:                         oldstate = pctxt->state;
        !          12854: 
        !          12855:                         counter = xmlAutomataNewCounter(pctxt->am,
        !          12856:                             particle->minOccurs - 1, UNBOUNDED);
        !          12857: 
        !          12858:                         sub = particle->children->children;
        !          12859:                         while (sub != NULL) {
        !          12860:                             tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12861:                                             (xmlSchemaParticlePtr) sub);
        !          12862:                             if (tmp2 != 1) ret = 0;
        !          12863:                             sub = sub->next;
        !          12864:                         }
        !          12865:                         tmp = pctxt->state;
        !          12866:                         xmlAutomataNewCountedTrans(pctxt->am, tmp,
        !          12867:                                                    oldstate, counter);
        !          12868:                         pctxt->state =
        !          12869:                             xmlAutomataNewCounterTrans(pctxt->am, tmp,
        !          12870:                                                        NULL, counter);
        !          12871:                         if (ret == 1)
        !          12872:                             xmlAutomataNewEpsilon(pctxt->am,
        !          12873:                                                 oldstate, pctxt->state);
        !          12874: 
        !          12875:                     } else {
        !          12876:                         pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
        !          12877:                             oldstate, NULL);
        !          12878:                         oldstate = pctxt->state;
        !          12879: 
        !          12880:                         sub = particle->children->children;
        !          12881:                         while (sub != NULL) {
        !          12882:                             tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12883:                                         (xmlSchemaParticlePtr) sub);
        !          12884:                             if (tmp2 != 1) ret = 0;
        !          12885:                             sub = sub->next;
        !          12886:                         }
        !          12887:                         xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
        !          12888:                                               oldstate);
        !          12889:                         /*
        !          12890:                          * epsilon needed to block previous trans from
        !          12891:                          * being allowed to enter back from another
        !          12892:                          * construct
        !          12893:                          */
        !          12894:                         pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
        !          12895:                                             pctxt->state, NULL);
        !          12896:                         if (particle->minOccurs == 0) {
        !          12897:                             xmlAutomataNewEpsilon(pctxt->am,
        !          12898:                                 oldstate, pctxt->state);
        !          12899:                             ret = 1;
        !          12900:                         }
        !          12901:                     }
        !          12902:                 } else if ((particle->maxOccurs > 1)
        !          12903:                            || (particle->minOccurs > 1)) {
        !          12904:                     xmlAutomataStatePtr tmp;
        !          12905:                     int counter;
        !          12906: 
        !          12907:                     pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
        !          12908:                         oldstate, NULL);
        !          12909:                     oldstate = pctxt->state;
        !          12910: 
        !          12911:                     counter = xmlAutomataNewCounter(pctxt->am,
        !          12912:                         particle->minOccurs - 1,
        !          12913:                         particle->maxOccurs - 1);
        !          12914: 
        !          12915:                     sub = particle->children->children;
        !          12916:                     while (sub != NULL) {
        !          12917:                         tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12918:                                         (xmlSchemaParticlePtr) sub);
        !          12919:                         if (tmp2 != 1) ret = 0;
        !          12920:                         sub = sub->next;
        !          12921:                     }
        !          12922:                     tmp = pctxt->state;
        !          12923:                     xmlAutomataNewCountedTrans(pctxt->am,
        !          12924:                         tmp, oldstate, counter);
        !          12925:                     pctxt->state =
        !          12926:                         xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL,
        !          12927:                                                    counter);
        !          12928:                     if ((particle->minOccurs == 0) || (ret == 1)) {
        !          12929:                         xmlAutomataNewEpsilon(pctxt->am,
        !          12930:                                             oldstate, pctxt->state);
        !          12931:                         ret = 1;
        !          12932:                     }
        !          12933:                 } else {
        !          12934:                     sub = particle->children->children;
        !          12935:                     while (sub != NULL) {
        !          12936:                         tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12937:                                         (xmlSchemaParticlePtr) sub);
        !          12938:                         if (tmp2 != 1) ret = 0;
        !          12939:                         sub = sub->next;
        !          12940:                     }
        !          12941:                     if (particle->minOccurs == 0) {
        !          12942:                         xmlAutomataNewEpsilon(pctxt->am, oldstate,
        !          12943:                                               pctxt->state);
        !          12944:                         ret = 1;
        !          12945:                     }
        !          12946:                 }
        !          12947:             }
        !          12948:             break;
        !          12949:         }
        !          12950:         case XML_SCHEMA_TYPE_CHOICE:{
        !          12951:             xmlSchemaTreeItemPtr sub;
        !          12952:             xmlAutomataStatePtr start, end;
        !          12953: 
        !          12954:             ret = 0;
        !          12955:             start = pctxt->state;
        !          12956:             end = xmlAutomataNewState(pctxt->am);
        !          12957: 
        !          12958:             /*
        !          12959:              * iterate over the subtypes and remerge the end with an
        !          12960:              * epsilon transition
        !          12961:              */
        !          12962:             if (particle->maxOccurs == 1) {
        !          12963:                 sub = particle->children->children;
        !          12964:                 while (sub != NULL) {
        !          12965:                     pctxt->state = start;
        !          12966:                     tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12967:                                         (xmlSchemaParticlePtr) sub);
        !          12968:                     if (tmp2 == 1) ret = 1;
        !          12969:                     xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
        !          12970:                     sub = sub->next;
        !          12971:                 }
        !          12972:             } else {
        !          12973:                 int counter;
        !          12974:                 xmlAutomataStatePtr hop, base;
        !          12975:                 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
        !          12976:                     UNBOUNDED : particle->maxOccurs - 1;
        !          12977:                 int minOccurs =
        !          12978:                     particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
        !          12979: 
        !          12980:                 /*
        !          12981:                  * use a counter to keep track of the number of transtions
        !          12982:                  * which went through the choice.
        !          12983:                  */
        !          12984:                 counter =
        !          12985:                     xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
        !          12986:                 hop = xmlAutomataNewState(pctxt->am);
        !          12987:                 base = xmlAutomataNewState(pctxt->am);
        !          12988: 
        !          12989:                 sub = particle->children->children;
        !          12990:                 while (sub != NULL) {
        !          12991:                     pctxt->state = base;
        !          12992:                     tmp2 = xmlSchemaBuildAContentModel(pctxt,
        !          12993:                                         (xmlSchemaParticlePtr) sub);
        !          12994:                     if (tmp2 == 1) ret = 1;
        !          12995:                     xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
        !          12996:                     sub = sub->next;
        !          12997:                 }
        !          12998:                 xmlAutomataNewEpsilon(pctxt->am, start, base);
        !          12999:                 xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter);
        !          13000:                 xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
        !          13001:                 if (ret == 1)
        !          13002:                     xmlAutomataNewEpsilon(pctxt->am, base, end);
        !          13003:             }
        !          13004:             if (particle->minOccurs == 0) {
        !          13005:                 xmlAutomataNewEpsilon(pctxt->am, start, end);
        !          13006:                 ret = 1;
        !          13007:             }
        !          13008:             pctxt->state = end;
        !          13009:             break;
        !          13010:         }
        !          13011:         case XML_SCHEMA_TYPE_ALL:{
        !          13012:             xmlAutomataStatePtr start, tmp;
        !          13013:             xmlSchemaParticlePtr sub;
        !          13014:             xmlSchemaElementPtr elemDecl;
        !          13015: 
        !          13016:             ret = 1;
        !          13017: 
        !          13018:             sub = (xmlSchemaParticlePtr) particle->children->children;
        !          13019:             if (sub == NULL)
        !          13020:                 break;
        !          13021: 
        !          13022:             ret = 0;
        !          13023: 
        !          13024:             start = pctxt->state;
        !          13025:             tmp = xmlAutomataNewState(pctxt->am);
        !          13026:             xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
        !          13027:             pctxt->state = tmp;
        !          13028:             while (sub != NULL) {
        !          13029:                 pctxt->state = tmp;
        !          13030: 
        !          13031:                 elemDecl = (xmlSchemaElementPtr) sub->children;
        !          13032:                 if (elemDecl == NULL) {
        !          13033:                     PERROR_INT("xmlSchemaBuildAContentModel",
        !          13034:                         "<element> particle has no term");
        !          13035:                     return(ret);
        !          13036:                 };
        !          13037:                 /*
        !          13038:                 * NOTE: The {max occurs} of all the particles in the
        !          13039:                 * {particles} of the group must be 0 or 1; this is
        !          13040:                 * already ensured during the parse of the content of
        !          13041:                 * <all>.
        !          13042:                 */
        !          13043:                 if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
        !          13044:                     int counter;
        !          13045: 
        !          13046:                     /*
        !          13047:                      * This is an abstract group, we need to share
        !          13048:                      * the same counter for all the element transitions
        !          13049:                      * derived from the group
        !          13050:                      */
        !          13051:                     counter = xmlAutomataNewCounter(pctxt->am,
        !          13052:                                        sub->minOccurs, sub->maxOccurs);
        !          13053:                     xmlSchemaBuildContentModelForSubstGroup(pctxt,
        !          13054:                                        sub, counter, pctxt->state);
        !          13055:                 } else {
        !          13056:                     if ((sub->minOccurs == 1) &&
        !          13057:                         (sub->maxOccurs == 1)) {
        !          13058:                         xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
        !          13059:                                                 pctxt->state,
        !          13060:                                                 elemDecl->name,
        !          13061:                                                 elemDecl->targetNamespace,
        !          13062:                                                 1, 1, elemDecl);
        !          13063:                     } else if ((sub->minOccurs == 0) &&
        !          13064:                         (sub->maxOccurs == 1)) {
        !          13065: 
        !          13066:                         xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
        !          13067:                                                  pctxt->state,
        !          13068:                                                  elemDecl->name,
        !          13069:                                                  elemDecl->targetNamespace,
        !          13070:                                                  0,
        !          13071:                                                  1,
        !          13072:                                                  elemDecl);
        !          13073:                     }
        !          13074:                 }
        !          13075:                 sub = (xmlSchemaParticlePtr) sub->next;
        !          13076:             }
        !          13077:             pctxt->state =
        !          13078:                 xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0);
        !          13079:             if (particle->minOccurs == 0) {
        !          13080:                 xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state);
        !          13081:                 ret = 1;
        !          13082:             }
        !          13083:             break;
        !          13084:         }
        !          13085:        case XML_SCHEMA_TYPE_GROUP:
        !          13086:            /*
        !          13087:            * If we hit a model group definition, then this means that
        !          13088:            * it was empty, thus was not substituted for the containing
        !          13089:            * model group. Just do nothing in this case.
        !          13090:            * TODO: But the group should be substituted and not occur at
        !          13091:            * all in the content model at this point. Fix this.
        !          13092:            */
        !          13093:             ret = 1;
        !          13094:            break;
        !          13095:         default:
        !          13096:            xmlSchemaInternalErr2(ACTXT_CAST pctxt,
        !          13097:                "xmlSchemaBuildAContentModel",
        !          13098:                "found unexpected term of type '%s' in content model",
        !          13099:                WXS_ITEM_TYPE_NAME(particle->children), NULL);
        !          13100:             return(ret);
        !          13101:     }
        !          13102:     return(ret);
        !          13103: }
        !          13104: 
        !          13105: /**
        !          13106:  * xmlSchemaBuildContentModel:
        !          13107:  * @ctxt:  the schema parser context
        !          13108:  * @type:  the complex type definition
        !          13109:  * @name:  the element name
        !          13110:  *
        !          13111:  * Builds the content model of the complex type.
        !          13112:  */
        !          13113: static void
        !          13114: xmlSchemaBuildContentModel(xmlSchemaTypePtr type,
        !          13115:                           xmlSchemaParserCtxtPtr ctxt)
        !          13116: {
        !          13117:     if ((type->type != XML_SCHEMA_TYPE_COMPLEX) ||
        !          13118:        (type->contModel != NULL) ||
        !          13119:        ((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
        !          13120:        (type->contentType != XML_SCHEMA_CONTENT_MIXED)))
        !          13121:        return;
        !          13122: 
        !          13123: #ifdef DEBUG_CONTENT
        !          13124:     xmlGenericError(xmlGenericErrorContext,
        !          13125:                     "Building content model for %s\n", name);
        !          13126: #endif
        !          13127:     ctxt->am = NULL;
        !          13128:     ctxt->am = xmlNewAutomata();
        !          13129:     if (ctxt->am == NULL) {
        !          13130:         xmlGenericError(xmlGenericErrorContext,
        !          13131:            "Cannot create automata for complex type %s\n", type->name);
        !          13132:         return;
        !          13133:     }
        !          13134:     ctxt->state = xmlAutomataGetInitState(ctxt->am);
        !          13135:     /*
        !          13136:     * Build the automaton.
        !          13137:     */
        !          13138:     xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type));
        !          13139:     xmlAutomataSetFinalState(ctxt->am, ctxt->state);
        !          13140:     type->contModel = xmlAutomataCompile(ctxt->am);
        !          13141:     if (type->contModel == NULL) {
        !          13142:         xmlSchemaPCustomErr(ctxt,
        !          13143:            XML_SCHEMAP_INTERNAL,
        !          13144:            WXS_BASIC_CAST type, type->node,
        !          13145:            "Failed to compile the content model", NULL);
        !          13146:     } else if (xmlRegexpIsDeterminist(type->contModel) != 1) {
        !          13147:         xmlSchemaPCustomErr(ctxt,
        !          13148:            XML_SCHEMAP_NOT_DETERMINISTIC,
        !          13149:            /* XML_SCHEMAS_ERR_NOTDETERMINIST, */
        !          13150:            WXS_BASIC_CAST type, type->node,
        !          13151:            "The content model is not determinist", NULL);
        !          13152:     } else {
        !          13153: #ifdef DEBUG_CONTENT_REGEXP
        !          13154:         xmlGenericError(xmlGenericErrorContext,
        !          13155:                         "Content model of %s:\n", type->name);
        !          13156:         xmlRegexpPrint(stderr, type->contModel);
        !          13157: #endif
        !          13158:     }
        !          13159:     ctxt->state = NULL;
        !          13160:     xmlFreeAutomata(ctxt->am);
        !          13161:     ctxt->am = NULL;
        !          13162: }
        !          13163: 
        !          13164: /**
        !          13165:  * xmlSchemaResolveElementReferences:
        !          13166:  * @elem:  the schema element context
        !          13167:  * @ctxt:  the schema parser context
        !          13168:  *
        !          13169:  * Resolves the references of an element declaration
        !          13170:  * or particle, which has an element declaration as it's
        !          13171:  * term.
        !          13172:  */
        !          13173: static void
        !          13174: xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
        !          13175:                                  xmlSchemaParserCtxtPtr ctxt)
        !          13176: {
        !          13177:     if ((ctxt == NULL) || (elemDecl == NULL) ||
        !          13178:        ((elemDecl != NULL) &&
        !          13179:        (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
        !          13180:         return;
        !          13181:     elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
        !          13182: 
        !          13183:     if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) {
        !          13184:        xmlSchemaTypePtr type;
        !          13185: 
        !          13186:        /* (type definition) ... otherwise the type definition �resolved�
        !          13187:        * to by the �actual value� of the type [attribute] ...
        !          13188:        */
        !          13189:        type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
        !          13190:            elemDecl->namedTypeNs);
        !          13191:        if (type == NULL) {
        !          13192:            xmlSchemaPResCompAttrErr(ctxt,
        !          13193:                XML_SCHEMAP_SRC_RESOLVE,
        !          13194:                WXS_BASIC_CAST elemDecl, elemDecl->node,
        !          13195:                "type", elemDecl->namedType, elemDecl->namedTypeNs,
        !          13196:                XML_SCHEMA_TYPE_BASIC, "type definition");
        !          13197:        } else
        !          13198:            elemDecl->subtypes = type;
        !          13199:     }
        !          13200:     if (elemDecl->substGroup != NULL) {
        !          13201:        xmlSchemaElementPtr substHead;
        !          13202: 
        !          13203:        /*
        !          13204:        * FIXME TODO: Do we need a new field in _xmlSchemaElement for
        !          13205:        * substitutionGroup?
        !          13206:        */
        !          13207:        substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
        !          13208:            elemDecl->substGroupNs);
        !          13209:        if (substHead == NULL) {
        !          13210:            xmlSchemaPResCompAttrErr(ctxt,
        !          13211:                XML_SCHEMAP_SRC_RESOLVE,
        !          13212:                WXS_BASIC_CAST elemDecl, NULL,
        !          13213:                "substitutionGroup", elemDecl->substGroup,
        !          13214:                elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL);
        !          13215:        } else {
        !          13216:            xmlSchemaResolveElementReferences(substHead, ctxt);
        !          13217:            /*
        !          13218:            * Set the "substitution group affiliation".
        !          13219:            * NOTE that now we use the "refDecl" field for this.
        !          13220:            */
        !          13221:            WXS_SUBST_HEAD(elemDecl) = substHead;
        !          13222:            /*
        !          13223:            * The type definitions is set to:
        !          13224:            * SPEC "...the {type definition} of the element
        !          13225:            * declaration �resolved� to by the �actual value�
        !          13226:            * of the substitutionGroup [attribute], if present"
        !          13227:            */
        !          13228:            if (elemDecl->subtypes == NULL)
        !          13229:                elemDecl->subtypes = substHead->subtypes;
        !          13230:        }
        !          13231:     }
        !          13232:     /*
        !          13233:     * SPEC "The definition of anyType serves as the default type definition
        !          13234:     * for element declarations whose XML representation does not specify one."
        !          13235:     */
        !          13236:     if ((elemDecl->subtypes == NULL) &&
        !          13237:        (elemDecl->namedType == NULL) &&
        !          13238:        (elemDecl->substGroup == NULL))
        !          13239:        elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
        !          13240: }
        !          13241: 
        !          13242: /**
        !          13243:  * xmlSchemaResolveUnionMemberTypes:
        !          13244:  * @ctxt:  the schema parser context
        !          13245:  * @type:  the schema simple type definition
        !          13246:  *
        !          13247:  * Checks and builds the "member type definitions" property of the union
        !          13248:  * simple type. This handles part (1), part (2) is done in
        !          13249:  * xmlSchemaFinishMemberTypeDefinitionsProperty()
        !          13250:  *
        !          13251:  * Returns -1 in case of an internal error, 0 otherwise.
        !          13252:  */
        !          13253: static int
        !          13254: xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
        !          13255:                                 xmlSchemaTypePtr type)
        !          13256: {
        !          13257: 
        !          13258:     xmlSchemaTypeLinkPtr link, lastLink, newLink;
        !          13259:     xmlSchemaTypePtr memberType;
        !          13260: 
        !          13261:     /*
        !          13262:     * SPEC (1) "If the <union> alternative is chosen, then [Definition:]
        !          13263:     * define the explicit members as the type definitions �resolved�
        !          13264:     * to by the items in the �actual value� of the memberTypes [attribute],
        !          13265:     * if any, followed by the type definitions corresponding to the
        !          13266:     * <simpleType>s among the [children] of <union>, if any."
        !          13267:     */
        !          13268:     /*
        !          13269:     * Resolve references.
        !          13270:     */
        !          13271:     link = type->memberTypes;
        !          13272:     lastLink = NULL;
        !          13273:     while (link != NULL) {
        !          13274:        const xmlChar *name, *nsName;
        !          13275: 
        !          13276:        name = ((xmlSchemaQNameRefPtr) link->type)->name;
        !          13277:        nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace;
        !          13278: 
        !          13279:        memberType = xmlSchemaGetType(ctxt->schema, name, nsName);
        !          13280:        if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) {
        !          13281:            xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
        !          13282:                WXS_BASIC_CAST type, type->node, "memberTypes",
        !          13283:                name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL);
        !          13284:            /*
        !          13285:            * Remove the member type link.
        !          13286:            */
        !          13287:            if (lastLink == NULL)
        !          13288:                type->memberTypes = link->next;
        !          13289:            else
        !          13290:                lastLink->next = link->next;
        !          13291:            newLink = link;
        !          13292:            link = link->next;
        !          13293:            xmlFree(newLink);
        !          13294:        } else {
        !          13295:            link->type = memberType;
        !          13296:            lastLink = link;
        !          13297:            link = link->next;
        !          13298:        }
        !          13299:     }
        !          13300:     /*
        !          13301:     * Add local simple types,
        !          13302:     */
        !          13303:     memberType = type->subtypes;
        !          13304:     while (memberType != NULL) {
        !          13305:        link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink));
        !          13306:        if (link == NULL) {
        !          13307:            xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL);
        !          13308:            return (-1);
        !          13309:        }
        !          13310:        link->type = memberType;
        !          13311:        link->next = NULL;
        !          13312:        if (lastLink == NULL)
        !          13313:            type->memberTypes = link;
        !          13314:        else
        !          13315:            lastLink->next = link;
        !          13316:        lastLink = link;
        !          13317:        memberType = memberType->next;
        !          13318:     }
        !          13319:     return (0);
        !          13320: }
        !          13321: 
        !          13322: /**
        !          13323:  * xmlSchemaIsDerivedFromBuiltInType:
        !          13324:  * @ctxt:  the schema parser context
        !          13325:  * @type:  the type definition
        !          13326:  * @valType: the value type
        !          13327:  *
        !          13328:  *
        !          13329:  * Returns 1 if the type has the given value type, or
        !          13330:  * is derived from such a type.
        !          13331:  */
        !          13332: static int
        !          13333: xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
        !          13334: {
        !          13335:     if (type == NULL)
        !          13336:        return (0);
        !          13337:     if (WXS_IS_COMPLEX(type))
        !          13338:        return (0);
        !          13339:     if (type->type == XML_SCHEMA_TYPE_BASIC) {
        !          13340:        if (type->builtInType == valType)
        !          13341:            return(1);
        !          13342:        if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
        !          13343:            (type->builtInType == XML_SCHEMAS_ANYTYPE))
        !          13344:            return (0);
        !          13345:        return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
        !          13346:     }
        !          13347:     return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
        !          13348: }
        !          13349: 
        !          13350: #if 0
        !          13351: /**
        !          13352:  * xmlSchemaIsDerivedFromBuiltInType:
        !          13353:  * @ctxt:  the schema parser context
        !          13354:  * @type:  the type definition
        !          13355:  * @valType: the value type
        !          13356:  *
        !          13357:  *
        !          13358:  * Returns 1 if the type has the given value type, or
        !          13359:  * is derived from such a type.
        !          13360:  */
        !          13361: static int
        !          13362: xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
        !          13363: {
        !          13364:     if (type == NULL)
        !          13365:        return (0);
        !          13366:     if (WXS_IS_COMPLEX(type))
        !          13367:        return (0);
        !          13368:     if (type->type == XML_SCHEMA_TYPE_BASIC) {
        !          13369:        if (type->builtInType == valType)
        !          13370:            return(1);
        !          13371:        return (0);
        !          13372:     } else
        !          13373:        return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
        !          13374: 
        !          13375:     return (0);
        !          13376: }
        !          13377: 
        !          13378: static xmlSchemaTypePtr
        !          13379: xmlSchemaQueryBuiltInType(xmlSchemaTypePtr type)
        !          13380: {
        !          13381:     if (type == NULL)
        !          13382:        return (NULL);
        !          13383:     if (WXS_IS_COMPLEX(type))
        !          13384:        return (NULL);
        !          13385:     if (type->type == XML_SCHEMA_TYPE_BASIC)
        !          13386:        return(type);
        !          13387:     return(xmlSchemaQueryBuiltInType(type->subtypes));
        !          13388: }
        !          13389: #endif
        !          13390: 
        !          13391: /**
        !          13392:  * xmlSchemaGetPrimitiveType:
        !          13393:  * @type:  the simpleType definition
        !          13394:  *
        !          13395:  * Returns the primitive type of the given type or
        !          13396:  * NULL in case of error.
        !          13397:  */
        !          13398: static xmlSchemaTypePtr
        !          13399: xmlSchemaGetPrimitiveType(xmlSchemaTypePtr type)
        !          13400: {
        !          13401: 
        !          13402:     while (type != NULL) {
        !          13403:        /*
        !          13404:        * Note that anySimpleType is actually not a primitive type
        !          13405:        * but we need that here.
        !          13406:        */
        !          13407:        if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
        !          13408:           (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
        !          13409:            return (type);
        !          13410:        type = type->baseType;
        !          13411:     }
        !          13412: 
        !          13413:     return (NULL);
        !          13414: }
        !          13415: 
        !          13416: #if 0
        !          13417: /**
        !          13418:  * xmlSchemaGetBuiltInTypeAncestor:
        !          13419:  * @type:  the simpleType definition
        !          13420:  *
        !          13421:  * Returns the primitive type of the given type or
        !          13422:  * NULL in case of error.
        !          13423:  */
        !          13424: static xmlSchemaTypePtr
        !          13425: xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type)
        !          13426: {
        !          13427:     if (WXS_IS_LIST(type) || WXS_IS_UNION(type))
        !          13428:        return (0);
        !          13429:     while (type != NULL) {
        !          13430:        if (type->type == XML_SCHEMA_TYPE_BASIC)
        !          13431:            return (type);
        !          13432:        type = type->baseType;
        !          13433:     }
        !          13434: 
        !          13435:     return (NULL);
        !          13436: }
        !          13437: #endif
        !          13438: 
        !          13439: /**
        !          13440:  * xmlSchemaCloneWildcardNsConstraints:
        !          13441:  * @ctxt:  the schema parser context
        !          13442:  * @dest:  the destination wildcard
        !          13443:  * @source: the source wildcard
        !          13444:  *
        !          13445:  * Clones the namespace constraints of source
        !          13446:  * and assignes them to dest.
        !          13447:  * Returns -1 on internal error, 0 otherwise.
        !          13448:  */
        !          13449: static int
        !          13450: xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
        !          13451:                                    xmlSchemaWildcardPtr dest,
        !          13452:                                    xmlSchemaWildcardPtr source)
        !          13453: {
        !          13454:     xmlSchemaWildcardNsPtr cur, tmp, last;
        !          13455: 
        !          13456:     if ((source == NULL) || (dest == NULL))
        !          13457:        return(-1);
        !          13458:     dest->any = source->any;
        !          13459:     cur = source->nsSet;
        !          13460:     last = NULL;
        !          13461:     while (cur != NULL) {
        !          13462:        tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13463:        if (tmp == NULL)
        !          13464:            return(-1);
        !          13465:        tmp->value = cur->value;
        !          13466:        if (last == NULL)
        !          13467:            dest->nsSet = tmp;
        !          13468:        else
        !          13469:            last->next = tmp;
        !          13470:        last = tmp;
        !          13471:        cur = cur->next;
        !          13472:     }
        !          13473:     if (dest->negNsSet != NULL)
        !          13474:        xmlSchemaFreeWildcardNsSet(dest->negNsSet);
        !          13475:     if (source->negNsSet != NULL) {
        !          13476:        dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13477:        if (dest->negNsSet == NULL)
        !          13478:            return(-1);
        !          13479:        dest->negNsSet->value = source->negNsSet->value;
        !          13480:     } else
        !          13481:        dest->negNsSet = NULL;
        !          13482:     return(0);
        !          13483: }
        !          13484: 
        !          13485: /**
        !          13486:  * xmlSchemaUnionWildcards:
        !          13487:  * @ctxt:  the schema parser context
        !          13488:  * @completeWild:  the first wildcard
        !          13489:  * @curWild: the second wildcard
        !          13490:  *
        !          13491:  * Unions the namespace constraints of the given wildcards.
        !          13492:  * @completeWild will hold the resulting union.
        !          13493:  * Returns a positive error code on failure, -1 in case of an
        !          13494:  * internal error, 0 otherwise.
        !          13495:  */
        !          13496: static int
        !          13497: xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
        !          13498:                            xmlSchemaWildcardPtr completeWild,
        !          13499:                            xmlSchemaWildcardPtr curWild)
        !          13500: {
        !          13501:     xmlSchemaWildcardNsPtr cur, curB, tmp;
        !          13502: 
        !          13503:     /*
        !          13504:     * 1 If O1 and O2 are the same value, then that value must be the
        !          13505:     * value.
        !          13506:     */
        !          13507:     if ((completeWild->any == curWild->any) &&
        !          13508:        ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
        !          13509:        ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
        !          13510: 
        !          13511:        if ((completeWild->negNsSet == NULL) ||
        !          13512:            (completeWild->negNsSet->value == curWild->negNsSet->value)) {
        !          13513: 
        !          13514:            if (completeWild->nsSet != NULL) {
        !          13515:                int found = 0;
        !          13516: 
        !          13517:                /*
        !          13518:                * Check equality of sets.
        !          13519:                */
        !          13520:                cur = completeWild->nsSet;
        !          13521:                while (cur != NULL) {
        !          13522:                    found = 0;
        !          13523:                    curB = curWild->nsSet;
        !          13524:                    while (curB != NULL) {
        !          13525:                        if (cur->value == curB->value) {
        !          13526:                            found = 1;
        !          13527:                            break;
        !          13528:                        }
        !          13529:                        curB = curB->next;
        !          13530:                    }
        !          13531:                    if (!found)
        !          13532:                        break;
        !          13533:                    cur = cur->next;
        !          13534:                }
        !          13535:                if (found)
        !          13536:                    return(0);
        !          13537:            } else
        !          13538:                return(0);
        !          13539:        }
        !          13540:     }
        !          13541:     /*
        !          13542:     * 2 If either O1 or O2 is any, then any must be the value
        !          13543:     */
        !          13544:     if (completeWild->any != curWild->any) {
        !          13545:        if (completeWild->any == 0) {
        !          13546:            completeWild->any = 1;
        !          13547:            if (completeWild->nsSet != NULL) {
        !          13548:                xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13549:                completeWild->nsSet = NULL;
        !          13550:            }
        !          13551:            if (completeWild->negNsSet != NULL) {
        !          13552:                xmlFree(completeWild->negNsSet);
        !          13553:                completeWild->negNsSet = NULL;
        !          13554:            }
        !          13555:        }
        !          13556:        return (0);
        !          13557:     }
        !          13558:     /*
        !          13559:     * 3 If both O1 and O2 are sets of (namespace names or �absent�),
        !          13560:     * then the union of those sets must be the value.
        !          13561:     */
        !          13562:     if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
        !          13563:        int found;
        !          13564:        xmlSchemaWildcardNsPtr start;
        !          13565: 
        !          13566:        cur = curWild->nsSet;
        !          13567:        start = completeWild->nsSet;
        !          13568:        while (cur != NULL) {
        !          13569:            found = 0;
        !          13570:            curB = start;
        !          13571:            while (curB != NULL) {
        !          13572:                if (cur->value == curB->value) {
        !          13573:                    found = 1;
        !          13574:                    break;
        !          13575:                }
        !          13576:                curB = curB->next;
        !          13577:            }
        !          13578:            if (!found) {
        !          13579:                tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13580:                if (tmp == NULL)
        !          13581:                    return (-1);
        !          13582:                tmp->value = cur->value;
        !          13583:                tmp->next = completeWild->nsSet;
        !          13584:                completeWild->nsSet = tmp;
        !          13585:            }
        !          13586:            cur = cur->next;
        !          13587:        }
        !          13588: 
        !          13589:        return(0);
        !          13590:     }
        !          13591:     /*
        !          13592:     * 4 If the two are negations of different values (namespace names
        !          13593:     * or �absent�), then a pair of not and �absent� must be the value.
        !          13594:     */
        !          13595:     if ((completeWild->negNsSet != NULL) &&
        !          13596:        (curWild->negNsSet != NULL) &&
        !          13597:        (completeWild->negNsSet->value != curWild->negNsSet->value)) {
        !          13598:        completeWild->negNsSet->value = NULL;
        !          13599: 
        !          13600:        return(0);
        !          13601:     }
        !          13602:     /*
        !          13603:      * 5.
        !          13604:      */
        !          13605:     if (((completeWild->negNsSet != NULL) &&
        !          13606:        (completeWild->negNsSet->value != NULL) &&
        !          13607:        (curWild->nsSet != NULL)) ||
        !          13608:        ((curWild->negNsSet != NULL) &&
        !          13609:        (curWild->negNsSet->value != NULL) &&
        !          13610:        (completeWild->nsSet != NULL))) {
        !          13611: 
        !          13612:        int nsFound, absentFound = 0;
        !          13613: 
        !          13614:        if (completeWild->nsSet != NULL) {
        !          13615:            cur = completeWild->nsSet;
        !          13616:            curB = curWild->negNsSet;
        !          13617:        } else {
        !          13618:            cur = curWild->nsSet;
        !          13619:            curB = completeWild->negNsSet;
        !          13620:        }
        !          13621:        nsFound = 0;
        !          13622:        while (cur != NULL) {
        !          13623:            if (cur->value == NULL)
        !          13624:                absentFound = 1;
        !          13625:            else if (cur->value == curB->value)
        !          13626:                nsFound = 1;
        !          13627:            if (nsFound && absentFound)
        !          13628:                break;
        !          13629:            cur = cur->next;
        !          13630:        }
        !          13631: 
        !          13632:        if (nsFound && absentFound) {
        !          13633:            /*
        !          13634:            * 5.1 If the set S includes both the negated namespace
        !          13635:            * name and �absent�, then any must be the value.
        !          13636:            */
        !          13637:            completeWild->any = 1;
        !          13638:            if (completeWild->nsSet != NULL) {
        !          13639:                xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13640:                completeWild->nsSet = NULL;
        !          13641:            }
        !          13642:            if (completeWild->negNsSet != NULL) {
        !          13643:                xmlFree(completeWild->negNsSet);
        !          13644:                completeWild->negNsSet = NULL;
        !          13645:            }
        !          13646:        } else if (nsFound && (!absentFound)) {
        !          13647:            /*
        !          13648:            * 5.2 If the set S includes the negated namespace name
        !          13649:            * but not �absent�, then a pair of not and �absent� must
        !          13650:            * be the value.
        !          13651:            */
        !          13652:            if (completeWild->nsSet != NULL) {
        !          13653:                xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13654:                completeWild->nsSet = NULL;
        !          13655:            }
        !          13656:            if (completeWild->negNsSet == NULL) {
        !          13657:                completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13658:                if (completeWild->negNsSet == NULL)
        !          13659:                    return (-1);
        !          13660:            }
        !          13661:            completeWild->negNsSet->value = NULL;
        !          13662:        } else if ((!nsFound) && absentFound) {
        !          13663:            /*
        !          13664:            * 5.3 If the set S includes �absent� but not the negated
        !          13665:            * namespace name, then the union is not expressible.
        !          13666:            */
        !          13667:            xmlSchemaPErr(ctxt, completeWild->node,
        !          13668:                XML_SCHEMAP_UNION_NOT_EXPRESSIBLE,
        !          13669:                "The union of the wilcard is not expressible.\n",
        !          13670:                NULL, NULL);
        !          13671:            return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE);
        !          13672:        } else if ((!nsFound) && (!absentFound)) {
        !          13673:            /*
        !          13674:            * 5.4 If the set S does not include either the negated namespace
        !          13675:            * name or �absent�, then whichever of O1 or O2 is a pair of not
        !          13676:            * and a namespace name must be the value.
        !          13677:            */
        !          13678:            if (completeWild->negNsSet == NULL) {
        !          13679:                if (completeWild->nsSet != NULL) {
        !          13680:                    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13681:                    completeWild->nsSet = NULL;
        !          13682:                }
        !          13683:                completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13684:                if (completeWild->negNsSet == NULL)
        !          13685:                    return (-1);
        !          13686:                completeWild->negNsSet->value = curWild->negNsSet->value;
        !          13687:            }
        !          13688:        }
        !          13689:        return (0);
        !          13690:     }
        !          13691:     /*
        !          13692:      * 6.
        !          13693:      */
        !          13694:     if (((completeWild->negNsSet != NULL) &&
        !          13695:        (completeWild->negNsSet->value == NULL) &&
        !          13696:        (curWild->nsSet != NULL)) ||
        !          13697:        ((curWild->negNsSet != NULL) &&
        !          13698:        (curWild->negNsSet->value == NULL) &&
        !          13699:        (completeWild->nsSet != NULL))) {
        !          13700: 
        !          13701:        if (completeWild->nsSet != NULL) {
        !          13702:            cur = completeWild->nsSet;
        !          13703:        } else {
        !          13704:            cur = curWild->nsSet;
        !          13705:        }
        !          13706:        while (cur != NULL) {
        !          13707:            if (cur->value == NULL) {
        !          13708:                /*
        !          13709:                * 6.1 If the set S includes �absent�, then any must be the
        !          13710:                * value.
        !          13711:                */
        !          13712:                completeWild->any = 1;
        !          13713:                if (completeWild->nsSet != NULL) {
        !          13714:                    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13715:                    completeWild->nsSet = NULL;
        !          13716:                }
        !          13717:                if (completeWild->negNsSet != NULL) {
        !          13718:                    xmlFree(completeWild->negNsSet);
        !          13719:                    completeWild->negNsSet = NULL;
        !          13720:                }
        !          13721:                return (0);
        !          13722:            }
        !          13723:            cur = cur->next;
        !          13724:        }
        !          13725:        if (completeWild->negNsSet == NULL) {
        !          13726:            /*
        !          13727:            * 6.2 If the set S does not include �absent�, then a pair of not
        !          13728:            * and �absent� must be the value.
        !          13729:            */
        !          13730:            if (completeWild->nsSet != NULL) {
        !          13731:                xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
        !          13732:                completeWild->nsSet = NULL;
        !          13733:            }
        !          13734:            completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
        !          13735:            if (completeWild->negNsSet == NULL)
        !          13736:                return (-1);
        !          13737:            completeWild->negNsSet->value = NULL;
        !          13738:        }
        !          13739:        return (0);
        !          13740:     }
        !          13741:     return (0);
        !          13742: 
        !          13743: }
        !          13744: 
        !          13745: /**
        !          13746:  * xmlSchemaIntersectWildcards:
        !          13747:  * @ctxt:  the schema parser context
        !          13748:  * @completeWild:  the first wildcard
        !          13749:  * @curWild: the second wildcard
        !          13750:  *
        !          13751:  * Intersects the namespace constraints of the given wildcards.
        !          13752:  * @completeWild will hold the resulting intersection.
        !          13753:  * Returns a positive error code on failure, -1 in case of an
        !          13754:  * internal error, 0 otherwise.
        !          13755:  */
        !          13756: static int
        !          13757: xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
        !          13758:                            xmlSchemaWildcardPtr completeWild,
        !          13759:                            xmlSchemaWildcardPtr curWild)
        !          13760: {
        !          13761:     xmlSchemaWildcardNsPtr cur, curB, prev,  tmp;
        !          13762: 
        !          13763:     /*
        !          13764:     * 1 If O1 and O2 are the same value, then that value must be the
        !          13765:     * value.
        !          13766:     */
        !          13767:     if ((completeWild->any == curWild->any) &&
        !          13768:        ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
        !          13769:        ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
        !          13770: 
        !          13771:        if ((completeWild->negNsSet == NULL) ||
        !          13772:            (completeWild->negNsSet->value == curWild->negNsSet->value)) {
        !          13773: 
        !          13774:            if (completeWild->nsSet != NULL) {
        !          13775:                int found = 0;
        !          13776: 
        !          13777:                /*
        !          13778:                * Check equality of sets.
        !          13779:                */
        !          13780:                cur = completeWild->nsSet;
        !          13781:                while (cur != NULL) {
        !          13782:                    found = 0;
        !          13783:                    curB = curWild->nsSet;
        !          13784:                    while (curB != NULL) {
        !          13785:                        if (cur->value == curB->value) {
        !          13786:                            found = 1;
        !          13787:                            break;
        !          13788:                        }
        !          13789:                        curB = curB->next;
        !          13790:                    }
        !          13791:                    if (!found)
        !          13792:                        break;
        !          13793:                    cur = cur->next;
        !          13794:                }
        !          13795:                if (found)
        !          13796:                    return(0);
        !          13797:            } else
        !          13798:                return(0);
        !          13799:        }
        !          13800:     }
        !          13801:     /*
        !          13802:     * 2 If either O1 or O2 is any, then the other must be the value.
        !          13803:     */
        !          13804:     if ((completeWild->any != curWild->any) && (completeWild->any)) {
        !          13805:        if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
        !          13806:            return(-1);
        !          13807:        return(0);
        !          13808:     }
        !          13809:     /*
        !          13810:     * 3 If either O1 or O2 is a pair of not and a value (a namespace
        !          13811:     * name or �absent�) and the other is a set of (namespace names or
        !          13812:     * �absent�), then that set, minus the negated value if it was in
        !          13813:     * the set, minus �absent� if it was in the set, must be the value.
        !          13814:     */
        !          13815:     if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) ||
        !          13816:        ((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) {
        !          13817:        const xmlChar *neg;
        !          13818: 
        !          13819:        if (completeWild->nsSet == NULL) {
        !          13820:            neg = completeWild->negNsSet->value;
        !          13821:            if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
        !          13822:                return(-1);
        !          13823:        } else
        !          13824:            neg = curWild->negNsSet->value;
        !          13825:        /*
        !          13826:        * Remove absent and negated.
        !          13827:        */
        !          13828:        prev = NULL;
        !          13829:        cur = completeWild->nsSet;
        !          13830:        while (cur != NULL) {
        !          13831:            if (cur->value == NULL) {
        !          13832:                if (prev == NULL)
        !          13833:                    completeWild->nsSet = cur->next;
        !          13834:                else
        !          13835:                    prev->next = cur->next;
        !          13836:                xmlFree(cur);
        !          13837:                break;
        !          13838:            }
        !          13839:            prev = cur;
        !          13840:            cur = cur->next;
        !          13841:        }
        !          13842:        if (neg != NULL) {
        !          13843:            prev = NULL;
        !          13844:            cur = completeWild->nsSet;
        !          13845:            while (cur != NULL) {
        !          13846:                if (cur->value == neg) {
        !          13847:                    if (prev == NULL)
        !          13848:                        completeWild->nsSet = cur->next;
        !          13849:                    else
        !          13850:                        prev->next = cur->next;
        !          13851:                    xmlFree(cur);
        !          13852:                    break;
        !          13853:                }
        !          13854:                prev = cur;
        !          13855:                cur = cur->next;
        !          13856:            }
        !          13857:        }
        !          13858: 
        !          13859:        return(0);
        !          13860:     }
        !          13861:     /*
        !          13862:     * 4 If both O1 and O2 are sets of (namespace names or �absent�),
        !          13863:     * then the intersection of those sets must be the value.
        !          13864:     */
        !          13865:     if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
        !          13866:        int found;
        !          13867: 
        !          13868:        cur = completeWild->nsSet;
        !          13869:        prev = NULL;
        !          13870:        while (cur != NULL) {
        !          13871:            found = 0;
        !          13872:            curB = curWild->nsSet;
        !          13873:            while (curB != NULL) {
        !          13874:                if (cur->value == curB->value) {
        !          13875:                    found = 1;
        !          13876:                    break;
        !          13877:                }
        !          13878:                curB = curB->next;
        !          13879:            }
        !          13880:            if (!found) {
        !          13881:                if (prev == NULL)
        !          13882:                    completeWild->nsSet = cur->next;
        !          13883:                else
        !          13884:                    prev->next = cur->next;
        !          13885:                tmp = cur->next;
        !          13886:                xmlFree(cur);
        !          13887:                cur = tmp;
        !          13888:                continue;
        !          13889:            }
        !          13890:            prev = cur;
        !          13891:            cur = cur->next;
        !          13892:        }
        !          13893: 
        !          13894:        return(0);
        !          13895:     }
        !          13896:     /* 5 If the two are negations of different namespace names,
        !          13897:     * then the intersection is not expressible
        !          13898:     */
        !          13899:     if ((completeWild->negNsSet != NULL) &&
        !          13900:        (curWild->negNsSet != NULL) &&
        !          13901:        (completeWild->negNsSet->value != curWild->negNsSet->value) &&
        !          13902:        (completeWild->negNsSet->value != NULL) &&
        !          13903:        (curWild->negNsSet->value != NULL)) {
        !          13904: 
        !          13905:        xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE,
        !          13906:            "The intersection of the wilcard is not expressible.\n",
        !          13907:            NULL, NULL);
        !          13908:        return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE);
        !          13909:     }
        !          13910:     /*
        !          13911:     * 6 If the one is a negation of a namespace name and the other
        !          13912:     * is a negation of �absent�, then the one which is the negation
        !          13913:     * of a namespace name must be the value.
        !          13914:     */
        !          13915:     if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) &&
        !          13916:        (completeWild->negNsSet->value != curWild->negNsSet->value) &&
        !          13917:        (completeWild->negNsSet->value == NULL)) {
        !          13918:        completeWild->negNsSet->value =  curWild->negNsSet->value;
        !          13919:     }
        !          13920:     return(0);
        !          13921: }
        !          13922: 
        !          13923: /**
        !          13924:  * xmlSchemaIsWildcardNsConstraintSubset:
        !          13925:  * @ctxt:  the schema parser context
        !          13926:  * @sub:  the first wildcard
        !          13927:  * @super: the second wildcard
        !          13928:  *
        !          13929:  * Schema Component Constraint: Wildcard Subset (cos-ns-subset)
        !          13930:  *
        !          13931:  * Returns 0 if the namespace constraint of @sub is an intensional
        !          13932:  * subset of @super, 1 otherwise.
        !          13933:  */
        !          13934: static int
        !          13935: xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
        !          13936:                          xmlSchemaWildcardPtr super)
        !          13937: {
        !          13938:     /*
        !          13939:     * 1 super must be any.
        !          13940:     */
        !          13941:     if (super->any)
        !          13942:        return (0);
        !          13943:     /*
        !          13944:     * 2.1 sub must be a pair of not and a namespace name or �absent�.
        !          13945:     * 2.2 super must be a pair of not and the same value.
        !          13946:     */
        !          13947:     if ((sub->negNsSet != NULL) &&
        !          13948:        (super->negNsSet != NULL) &&
        !          13949:        (sub->negNsSet->value == sub->negNsSet->value))
        !          13950:        return (0);
        !          13951:     /*
        !          13952:     * 3.1 sub must be a set whose members are either namespace names or �absent�.
        !          13953:     */
        !          13954:     if (sub->nsSet != NULL) {
        !          13955:        /*
        !          13956:        * 3.2.1 super must be the same set or a superset thereof.
        !          13957:        */
        !          13958:        if (super->nsSet != NULL) {
        !          13959:            xmlSchemaWildcardNsPtr cur, curB;
        !          13960:            int found = 0;
        !          13961: 
        !          13962:            cur = sub->nsSet;
        !          13963:            while (cur != NULL) {
        !          13964:                found = 0;
        !          13965:                curB = super->nsSet;
        !          13966:                while (curB != NULL) {
        !          13967:                    if (cur->value == curB->value) {
        !          13968:                        found = 1;
        !          13969:                        break;
        !          13970:                    }
        !          13971:                    curB = curB->next;
        !          13972:                }
        !          13973:                if (!found)
        !          13974:                    return (1);
        !          13975:                cur = cur->next;
        !          13976:            }
        !          13977:            if (found)
        !          13978:                return (0);
        !          13979:        } else if (super->negNsSet != NULL) {
        !          13980:            xmlSchemaWildcardNsPtr cur;
        !          13981:            /*
        !          13982:            * 3.2.2 super must be a pair of not and a namespace name or
        !          13983:            * �absent� and that value must not be in sub's set.
        !          13984:            */
        !          13985:            cur = sub->nsSet;
        !          13986:            while (cur != NULL) {
        !          13987:                if (cur->value == super->negNsSet->value)
        !          13988:                    return (1);
        !          13989:                cur = cur->next;
        !          13990:            }
        !          13991:            return (0);
        !          13992:        }
        !          13993:     }
        !          13994:     return (1);
        !          13995: }
        !          13996: 
        !          13997: static int
        !          13998: xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
        !          13999:                                     int *fixed,
        !          14000:                                     const xmlChar **value,
        !          14001:                                     xmlSchemaValPtr *val)
        !          14002: {
        !          14003:     *fixed = 0;
        !          14004:     *value = NULL;
        !          14005:     if (val != 0)
        !          14006:        *val = NULL;
        !          14007: 
        !          14008:     if (attruse->defValue != NULL) {
        !          14009:        *value = attruse->defValue;
        !          14010:        if (val != NULL)
        !          14011:            *val = attruse->defVal;
        !          14012:        if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
        !          14013:            *fixed = 1;
        !          14014:        return(1);
        !          14015:     } else if ((attruse->attrDecl != NULL) &&
        !          14016:        (attruse->attrDecl->defValue != NULL)) {
        !          14017:        *value = attruse->attrDecl->defValue;
        !          14018:        if (val != NULL)
        !          14019:            *val = attruse->attrDecl->defVal;
        !          14020:        if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
        !          14021:            *fixed = 1;
        !          14022:        return(1);
        !          14023:     }
        !          14024:     return(0);
        !          14025: }
        !          14026: /**
        !          14027:  * xmlSchemaCheckCVCWildcardNamespace:
        !          14028:  * @wild:  the wildcard
        !          14029:  * @ns:  the namespace
        !          14030:  *
        !          14031:  * Validation Rule: Wildcard allows Namespace Name
        !          14032:  * (cvc-wildcard-namespace)
        !          14033:  *
        !          14034:  * Returns 0 if the given namespace matches the wildcard,
        !          14035:  * 1 otherwise and -1 on API errors.
        !          14036:  */
        !          14037: static int
        !          14038: xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
        !          14039:                                   const xmlChar* ns)
        !          14040: {
        !          14041:     if (wild == NULL)
        !          14042:        return(-1);
        !          14043: 
        !          14044:     if (wild->any)
        !          14045:        return(0);
        !          14046:     else if (wild->nsSet != NULL) {
        !          14047:        xmlSchemaWildcardNsPtr cur;
        !          14048: 
        !          14049:        cur = wild->nsSet;
        !          14050:        while (cur != NULL) {
        !          14051:            if (xmlStrEqual(cur->value, ns))
        !          14052:                return(0);
        !          14053:            cur = cur->next;
        !          14054:        }
        !          14055:     } else if ((wild->negNsSet != NULL) && (ns != NULL) &&
        !          14056:        (!xmlStrEqual(wild->negNsSet->value, ns)))
        !          14057:        return(0);
        !          14058: 
        !          14059:     return(1);
        !          14060: }
        !          14061: 
        !          14062: #define XML_SCHEMA_ACTION_DERIVE 0
        !          14063: #define XML_SCHEMA_ACTION_REDEFINE 1
        !          14064: 
        !          14065: #define WXS_ACTION_STR(a) \
        !          14066: ((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
        !          14067: 
        !          14068: /*
        !          14069: * Schema Component Constraint:
        !          14070: *   Derivation Valid (Restriction, Complex)
        !          14071: *   derivation-ok-restriction (2) - (4)
        !          14072: *
        !          14073: * ATTENTION:
        !          14074: * In XML Schema 1.1 this will be:
        !          14075: * Validation Rule:
        !          14076: *     Checking complex type subsumption (practicalSubsumption) (1, 2 and 3)
        !          14077: *
        !          14078: */
        !          14079: static int
        !          14080: xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
        !          14081:                                       int action,
        !          14082:                                       xmlSchemaBasicItemPtr item,
        !          14083:                                       xmlSchemaBasicItemPtr baseItem,
        !          14084:                                       xmlSchemaItemListPtr uses,
        !          14085:                                       xmlSchemaItemListPtr baseUses,
        !          14086:                                       xmlSchemaWildcardPtr wild,
        !          14087:                                       xmlSchemaWildcardPtr baseWild)
        !          14088: {
        !          14089:     xmlSchemaAttributeUsePtr cur = NULL, bcur;
        !          14090:     int i, j, found; /* err = 0; */
        !          14091:     const xmlChar *bEffValue;
        !          14092:     int effFixed;
        !          14093: 
        !          14094:     if (uses != NULL) {
        !          14095:        for (i = 0; i < uses->nbItems; i++) {
        !          14096:            cur = uses->items[i];
        !          14097:            found = 0;
        !          14098:            if (baseUses == NULL)
        !          14099:                goto not_found;
        !          14100:            for (j = 0; j < baseUses->nbItems; j++) {
        !          14101:                bcur = baseUses->items[j];
        !          14102:                if ((WXS_ATTRUSE_DECL_NAME(cur) ==
        !          14103:                        WXS_ATTRUSE_DECL_NAME(bcur)) &&
        !          14104:                    (WXS_ATTRUSE_DECL_TNS(cur) ==
        !          14105:                        WXS_ATTRUSE_DECL_TNS(bcur)))
        !          14106:                {
        !          14107:                    /*
        !          14108:                    * (2.1) "If there is an attribute use in the {attribute
        !          14109:                    * uses} of the {base type definition} (call this B) whose
        !          14110:                    * {attribute declaration} has the same {name} and {target
        !          14111:                    * namespace}, then  all of the following must be true:"
        !          14112:                    */
        !          14113:                    found = 1;
        !          14114: 
        !          14115:                    if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
        !          14116:                        (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
        !          14117:                    {
        !          14118:                        xmlChar *str = NULL;
        !          14119:                        /*
        !          14120:                        * (2.1.1) "one of the following must be true:"
        !          14121:                        * (2.1.1.1) "B's {required} is false."
        !          14122:                        * (2.1.1.2) "R's {required} is true."
        !          14123:                        */
        !          14124:                        xmlSchemaPAttrUseErr4(pctxt,
        !          14125:                            XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1,
        !          14126:                            WXS_ITEM_NODE(item), item, cur,
        !          14127:                            "The 'optional' attribute use is inconsistent "
        !          14128:                            "with the corresponding 'required' attribute use of "
        !          14129:                            "the %s %s",
        !          14130:                            WXS_ACTION_STR(action),
        !          14131:                            xmlSchemaGetComponentDesignation(&str, baseItem),
        !          14132:                            NULL, NULL);
        !          14133:                        FREE_AND_NULL(str);
        !          14134:                        /* err = pctxt->err; */
        !          14135:                    } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
        !          14136:                        WXS_ATTRUSE_TYPEDEF(cur),
        !          14137:                        WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
        !          14138:                    {
        !          14139:                        xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
        !          14140: 
        !          14141:                        /*
        !          14142:                        * SPEC (2.1.2) "R's {attribute declaration}'s
        !          14143:                        * {type definition} must be validly derived from
        !          14144:                        * B's {type definition} given the empty set as
        !          14145:                        * defined in Type Derivation OK (Simple) (�3.14.6)."
        !          14146:                        */
        !          14147:                        xmlSchemaPAttrUseErr4(pctxt,
        !          14148:                            XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2,
        !          14149:                            WXS_ITEM_NODE(item), item, cur,
        !          14150:                            "The attribute declaration's %s "
        !          14151:                            "is not validly derived from "
        !          14152:                            "the corresponding %s of the "
        !          14153:                            "attribute declaration in the %s %s",
        !          14154:                            xmlSchemaGetComponentDesignation(&strA,
        !          14155:                                WXS_ATTRUSE_TYPEDEF(cur)),
        !          14156:                            xmlSchemaGetComponentDesignation(&strB,
        !          14157:                                WXS_ATTRUSE_TYPEDEF(bcur)),
        !          14158:                            WXS_ACTION_STR(action),
        !          14159:                            xmlSchemaGetComponentDesignation(&strC, baseItem));
        !          14160:                            /* xmlSchemaGetComponentDesignation(&str, baseItem), */
        !          14161:                        FREE_AND_NULL(strA);
        !          14162:                        FREE_AND_NULL(strB);
        !          14163:                        FREE_AND_NULL(strC);
        !          14164:                        /* err = pctxt->err; */
        !          14165:                    } else {
        !          14166:                        /*
        !          14167:                        * 2.1.3 [Definition:]  Let the effective value
        !          14168:                        * constraint of an attribute use be its {value
        !          14169:                        * constraint}, if present, otherwise its {attribute
        !          14170:                        * declaration}'s {value constraint} .
        !          14171:                        */
        !          14172:                        xmlSchemaGetEffectiveValueConstraint(bcur,
        !          14173:                            &effFixed, &bEffValue, NULL);
        !          14174:                        /*
        !          14175:                        * 2.1.3 ... one of the following must be true
        !          14176:                        *
        !          14177:                        * 2.1.3.1 B's �effective value constraint� is
        !          14178:                        * �absent� or default.
        !          14179:                        */
        !          14180:                        if ((bEffValue != NULL) &&
        !          14181:                            (effFixed == 1)) {
        !          14182:                            const xmlChar *rEffValue = NULL;
        !          14183: 
        !          14184:                            xmlSchemaGetEffectiveValueConstraint(bcur,
        !          14185:                                &effFixed, &rEffValue, NULL);
        !          14186:                            /*
        !          14187:                            * 2.1.3.2 R's �effective value constraint� is
        !          14188:                            * fixed with the same string as B's.
        !          14189:                            * MAYBE TODO: Compare the computed values.
        !          14190:                            *       Hmm, it says "same string" so
        !          14191:                            *       string-equality might really be sufficient.
        !          14192:                            */
        !          14193:                            if ((effFixed == 0) ||
        !          14194:                                (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
        !          14195:                            {
        !          14196:                                xmlChar *str = NULL;
        !          14197: 
        !          14198:                                xmlSchemaPAttrUseErr4(pctxt,
        !          14199:                                    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3,
        !          14200:                                    WXS_ITEM_NODE(item), item, cur,
        !          14201:                                    "The effective value constraint of the "
        !          14202:                                    "attribute use is inconsistent with "
        !          14203:                                    "its correspondent in the %s %s",
        !          14204:                                    WXS_ACTION_STR(action),
        !          14205:                                    xmlSchemaGetComponentDesignation(&str,
        !          14206:                                        baseItem),
        !          14207:                                    NULL, NULL);
        !          14208:                                FREE_AND_NULL(str);
        !          14209:                                /* err = pctxt->err; */
        !          14210:                            }
        !          14211:                        }
        !          14212:                    }
        !          14213:                    break;
        !          14214:                }
        !          14215:            }
        !          14216: not_found:
        !          14217:            if (!found) {
        !          14218:                /*
        !          14219:                * (2.2) "otherwise the {base type definition} must have an
        !          14220:                * {attribute wildcard} and the {target namespace} of the
        !          14221:                * R's {attribute declaration} must be �valid� with respect
        !          14222:                * to that wildcard, as defined in Wildcard allows Namespace
        !          14223:                * Name (�3.10.4)."
        !          14224:                */
        !          14225:                if ((baseWild == NULL) ||
        !          14226:                    (xmlSchemaCheckCVCWildcardNamespace(baseWild,
        !          14227:                    (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0))
        !          14228:                {
        !          14229:                    xmlChar *str = NULL;
        !          14230: 
        !          14231:                    xmlSchemaPAttrUseErr4(pctxt,
        !          14232:                        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2,
        !          14233:                        WXS_ITEM_NODE(item), item, cur,
        !          14234:                        "Neither a matching attribute use, "
        !          14235:                        "nor a matching wildcard exists in the %s %s",
        !          14236:                        WXS_ACTION_STR(action),
        !          14237:                        xmlSchemaGetComponentDesignation(&str, baseItem),
        !          14238:                        NULL, NULL);
        !          14239:                    FREE_AND_NULL(str);
        !          14240:                    /* err = pctxt->err; */
        !          14241:                }
        !          14242:            }
        !          14243:        }
        !          14244:     }
        !          14245:     /*
        !          14246:     * SPEC derivation-ok-restriction (3):
        !          14247:     * (3) "For each attribute use in the {attribute uses} of the {base type
        !          14248:     * definition} whose {required} is true, there must be an attribute
        !          14249:     * use with an {attribute declaration} with the same {name} and
        !          14250:     * {target namespace} as its {attribute declaration} in the {attribute
        !          14251:     * uses} of the complex type definition itself whose {required} is true.
        !          14252:     */
        !          14253:     if (baseUses != NULL) {
        !          14254:        for (j = 0; j < baseUses->nbItems; j++) {
        !          14255:            bcur = baseUses->items[j];
        !          14256:            if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
        !          14257:                continue;
        !          14258:            found = 0;
        !          14259:            if (uses != NULL) {
        !          14260:                for (i = 0; i < uses->nbItems; i++) {
        !          14261:                    cur = uses->items[i];
        !          14262:                    if ((WXS_ATTRUSE_DECL_NAME(cur) ==
        !          14263:                        WXS_ATTRUSE_DECL_NAME(bcur)) &&
        !          14264:                        (WXS_ATTRUSE_DECL_TNS(cur) ==
        !          14265:                        WXS_ATTRUSE_DECL_TNS(bcur))) {
        !          14266:                        found = 1;
        !          14267:                        break;
        !          14268:                    }
        !          14269:                }
        !          14270:            }
        !          14271:            if (!found) {
        !          14272:                xmlChar *strA = NULL, *strB = NULL;
        !          14273: 
        !          14274:                xmlSchemaCustomErr4(ACTXT_CAST pctxt,
        !          14275:                    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3,
        !          14276:                    NULL, item,
        !          14277:                    "A matching attribute use for the "
        !          14278:                    "'required' %s of the %s %s is missing",
        !          14279:                    xmlSchemaGetComponentDesignation(&strA, bcur),
        !          14280:                    WXS_ACTION_STR(action),
        !          14281:                    xmlSchemaGetComponentDesignation(&strB, baseItem),
        !          14282:                    NULL);
        !          14283:                FREE_AND_NULL(strA);
        !          14284:                FREE_AND_NULL(strB);
        !          14285:            }
        !          14286:        }
        !          14287:     }
        !          14288:     /*
        !          14289:     * derivation-ok-restriction (4)
        !          14290:     */
        !          14291:     if (wild != NULL) {
        !          14292:        /*
        !          14293:        * (4) "If there is an {attribute wildcard}, all of the
        !          14294:        * following must be true:"
        !          14295:        */
        !          14296:        if (baseWild == NULL) {
        !          14297:            xmlChar *str = NULL;
        !          14298: 
        !          14299:            /*
        !          14300:            * (4.1) "The {base type definition} must also have one."
        !          14301:            */
        !          14302:            xmlSchemaCustomErr4(ACTXT_CAST pctxt,
        !          14303:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1,
        !          14304:                NULL, item,
        !          14305:                "The %s has an attribute wildcard, "
        !          14306:                "but the %s %s '%s' does not have one",
        !          14307:                WXS_ITEM_TYPE_NAME(item),
        !          14308:                WXS_ACTION_STR(action),
        !          14309:                WXS_ITEM_TYPE_NAME(baseItem),
        !          14310:                xmlSchemaGetComponentQName(&str, baseItem));
        !          14311:            FREE_AND_NULL(str);
        !          14312:            return(pctxt->err);
        !          14313:        } else if ((baseWild->any == 0) &&
        !          14314:                xmlSchemaCheckCOSNSSubset(wild, baseWild))
        !          14315:        {
        !          14316:            xmlChar *str = NULL;
        !          14317:            /*
        !          14318:            * (4.2) "The complex type definition's {attribute wildcard}'s
        !          14319:            * {namespace constraint} must be a subset of the {base type
        !          14320:            * definition}'s {attribute wildcard}'s {namespace constraint},
        !          14321:            * as defined by Wildcard Subset (�3.10.6)."
        !          14322:            */
        !          14323:            xmlSchemaCustomErr4(ACTXT_CAST pctxt,
        !          14324:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2,
        !          14325:                NULL, item,
        !          14326:                "The attribute wildcard is not a valid "
        !          14327:                "subset of the wildcard in the %s %s '%s'",
        !          14328:                WXS_ACTION_STR(action),
        !          14329:                WXS_ITEM_TYPE_NAME(baseItem),
        !          14330:                xmlSchemaGetComponentQName(&str, baseItem),
        !          14331:                NULL);
        !          14332:            FREE_AND_NULL(str);
        !          14333:            return(pctxt->err);
        !          14334:        }
        !          14335:        /* 4.3 Unless the {base type definition} is the �ur-type
        !          14336:        * definition�, the complex type definition's {attribute
        !          14337:        * wildcard}'s {process contents} must be identical to or
        !          14338:        * stronger than the {base type definition}'s {attribute
        !          14339:        * wildcard}'s {process contents}, where strict is stronger
        !          14340:        * than lax is stronger than skip.
        !          14341:        */
        !          14342:        if ((! WXS_IS_ANYTYPE(baseItem)) &&
        !          14343:            (wild->processContents < baseWild->processContents)) {
        !          14344:            xmlChar *str = NULL;
        !          14345:            xmlSchemaCustomErr4(ACTXT_CAST pctxt,
        !          14346:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3,
        !          14347:                NULL, baseItem,
        !          14348:                "The {process contents} of the attribute wildcard is "
        !          14349:                "weaker than the one in the %s %s '%s'",
        !          14350:                WXS_ACTION_STR(action),
        !          14351:                WXS_ITEM_TYPE_NAME(baseItem),
        !          14352:                xmlSchemaGetComponentQName(&str, baseItem),
        !          14353:                NULL);
        !          14354:            FREE_AND_NULL(str)
        !          14355:                return(pctxt->err);
        !          14356:        }
        !          14357:     }
        !          14358:     return(0);
        !          14359: }
        !          14360: 
        !          14361: 
        !          14362: static int
        !          14363: xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
        !          14364:                                  xmlSchemaBasicItemPtr item,
        !          14365:                                  xmlSchemaWildcardPtr *completeWild,
        !          14366:                                  xmlSchemaItemListPtr list,
        !          14367:                                  xmlSchemaItemListPtr prohibs);
        !          14368: /**
        !          14369:  * xmlSchemaFixupTypeAttributeUses:
        !          14370:  * @ctxt:  the schema parser context
        !          14371:  * @type:  the complex type definition
        !          14372:  *
        !          14373:  *
        !          14374:  * Builds the wildcard and the attribute uses on the given complex type.
        !          14375:  * Returns -1 if an internal error occurs, 0 otherwise.
        !          14376:  *
        !          14377:  * ATTENTION TODO: Experimantally this uses pointer comparisons for
        !          14378:  * strings, so recheck this if we start to hardcode some schemata, since
        !          14379:  * they might not be in the same dict.
        !          14380:  * NOTE: It is allowed to "extend" the xs:anyType type.
        !          14381:  */
        !          14382: static int
        !          14383: xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
        !          14384:                                  xmlSchemaTypePtr type)
        !          14385: {
        !          14386:     xmlSchemaTypePtr baseType = NULL;
        !          14387:     xmlSchemaAttributeUsePtr use;
        !          14388:     xmlSchemaItemListPtr uses, baseUses, prohibs = NULL;
        !          14389: 
        !          14390:     if (type->baseType == NULL) {
        !          14391:        PERROR_INT("xmlSchemaFixupTypeAttributeUses",
        !          14392:            "no base type");
        !          14393:         return (-1);
        !          14394:     }
        !          14395:     baseType = type->baseType;
        !          14396:     if (WXS_IS_TYPE_NOT_FIXED(baseType))
        !          14397:        if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
        !          14398:            return(-1);
        !          14399: 
        !          14400:     uses = type->attrUses;
        !          14401:     baseUses = baseType->attrUses;
        !          14402:     /*
        !          14403:     * Expand attribute group references. And build the 'complete'
        !          14404:     * wildcard, i.e. intersect multiple wildcards.
        !          14405:     * Move attribute prohibitions into a separate list.
        !          14406:     */
        !          14407:     if (uses != NULL) {
        !          14408:        if (WXS_IS_RESTRICTION(type)) {
        !          14409:            /*
        !          14410:            * This one will transfer all attr. prohibitions
        !          14411:            * into pctxt->attrProhibs.
        !          14412:            */
        !          14413:            if (xmlSchemaExpandAttributeGroupRefs(pctxt,
        !          14414:                WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
        !          14415:                pctxt->attrProhibs) == -1)
        !          14416:            {
        !          14417:                PERROR_INT("xmlSchemaFixupTypeAttributeUses",
        !          14418:                "failed to expand attributes");
        !          14419:            }
        !          14420:            if (pctxt->attrProhibs->nbItems != 0)
        !          14421:                prohibs = pctxt->attrProhibs;
        !          14422:        } else {
        !          14423:            if (xmlSchemaExpandAttributeGroupRefs(pctxt,
        !          14424:                WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
        !          14425:                NULL) == -1)
        !          14426:            {
        !          14427:                PERROR_INT("xmlSchemaFixupTypeAttributeUses",
        !          14428:                "failed to expand attributes");
        !          14429:            }
        !          14430:        }
        !          14431:     }
        !          14432:     /*
        !          14433:     * Inherit the attribute uses of the base type.
        !          14434:     */
        !          14435:     if (baseUses != NULL) {
        !          14436:        int i, j;
        !          14437:        xmlSchemaAttributeUseProhibPtr pro;
        !          14438: 
        !          14439:        if (WXS_IS_RESTRICTION(type)) {
        !          14440:            int usesCount;
        !          14441:            xmlSchemaAttributeUsePtr tmp;
        !          14442: 
        !          14443:            if (uses != NULL)
        !          14444:                usesCount = uses->nbItems;
        !          14445:            else
        !          14446:                usesCount = 0;
        !          14447: 
        !          14448:            /* Restriction. */
        !          14449:            for (i = 0; i < baseUses->nbItems; i++) {
        !          14450:                use = baseUses->items[i];
        !          14451:                if (prohibs) {
        !          14452:                    /*
        !          14453:                    * Filter out prohibited uses.
        !          14454:                    */
        !          14455:                    for (j = 0; j < prohibs->nbItems; j++) {
        !          14456:                        pro = prohibs->items[j];
        !          14457:                        if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
        !          14458:                            (WXS_ATTRUSE_DECL_TNS(use) ==
        !          14459:                                pro->targetNamespace))
        !          14460:                        {
        !          14461:                            goto inherit_next;
        !          14462:                        }
        !          14463:                    }
        !          14464:                }
        !          14465:                if (usesCount) {
        !          14466:                    /*
        !          14467:                    * Filter out existing uses.
        !          14468:                    */
        !          14469:                    for (j = 0; j < usesCount; j++) {
        !          14470:                        tmp = uses->items[j];
        !          14471:                        if ((WXS_ATTRUSE_DECL_NAME(use) ==
        !          14472:                                WXS_ATTRUSE_DECL_NAME(tmp)) &&
        !          14473:                            (WXS_ATTRUSE_DECL_TNS(use) ==
        !          14474:                                WXS_ATTRUSE_DECL_TNS(tmp)))
        !          14475:                        {
        !          14476:                            goto inherit_next;
        !          14477:                        }
        !          14478:                    }
        !          14479:                }
        !          14480:                if (uses == NULL) {
        !          14481:                    type->attrUses = xmlSchemaItemListCreate();
        !          14482:                    if (type->attrUses == NULL)
        !          14483:                        goto exit_failure;
        !          14484:                    uses = type->attrUses;
        !          14485:                }
        !          14486:                xmlSchemaItemListAddSize(uses, 2, use);
        !          14487: inherit_next: {}
        !          14488:            }
        !          14489:        } else {
        !          14490:            /* Extension. */
        !          14491:            for (i = 0; i < baseUses->nbItems; i++) {
        !          14492:                use = baseUses->items[i];
        !          14493:                if (uses == NULL) {
        !          14494:                    type->attrUses = xmlSchemaItemListCreate();
        !          14495:                    if (type->attrUses == NULL)
        !          14496:                        goto exit_failure;
        !          14497:                    uses = type->attrUses;
        !          14498:                }
        !          14499:                xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
        !          14500:            }
        !          14501:        }
        !          14502:     }
        !          14503:     /*
        !          14504:     * Shrink attr. uses.
        !          14505:     */
        !          14506:     if (uses) {
        !          14507:        if (uses->nbItems == 0) {
        !          14508:            xmlSchemaItemListFree(uses);
        !          14509:            type->attrUses = NULL;
        !          14510:        }
        !          14511:        /*
        !          14512:        * TODO: We could shrink the size of the array
        !          14513:        * to fit the actual number of items.
        !          14514:        */
        !          14515:     }
        !          14516:     /*
        !          14517:     * Compute the complete wildcard.
        !          14518:     */
        !          14519:     if (WXS_IS_EXTENSION(type)) {
        !          14520:        if (baseType->attributeWildcard != NULL) {
        !          14521:            /*
        !          14522:            * (3.2.2.1) "If the �base wildcard� is non-�absent�, then
        !          14523:            * the appropriate case among the following:"
        !          14524:            */
        !          14525:            if (type->attributeWildcard != NULL) {
        !          14526:                /*
        !          14527:                * Union the complete wildcard with the base wildcard.
        !          14528:                * SPEC {attribute wildcard}
        !          14529:                * (3.2.2.1.2) "otherwise a wildcard whose {process contents}
        !          14530:                * and {annotation} are those of the �complete wildcard�,
        !          14531:                * and whose {namespace constraint} is the intensional union
        !          14532:                * of the {namespace constraint} of the �complete wildcard�
        !          14533:                * and of the �base wildcard�, as defined in Attribute
        !          14534:                * Wildcard Union (�3.10.6)."
        !          14535:                */
        !          14536:                if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard,
        !          14537:                    baseType->attributeWildcard) == -1)
        !          14538:                    goto exit_failure;
        !          14539:            } else {
        !          14540:                /*
        !          14541:                * (3.2.2.1.1) "If the �complete wildcard� is �absent�,
        !          14542:                * then the �base wildcard�."
        !          14543:                */
        !          14544:                type->attributeWildcard = baseType->attributeWildcard;
        !          14545:            }
        !          14546:        } else {
        !          14547:            /*
        !          14548:            * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the
        !          14549:            * �complete wildcard"
        !          14550:            * NOOP
        !          14551:            */
        !          14552:        }
        !          14553:     } else {
        !          14554:        /*
        !          14555:        * SPEC {attribute wildcard}
        !          14556:        * (3.1) "If the <restriction> alternative is chosen, then the
        !          14557:        * �complete wildcard�;"
        !          14558:        * NOOP
        !          14559:        */
        !          14560:     }
        !          14561: 
        !          14562:     return (0);
        !          14563: 
        !          14564: exit_failure:
        !          14565:     return(-1);
        !          14566: }
        !          14567: 
        !          14568: /**
        !          14569:  * xmlSchemaTypeFinalContains:
        !          14570:  * @schema:  the schema
        !          14571:  * @type:  the type definition
        !          14572:  * @final: the final
        !          14573:  *
        !          14574:  * Evaluates if a type definition contains the given "final".
        !          14575:  * This does take "finalDefault" into account as well.
        !          14576:  *
        !          14577:  * Returns 1 if the type does containt the given "final",
        !          14578:  * 0 otherwise.
        !          14579:  */
        !          14580: static int
        !          14581: xmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final)
        !          14582: {
        !          14583:     if (type == NULL)
        !          14584:        return (0);
        !          14585:     if (type->flags & final)
        !          14586:        return (1);
        !          14587:     else
        !          14588:        return (0);
        !          14589: }
        !          14590: 
        !          14591: /**
        !          14592:  * xmlSchemaGetUnionSimpleTypeMemberTypes:
        !          14593:  * @type:  the Union Simple Type
        !          14594:  *
        !          14595:  * Returns a list of member types of @type if existing,
        !          14596:  * returns NULL otherwise.
        !          14597:  */
        !          14598: static xmlSchemaTypeLinkPtr
        !          14599: xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type)
        !          14600: {
        !          14601:     while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) {
        !          14602:        if (type->memberTypes != NULL)
        !          14603:            return (type->memberTypes);
        !          14604:        else
        !          14605:            type = type->baseType;
        !          14606:     }
        !          14607:     return (NULL);
        !          14608: }
        !          14609: 
        !          14610: /**
        !          14611:  * xmlSchemaGetParticleTotalRangeMin:
        !          14612:  * @particle: the particle
        !          14613:  *
        !          14614:  * Schema Component Constraint: Effective Total Range
        !          14615:  * (all and sequence) + (choice)
        !          14616:  *
        !          14617:  * Returns the minimun Effective Total Range.
        !          14618:  */
        !          14619: static int
        !          14620: xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
        !          14621: {
        !          14622:     if ((particle->children == NULL) ||
        !          14623:        (particle->minOccurs == 0))
        !          14624:        return (0);
        !          14625:     if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
        !          14626:        int min = -1, cur;
        !          14627:        xmlSchemaParticlePtr part =
        !          14628:            (xmlSchemaParticlePtr) particle->children->children;
        !          14629: 
        !          14630:        if (part == NULL)
        !          14631:            return (0);
        !          14632:        while (part != NULL) {
        !          14633:            if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
        !          14634:                (part->children->type == XML_SCHEMA_TYPE_ANY))
        !          14635:                cur = part->minOccurs;
        !          14636:            else
        !          14637:                cur = xmlSchemaGetParticleTotalRangeMin(part);
        !          14638:            if (cur == 0)
        !          14639:                return (0);
        !          14640:            if ((min > cur) || (min == -1))
        !          14641:                min = cur;
        !          14642:            part = (xmlSchemaParticlePtr) part->next;
        !          14643:        }
        !          14644:        return (particle->minOccurs * min);
        !          14645:     } else {
        !          14646:        /* <all> and <sequence> */
        !          14647:        int sum = 0;
        !          14648:        xmlSchemaParticlePtr part =
        !          14649:            (xmlSchemaParticlePtr) particle->children->children;
        !          14650: 
        !          14651:        if (part == NULL)
        !          14652:            return (0);
        !          14653:        do {
        !          14654:            if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
        !          14655:                (part->children->type == XML_SCHEMA_TYPE_ANY))
        !          14656:                sum += part->minOccurs;
        !          14657:            else
        !          14658:                sum += xmlSchemaGetParticleTotalRangeMin(part);
        !          14659:            part = (xmlSchemaParticlePtr) part->next;
        !          14660:        } while (part != NULL);
        !          14661:        return (particle->minOccurs * sum);
        !          14662:     }
        !          14663: }
        !          14664: 
        !          14665: #if 0
        !          14666: /**
        !          14667:  * xmlSchemaGetParticleTotalRangeMax:
        !          14668:  * @particle: the particle
        !          14669:  *
        !          14670:  * Schema Component Constraint: Effective Total Range
        !          14671:  * (all and sequence) + (choice)
        !          14672:  *
        !          14673:  * Returns the maximum Effective Total Range.
        !          14674:  */
        !          14675: static int
        !          14676: xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
        !          14677: {
        !          14678:     if ((particle->children == NULL) ||
        !          14679:        (particle->children->children == NULL))
        !          14680:        return (0);
        !          14681:     if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
        !          14682:        int max = -1, cur;
        !          14683:        xmlSchemaParticlePtr part =
        !          14684:            (xmlSchemaParticlePtr) particle->children->children;
        !          14685: 
        !          14686:        for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
        !          14687:            if (part->children == NULL)
        !          14688:                continue;
        !          14689:            if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
        !          14690:                (part->children->type == XML_SCHEMA_TYPE_ANY))
        !          14691:                cur = part->maxOccurs;
        !          14692:            else
        !          14693:                cur = xmlSchemaGetParticleTotalRangeMax(part);
        !          14694:            if (cur == UNBOUNDED)
        !          14695:                return (UNBOUNDED);
        !          14696:            if ((max < cur) || (max == -1))
        !          14697:                max = cur;
        !          14698:        }
        !          14699:        /* TODO: Handle overflows? */
        !          14700:        return (particle->maxOccurs * max);
        !          14701:     } else {
        !          14702:        /* <all> and <sequence> */
        !          14703:        int sum = 0, cur;
        !          14704:        xmlSchemaParticlePtr part =
        !          14705:            (xmlSchemaParticlePtr) particle->children->children;
        !          14706: 
        !          14707:        for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
        !          14708:            if (part->children == NULL)
        !          14709:                continue;
        !          14710:            if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
        !          14711:                (part->children->type == XML_SCHEMA_TYPE_ANY))
        !          14712:                cur = part->maxOccurs;
        !          14713:            else
        !          14714:                cur = xmlSchemaGetParticleTotalRangeMax(part);
        !          14715:            if (cur == UNBOUNDED)
        !          14716:                return (UNBOUNDED);
        !          14717:            if ((cur > 0) && (particle->maxOccurs == UNBOUNDED))
        !          14718:                return (UNBOUNDED);
        !          14719:            sum += cur;
        !          14720:        }
        !          14721:        /* TODO: Handle overflows? */
        !          14722:        return (particle->maxOccurs * sum);
        !          14723:     }
        !          14724: }
        !          14725: #endif
        !          14726: 
        !          14727: /**
        !          14728:  * xmlSchemaIsParticleEmptiable:
        !          14729:  * @particle: the particle
        !          14730:  *
        !          14731:  * Schema Component Constraint: Particle Emptiable
        !          14732:  * Checks whether the given particle is emptiable.
        !          14733:  *
        !          14734:  * Returns 1 if emptiable, 0 otherwise.
        !          14735:  */
        !          14736: static int
        !          14737: xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
        !          14738: {
        !          14739:     /*
        !          14740:     * SPEC (1) "Its {min occurs} is 0."
        !          14741:     */
        !          14742:     if ((particle == NULL) || (particle->minOccurs == 0) ||
        !          14743:        (particle->children == NULL))
        !          14744:        return (1);
        !          14745:     /*
        !          14746:     * SPEC (2) "Its {term} is a group and the minimum part of the
        !          14747:     * effective total range of that group, [...] is 0."
        !          14748:     */
        !          14749:     if (WXS_IS_MODEL_GROUP(particle->children)) {
        !          14750:        if (xmlSchemaGetParticleTotalRangeMin(particle) == 0)
        !          14751:            return (1);
        !          14752:     }
        !          14753:     return (0);
        !          14754: }
        !          14755: 
        !          14756: /**
        !          14757:  * xmlSchemaCheckCOSSTDerivedOK:
        !          14758:  * @actxt: a context
        !          14759:  * @type:  the derived simple type definition
        !          14760:  * @baseType:  the base type definition
        !          14761:  * @subset: the subset of ('restriction', ect.)
        !          14762:  *
        !          14763:  * Schema Component Constraint:
        !          14764:  * Type Derivation OK (Simple) (cos-st-derived-OK)
        !          14765:  *
        !          14766:  * Checks wheter @type can be validly
        !          14767:  * derived from @baseType.
        !          14768:  *
        !          14769:  * Returns 0 on success, an positive error code otherwise.
        !          14770:  */
        !          14771: static int
        !          14772: xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
        !          14773:                             xmlSchemaTypePtr type,
        !          14774:                             xmlSchemaTypePtr baseType,
        !          14775:                             int subset)
        !          14776: {
        !          14777:     /*
        !          14778:     * 1 They are the same type definition.
        !          14779:     * TODO: The identy check might have to be more complex than this.
        !          14780:     */
        !          14781:     if (type == baseType)
        !          14782:        return (0);
        !          14783:     /*
        !          14784:     * 2.1 restriction is not in the subset, or in the {final}
        !          14785:     * of its own {base type definition};
        !          14786:     *
        !          14787:     * NOTE that this will be used also via "xsi:type".
        !          14788:     *
        !          14789:     * TODO: Revise this, it looks strange. How can the "type"
        !          14790:     * not be fixed or *in* fixing?
        !          14791:     */
        !          14792:     if (WXS_IS_TYPE_NOT_FIXED(type))
        !          14793:        if (xmlSchemaTypeFixup(type, actxt) == -1)
        !          14794:            return(-1);
        !          14795:     if (WXS_IS_TYPE_NOT_FIXED(baseType))
        !          14796:        if (xmlSchemaTypeFixup(baseType, actxt) == -1)
        !          14797:            return(-1);
        !          14798:     if ((subset & SUBSET_RESTRICTION) ||
        !          14799:        (xmlSchemaTypeFinalContains(type->baseType,
        !          14800:            XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
        !          14801:        return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1);
        !          14802:     }
        !          14803:     /* 2.2 */
        !          14804:     if (type->baseType == baseType) {
        !          14805:        /*
        !          14806:        * 2.2.1 D's �base type definition� is B.
        !          14807:        */
        !          14808:        return (0);
        !          14809:     }
        !          14810:     /*
        !          14811:     * 2.2.2 D's �base type definition� is not the �ur-type definition�
        !          14812:     * and is validly derived from B given the subset, as defined by this
        !          14813:     * constraint.
        !          14814:     */
        !          14815:     if ((! WXS_IS_ANYTYPE(type->baseType)) &&
        !          14816:        (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
        !          14817:            baseType, subset) == 0)) {
        !          14818:        return (0);
        !          14819:     }
        !          14820:     /*
        !          14821:     * 2.2.3 D's {variety} is list or union and B is the �simple ur-type
        !          14822:     * definition�.
        !          14823:     */
        !          14824:     if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
        !          14825:        (WXS_IS_LIST(type) || WXS_IS_UNION(type))) {
        !          14826:        return (0);
        !          14827:     }
        !          14828:     /*
        !          14829:     * 2.2.4 B's {variety} is union and D is validly derived from a type
        !          14830:     * definition in B's {member type definitions} given the subset, as
        !          14831:     * defined by this constraint.
        !          14832:     *
        !          14833:     * NOTE: This seems not to involve built-in types, since there is no
        !          14834:     * built-in Union Simple Type.
        !          14835:     */
        !          14836:     if (WXS_IS_UNION(baseType)) {
        !          14837:        xmlSchemaTypeLinkPtr cur;
        !          14838: 
        !          14839:        cur = baseType->memberTypes;
        !          14840:        while (cur != NULL) {
        !          14841:            if (WXS_IS_TYPE_NOT_FIXED(cur->type))
        !          14842:                if (xmlSchemaTypeFixup(cur->type, actxt) == -1)
        !          14843:                    return(-1);
        !          14844:            if (xmlSchemaCheckCOSSTDerivedOK(actxt,
        !          14845:                    type, cur->type, subset) == 0)
        !          14846:            {
        !          14847:                /*
        !          14848:                * It just has to be validly derived from at least one
        !          14849:                * member-type.
        !          14850:                */
        !          14851:                return (0);
        !          14852:            }
        !          14853:            cur = cur->next;
        !          14854:        }
        !          14855:     }
        !          14856:     return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2);
        !          14857: }
        !          14858: 
        !          14859: /**
        !          14860:  * xmlSchemaCheckTypeDefCircularInternal:
        !          14861:  * @pctxt:  the schema parser context
        !          14862:  * @ctxtType:  the type definition
        !          14863:  * @ancestor: an ancestor of @ctxtType
        !          14864:  *
        !          14865:  * Checks st-props-correct (2) + ct-props-correct (3).
        !          14866:  * Circular type definitions are not allowed.
        !          14867:  *
        !          14868:  * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is
        !          14869:  * circular, 0 otherwise.
        !          14870:  */
        !          14871: static int
        !          14872: xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
        !          14873:                           xmlSchemaTypePtr ctxtType,
        !          14874:                           xmlSchemaTypePtr ancestor)
        !          14875: {
        !          14876:     int ret;
        !          14877: 
        !          14878:     if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
        !          14879:        return (0);
        !          14880: 
        !          14881:     if (ctxtType == ancestor) {
        !          14882:        xmlSchemaPCustomErr(pctxt,
        !          14883:            XML_SCHEMAP_ST_PROPS_CORRECT_2,
        !          14884:            WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
        !          14885:            "The definition is circular", NULL);
        !          14886:        return (XML_SCHEMAP_ST_PROPS_CORRECT_2);
        !          14887:     }
        !          14888:     if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
        !          14889:        /*
        !          14890:        * Avoid inifinite recursion on circular types not yet checked.
        !          14891:        */
        !          14892:        return (0);
        !          14893:     }
        !          14894:     ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
        !          14895:     ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
        !          14896:        ancestor->baseType);
        !          14897:     ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
        !          14898:     return (ret);
        !          14899: }
        !          14900: 
        !          14901: /**
        !          14902:  * xmlSchemaCheckTypeDefCircular:
        !          14903:  * @item:  the complex/simple type definition
        !          14904:  * @ctxt:  the parser context
        !          14905:  * @name:  the name
        !          14906:  *
        !          14907:  * Checks for circular type definitions.
        !          14908:  */
        !          14909: static void
        !          14910: xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item,
        !          14911:                              xmlSchemaParserCtxtPtr ctxt)
        !          14912: {
        !          14913:     if ((item == NULL) ||
        !          14914:        (item->type == XML_SCHEMA_TYPE_BASIC) ||
        !          14915:        (item->baseType == NULL))
        !          14916:        return;
        !          14917:     xmlSchemaCheckTypeDefCircularInternal(ctxt, item,
        !          14918:        item->baseType);
        !          14919: }
        !          14920: 
        !          14921: /*
        !          14922: * Simple Type Definition Representation OK (src-simple-type) 4
        !          14923: *
        !          14924: * "4 Circular union type definition is disallowed. That is, if the
        !          14925: * <union> alternative is chosen, there must not be any entries in the
        !          14926: * memberTypes [attribute] at any depth which resolve to the component
        !          14927: * corresponding to the <simpleType>."
        !          14928: *
        !          14929: * Note that this should work on the *representation* of a component,
        !          14930: * thus assumes any union types in the member types not being yet
        !          14931: * substituted. At this stage we need the variety of the types
        !          14932: * to be already computed.
        !          14933: */
        !          14934: static int
        !          14935: xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
        !          14936:                                        xmlSchemaTypePtr ctxType,
        !          14937:                                        xmlSchemaTypeLinkPtr members)
        !          14938: {
        !          14939:     xmlSchemaTypeLinkPtr member;
        !          14940:     xmlSchemaTypePtr memberType;
        !          14941: 
        !          14942:     member = members;
        !          14943:     while (member != NULL) {
        !          14944:        memberType = member->type;
        !          14945:        while ((memberType != NULL) &&
        !          14946:            (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
        !          14947:            if (memberType == ctxType) {
        !          14948:                xmlSchemaPCustomErr(pctxt,
        !          14949:                    XML_SCHEMAP_SRC_SIMPLE_TYPE_4,
        !          14950:                    WXS_BASIC_CAST ctxType, NULL,
        !          14951:                    "The union type definition is circular", NULL);
        !          14952:                return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4);
        !          14953:            }
        !          14954:            if ((WXS_IS_UNION(memberType)) &&
        !          14955:                ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
        !          14956:            {
        !          14957:                int res;
        !          14958:                memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
        !          14959:                res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
        !          14960:                    ctxType,
        !          14961:                    xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
        !          14962:                memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
        !          14963:                if (res != 0)
        !          14964:                    return(res);
        !          14965:            }
        !          14966:            memberType = memberType->baseType;
        !          14967:        }
        !          14968:        member = member->next;
        !          14969:     }
        !          14970:     return(0);
        !          14971: }
        !          14972: 
        !          14973: static int
        !          14974: xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
        !          14975:                                   xmlSchemaTypePtr type)
        !          14976: {
        !          14977:     if (! WXS_IS_UNION(type))
        !          14978:        return(0);
        !          14979:     return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type,
        !          14980:        type->memberTypes));
        !          14981: }
        !          14982: 
        !          14983: /**
        !          14984:  * xmlSchemaResolveTypeReferences:
        !          14985:  * @item:  the complex/simple type definition
        !          14986:  * @ctxt:  the parser context
        !          14987:  * @name:  the name
        !          14988:  *
        !          14989:  * Resolvese type definition references
        !          14990:  */
        !          14991: static void
        !          14992: xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
        !          14993:                         xmlSchemaParserCtxtPtr ctxt)
        !          14994: {
        !          14995:     if (typeDef == NULL)
        !          14996:        return;
        !          14997: 
        !          14998:     /*
        !          14999:     * Resolve the base type.
        !          15000:     */
        !          15001:     if (typeDef->baseType == NULL) {
        !          15002:        typeDef->baseType = xmlSchemaGetType(ctxt->schema,
        !          15003:            typeDef->base, typeDef->baseNs);
        !          15004:        if (typeDef->baseType == NULL) {
        !          15005:            xmlSchemaPResCompAttrErr(ctxt,
        !          15006:                XML_SCHEMAP_SRC_RESOLVE,
        !          15007:                WXS_BASIC_CAST typeDef, typeDef->node,
        !          15008:                "base", typeDef->base, typeDef->baseNs,
        !          15009:                XML_SCHEMA_TYPE_SIMPLE, NULL);
        !          15010:            return;
        !          15011:        }
        !          15012:     }
        !          15013:     if (WXS_IS_SIMPLE(typeDef)) {
        !          15014:        if (WXS_IS_UNION(typeDef)) {
        !          15015:            /*
        !          15016:            * Resolve the memberTypes.
        !          15017:            */
        !          15018:            xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
        !          15019:            return;
        !          15020:        } else if (WXS_IS_LIST(typeDef)) {
        !          15021:            /*
        !          15022:            * Resolve the itemType.
        !          15023:            */
        !          15024:            if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) {
        !          15025: 
        !          15026:                typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
        !          15027:                    typeDef->base, typeDef->baseNs);
        !          15028: 
        !          15029:                if ((typeDef->subtypes == NULL) ||
        !          15030:                    (! WXS_IS_SIMPLE(typeDef->subtypes)))
        !          15031:                {
        !          15032:                    typeDef->subtypes = NULL;
        !          15033:                    xmlSchemaPResCompAttrErr(ctxt,
        !          15034:                        XML_SCHEMAP_SRC_RESOLVE,
        !          15035:                        WXS_BASIC_CAST typeDef, typeDef->node,
        !          15036:                        "itemType", typeDef->base, typeDef->baseNs,
        !          15037:                        XML_SCHEMA_TYPE_SIMPLE, NULL);
        !          15038:                }
        !          15039:            }
        !          15040:            return;
        !          15041:        }
        !          15042:     }
        !          15043:     /*
        !          15044:     * The ball of letters below means, that if we have a particle
        !          15045:     * which has a QName-helper component as its {term}, we want
        !          15046:     * to resolve it...
        !          15047:     */
        !          15048:     else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) &&
        !          15049:        ((WXS_TYPE_CONTENTTYPE(typeDef))->type ==
        !          15050:            XML_SCHEMA_TYPE_PARTICLE) &&
        !          15051:        (WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) &&
        !          15052:        ((WXS_TYPE_PARTICLE_TERM(typeDef))->type ==
        !          15053:            XML_SCHEMA_EXTRA_QNAMEREF))
        !          15054:     {
        !          15055:        xmlSchemaQNameRefPtr ref =
        !          15056:            WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
        !          15057:        xmlSchemaModelGroupDefPtr groupDef;
        !          15058: 
        !          15059:        /*
        !          15060:        * URGENT TODO: Test this.
        !          15061:        */
        !          15062:        WXS_TYPE_PARTICLE_TERM(typeDef) = NULL;
        !          15063:        /*
        !          15064:        * Resolve the MG definition reference.
        !          15065:        */
        !          15066:        groupDef =
        !          15067:            WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
        !          15068:                ref->itemType, ref->name, ref->targetNamespace);
        !          15069:        if (groupDef == NULL) {
        !          15070:            xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
        !          15071:                NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
        !          15072:                "ref", ref->name, ref->targetNamespace, ref->itemType,
        !          15073:                NULL);
        !          15074:            /* Remove the particle. */
        !          15075:            WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
        !          15076:        } else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL)
        !          15077:            /* Remove the particle. */
        !          15078:            WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
        !          15079:        else {
        !          15080:            /*
        !          15081:            * Assign the MG definition's {model group} to the
        !          15082:            * particle's {term}.
        !          15083:            */
        !          15084:            WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
        !          15085: 
        !          15086:            if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) {
        !          15087:                /*
        !          15088:                * SPEC cos-all-limited (1.2)
        !          15089:                * "1.2 the {term} property of a particle with
        !          15090:                * {max occurs}=1 which is part of a pair which constitutes
        !          15091:                * the {content type} of a complex type definition."
        !          15092:                */
        !          15093:                if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
        !          15094:                    xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          15095:                        /* TODO: error code */
        !          15096:                        XML_SCHEMAP_COS_ALL_LIMITED,
        !          15097:                        WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL,
        !          15098:                        "The particle's {max occurs} must be 1, since the "
        !          15099:                        "reference resolves to an 'all' model group",
        !          15100:                        NULL, NULL);
        !          15101:                }
        !          15102:            }
        !          15103:        }
        !          15104:     }
        !          15105: }
        !          15106: 
        !          15107: 
        !          15108: 
        !          15109: /**
        !          15110:  * xmlSchemaCheckSTPropsCorrect:
        !          15111:  * @ctxt:  the schema parser context
        !          15112:  * @type:  the simple type definition
        !          15113:  *
        !          15114:  * Checks st-props-correct.
        !          15115:  *
        !          15116:  * Returns 0 if the properties are correct,
        !          15117:  * if not, a positive error code and -1 on internal
        !          15118:  * errors.
        !          15119:  */
        !          15120: static int
        !          15121: xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
        !          15122:                             xmlSchemaTypePtr type)
        !          15123: {
        !          15124:     xmlSchemaTypePtr baseType = type->baseType;
        !          15125:     xmlChar *str = NULL;
        !          15126: 
        !          15127:     /* STATE: error funcs converted. */
        !          15128:     /*
        !          15129:     * Schema Component Constraint: Simple Type Definition Properties Correct
        !          15130:     *
        !          15131:     * NOTE: This is somehow redundant, since we actually built a simple type
        !          15132:     * to have all the needed information; this acts as an self test.
        !          15133:     */
        !          15134:     /* Base type: If the datatype has been �derived� by �restriction�
        !          15135:     * then the Simple Type Definition component from which it is �derived�,
        !          15136:     * otherwise the Simple Type Definition for anySimpleType (�4.1.6).
        !          15137:     */
        !          15138:     if (baseType == NULL) {
        !          15139:        /*
        !          15140:        * TODO: Think about: "modulo the impact of Missing
        !          15141:        * Sub-components (�5.3)."
        !          15142:        */
        !          15143:        xmlSchemaPCustomErr(ctxt,
        !          15144:            XML_SCHEMAP_ST_PROPS_CORRECT_1,
        !          15145:            WXS_BASIC_CAST type, NULL,
        !          15146:            "No base type existent", NULL);
        !          15147:        return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
        !          15148: 
        !          15149:     }
        !          15150:     if (! WXS_IS_SIMPLE(baseType)) {
        !          15151:        xmlSchemaPCustomErr(ctxt,
        !          15152:            XML_SCHEMAP_ST_PROPS_CORRECT_1,
        !          15153:            WXS_BASIC_CAST type, NULL,
        !          15154:            "The base type '%s' is not a simple type",
        !          15155:            xmlSchemaGetComponentQName(&str, baseType));
        !          15156:        FREE_AND_NULL(str)
        !          15157:        return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
        !          15158:     }
        !          15159:     if ( (WXS_IS_LIST(type) || WXS_IS_UNION(type)) &&
        !          15160:         (WXS_IS_RESTRICTION(type) == 0) &&
        !          15161:         (! WXS_IS_ANY_SIMPLE_TYPE(baseType))) {
        !          15162:        xmlSchemaPCustomErr(ctxt,
        !          15163:            XML_SCHEMAP_ST_PROPS_CORRECT_1,
        !          15164:            WXS_BASIC_CAST type, NULL,
        !          15165:            "A type, derived by list or union, must have "
        !          15166:            "the simple ur-type definition as base type, not '%s'",
        !          15167:            xmlSchemaGetComponentQName(&str, baseType));
        !          15168:        FREE_AND_NULL(str)
        !          15169:        return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
        !          15170:     }
        !          15171:     /*
        !          15172:     * Variety: One of {atomic, list, union}.
        !          15173:     */
        !          15174:     if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) &&
        !          15175:        (! WXS_IS_LIST(type))) {
        !          15176:        xmlSchemaPCustomErr(ctxt,
        !          15177:            XML_SCHEMAP_ST_PROPS_CORRECT_1,
        !          15178:            WXS_BASIC_CAST type, NULL,
        !          15179:            "The variety is absent", NULL);
        !          15180:        return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
        !          15181:     }
        !          15182:     /* TODO: Finish this. Hmm, is this finished? */
        !          15183: 
        !          15184:     /*
        !          15185:     * 3 The {final} of the {base type definition} must not contain restriction.
        !          15186:     */
        !          15187:     if (xmlSchemaTypeFinalContains(baseType,
        !          15188:        XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
        !          15189:        xmlSchemaPCustomErr(ctxt,
        !          15190:            XML_SCHEMAP_ST_PROPS_CORRECT_3,
        !          15191:            WXS_BASIC_CAST type, NULL,
        !          15192:            "The 'final' of its base type '%s' must not contain "
        !          15193:            "'restriction'",
        !          15194:            xmlSchemaGetComponentQName(&str, baseType));
        !          15195:        FREE_AND_NULL(str)
        !          15196:        return (XML_SCHEMAP_ST_PROPS_CORRECT_3);
        !          15197:     }
        !          15198: 
        !          15199:     /*
        !          15200:     * 2 All simple type definitions must be derived ultimately from the �simple
        !          15201:     * ur-type definition (so� circular definitions are disallowed). That is, it
        !          15202:     * must be possible to reach a built-in primitive datatype or the �simple
        !          15203:     * ur-type definition� by repeatedly following the {base type definition}.
        !          15204:     *
        !          15205:     * NOTE: this is done in xmlSchemaCheckTypeDefCircular().
        !          15206:     */
        !          15207:     return (0);
        !          15208: }
        !          15209: 
        !          15210: /**
        !          15211:  * xmlSchemaCheckCOSSTRestricts:
        !          15212:  * @ctxt:  the schema parser context
        !          15213:  * @type:  the simple type definition
        !          15214:  *
        !          15215:  * Schema Component Constraint:
        !          15216:  * Derivation Valid (Restriction, Simple) (cos-st-restricts)
        !          15217: 
        !          15218:  * Checks if the given @type (simpleType) is derived validly by restriction.
        !          15219:  * STATUS:
        !          15220:  *
        !          15221:  * Returns -1 on internal errors, 0 if the type is validly derived,
        !          15222:  * a positive error code otherwise.
        !          15223:  */
        !          15224: static int
        !          15225: xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
        !          15226:                             xmlSchemaTypePtr type)
        !          15227: {
        !          15228:     xmlChar *str = NULL;
        !          15229: 
        !          15230:     if (type->type != XML_SCHEMA_TYPE_SIMPLE) {
        !          15231:        PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15232:            "given type is not a user-derived simpleType");
        !          15233:        return (-1);
        !          15234:     }
        !          15235: 
        !          15236:     if (WXS_IS_ATOMIC(type)) {
        !          15237:        xmlSchemaTypePtr primitive;
        !          15238:        /*
        !          15239:        * 1.1 The {base type definition} must be an atomic simple
        !          15240:        * type definition or a built-in primitive datatype.
        !          15241:        */
        !          15242:        if (! WXS_IS_ATOMIC(type->baseType)) {
        !          15243:            xmlSchemaPCustomErr(pctxt,
        !          15244:                XML_SCHEMAP_COS_ST_RESTRICTS_1_1,
        !          15245:                WXS_BASIC_CAST type, NULL,
        !          15246:                "The base type '%s' is not an atomic simple type",
        !          15247:                xmlSchemaGetComponentQName(&str, type->baseType));
        !          15248:            FREE_AND_NULL(str)
        !          15249:            return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1);
        !          15250:        }
        !          15251:        /* 1.2 The {final} of the {base type definition} must not contain
        !          15252:        * restriction.
        !          15253:        */
        !          15254:        /* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */
        !          15255:        if (xmlSchemaTypeFinalContains(type->baseType,
        !          15256:            XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
        !          15257:            xmlSchemaPCustomErr(pctxt,
        !          15258:                XML_SCHEMAP_COS_ST_RESTRICTS_1_2,
        !          15259:                WXS_BASIC_CAST type, NULL,
        !          15260:                "The final of its base type '%s' must not contain 'restriction'",
        !          15261:                xmlSchemaGetComponentQName(&str, type->baseType));
        !          15262:            FREE_AND_NULL(str)
        !          15263:            return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2);
        !          15264:        }
        !          15265: 
        !          15266:        /*
        !          15267:        * 1.3.1 DF must be an allowed constraining facet for the {primitive
        !          15268:        * type definition}, as specified in the appropriate subsection of 3.2
        !          15269:        * Primitive datatypes.
        !          15270:        */
        !          15271:        if (type->facets != NULL) {
        !          15272:            xmlSchemaFacetPtr facet;
        !          15273:            int ok = 1;
        !          15274: 
        !          15275:            primitive = xmlSchemaGetPrimitiveType(type);
        !          15276:            if (primitive == NULL) {
        !          15277:                PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15278:                    "failed to get primitive type");
        !          15279:                return (-1);
        !          15280:            }
        !          15281:            facet = type->facets;
        !          15282:            do {
        !          15283:                if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
        !          15284:                    ok = 0;
        !          15285:                    xmlSchemaPIllegalFacetAtomicErr(pctxt,
        !          15286:                        XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1,
        !          15287:                        type, primitive, facet);
        !          15288:                }
        !          15289:                facet = facet->next;
        !          15290:            } while (facet != NULL);
        !          15291:            if (ok == 0)
        !          15292:                return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1);
        !          15293:        }
        !          15294:        /*
        !          15295:        * SPEC (1.3.2) "If there is a facet of the same kind in the {facets}
        !          15296:        * of the {base type definition} (call this BF),then the DF's {value}
        !          15297:        * must be a valid restriction of BF's {value} as defined in
        !          15298:        * [XML Schemas: Datatypes]."
        !          15299:        *
        !          15300:        * NOTE (1.3.2) Facet derivation constraints are currently handled in
        !          15301:        * xmlSchemaDeriveAndValidateFacets()
        !          15302:        */
        !          15303:     } else if (WXS_IS_LIST(type)) {
        !          15304:        xmlSchemaTypePtr itemType = NULL;
        !          15305: 
        !          15306:        itemType = type->subtypes;
        !          15307:        if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) {
        !          15308:            PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15309:                "failed to evaluate the item type");
        !          15310:            return (-1);
        !          15311:        }
        !          15312:        if (WXS_IS_TYPE_NOT_FIXED(itemType))
        !          15313:            xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
        !          15314:        /*
        !          15315:        * 2.1 The {item type definition} must have a {variety} of atomic or
        !          15316:        * union (in which case all the {member type definitions}
        !          15317:        * must be atomic).
        !          15318:        */
        !          15319:        if ((! WXS_IS_ATOMIC(itemType)) &&
        !          15320:            (! WXS_IS_UNION(itemType))) {
        !          15321:            xmlSchemaPCustomErr(pctxt,
        !          15322:                XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
        !          15323:                WXS_BASIC_CAST type, NULL,
        !          15324:                "The item type '%s' does not have a variety of atomic or union",
        !          15325:                xmlSchemaGetComponentQName(&str, itemType));
        !          15326:            FREE_AND_NULL(str)
        !          15327:            return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
        !          15328:        } else if (WXS_IS_UNION(itemType)) {
        !          15329:            xmlSchemaTypeLinkPtr member;
        !          15330: 
        !          15331:            member = itemType->memberTypes;
        !          15332:            while (member != NULL) {
        !          15333:                if (! WXS_IS_ATOMIC(member->type)) {
        !          15334:                    xmlSchemaPCustomErr(pctxt,
        !          15335:                        XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
        !          15336:                        WXS_BASIC_CAST type, NULL,
        !          15337:                        "The item type is a union type, but the "
        !          15338:                        "member type '%s' of this item type is not atomic",
        !          15339:                        xmlSchemaGetComponentQName(&str, member->type));
        !          15340:                    FREE_AND_NULL(str)
        !          15341:                    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
        !          15342:                }
        !          15343:                member = member->next;
        !          15344:            }
        !          15345:        }
        !          15346: 
        !          15347:        if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) {
        !          15348:            xmlSchemaFacetPtr facet;
        !          15349:            /*
        !          15350:            * This is the case if we have: <simpleType><list ..
        !          15351:            */
        !          15352:            /*
        !          15353:            * 2.3.1
        !          15354:            * 2.3.1.1 The {final} of the {item type definition} must not
        !          15355:            * contain list.
        !          15356:            */
        !          15357:            if (xmlSchemaTypeFinalContains(itemType,
        !          15358:                XML_SCHEMAS_TYPE_FINAL_LIST)) {
        !          15359:                xmlSchemaPCustomErr(pctxt,
        !          15360:                    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1,
        !          15361:                    WXS_BASIC_CAST type, NULL,
        !          15362:                    "The final of its item type '%s' must not contain 'list'",
        !          15363:                    xmlSchemaGetComponentQName(&str, itemType));
        !          15364:                FREE_AND_NULL(str)
        !          15365:                return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1);
        !          15366:            }
        !          15367:            /*
        !          15368:            * 2.3.1.2 The {facets} must only contain the whiteSpace
        !          15369:            * facet component.
        !          15370:            * OPTIMIZE TODO: the S4S already disallows any facet
        !          15371:            * to be specified.
        !          15372:            */
        !          15373:            if (type->facets != NULL) {
        !          15374:                facet = type->facets;
        !          15375:                do {
        !          15376:                    if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
        !          15377:                        xmlSchemaPIllegalFacetListUnionErr(pctxt,
        !          15378:                            XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2,
        !          15379:                            type, facet);
        !          15380:                        return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2);
        !          15381:                    }
        !          15382:                    facet = facet->next;
        !          15383:                } while (facet != NULL);
        !          15384:            }
        !          15385:            /*
        !          15386:            * MAYBE TODO: (Hmm, not really) Datatypes states:
        !          15387:            * A �list� datatype can be �derived� from an �atomic� datatype
        !          15388:            * whose �lexical space� allows space (such as string or anyURI)or
        !          15389:            * a �union� datatype any of whose {member type definitions}'s
        !          15390:            * �lexical space� allows space.
        !          15391:            */
        !          15392:        } else {
        !          15393:            /*
        !          15394:            * This is the case if we have: <simpleType><restriction ...
        !          15395:            * I.e. the variety of "list" is inherited.
        !          15396:            */
        !          15397:            /*
        !          15398:            * 2.3.2
        !          15399:            * 2.3.2.1 The {base type definition} must have a {variety} of list.
        !          15400:            */
        !          15401:            if (! WXS_IS_LIST(type->baseType)) {
        !          15402:                xmlSchemaPCustomErr(pctxt,
        !          15403:                    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1,
        !          15404:                    WXS_BASIC_CAST type, NULL,
        !          15405:                    "The base type '%s' must be a list type",
        !          15406:                    xmlSchemaGetComponentQName(&str, type->baseType));
        !          15407:                FREE_AND_NULL(str)
        !          15408:                return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1);
        !          15409:            }
        !          15410:            /*
        !          15411:            * 2.3.2.2 The {final} of the {base type definition} must not
        !          15412:            * contain restriction.
        !          15413:            */
        !          15414:            if (xmlSchemaTypeFinalContains(type->baseType,
        !          15415:                XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
        !          15416:                xmlSchemaPCustomErr(pctxt,
        !          15417:                    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2,
        !          15418:                    WXS_BASIC_CAST type, NULL,
        !          15419:                    "The 'final' of the base type '%s' must not contain 'restriction'",
        !          15420:                    xmlSchemaGetComponentQName(&str, type->baseType));
        !          15421:                FREE_AND_NULL(str)
        !          15422:                return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2);
        !          15423:            }
        !          15424:            /*
        !          15425:            * 2.3.2.3 The {item type definition} must be validly derived
        !          15426:            * from the {base type definition}'s {item type definition} given
        !          15427:            * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6).
        !          15428:            */
        !          15429:            {
        !          15430:                xmlSchemaTypePtr baseItemType;
        !          15431: 
        !          15432:                baseItemType = type->baseType->subtypes;
        !          15433:                if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
        !          15434:                    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15435:                        "failed to eval the item type of a base type");
        !          15436:                    return (-1);
        !          15437:                }
        !          15438:                if ((itemType != baseItemType) &&
        !          15439:                    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
        !          15440:                        baseItemType, 0) != 0)) {
        !          15441:                    xmlChar *strBIT = NULL, *strBT = NULL;
        !          15442:                    xmlSchemaPCustomErrExt(pctxt,
        !          15443:                        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3,
        !          15444:                        WXS_BASIC_CAST type, NULL,
        !          15445:                        "The item type '%s' is not validly derived from "
        !          15446:                        "the item type '%s' of the base type '%s'",
        !          15447:                        xmlSchemaGetComponentQName(&str, itemType),
        !          15448:                        xmlSchemaGetComponentQName(&strBIT, baseItemType),
        !          15449:                        xmlSchemaGetComponentQName(&strBT, type->baseType));
        !          15450: 
        !          15451:                    FREE_AND_NULL(str)
        !          15452:                    FREE_AND_NULL(strBIT)
        !          15453:                    FREE_AND_NULL(strBT)
        !          15454:                    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3);
        !          15455:                }
        !          15456:            }
        !          15457: 
        !          15458:            if (type->facets != NULL) {
        !          15459:                xmlSchemaFacetPtr facet;
        !          15460:                int ok = 1;
        !          15461:                /*
        !          15462:                * 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern
        !          15463:                * and enumeration facet components are allowed among the {facets}.
        !          15464:                */
        !          15465:                facet = type->facets;
        !          15466:                do {
        !          15467:                    switch (facet->type) {
        !          15468:                        case XML_SCHEMA_FACET_LENGTH:
        !          15469:                        case XML_SCHEMA_FACET_MINLENGTH:
        !          15470:                        case XML_SCHEMA_FACET_MAXLENGTH:
        !          15471:                        case XML_SCHEMA_FACET_WHITESPACE:
        !          15472:                            /*
        !          15473:                            * TODO: 2.5.1.2 List datatypes
        !          15474:                            * The value of �whiteSpace� is fixed to the value collapse.
        !          15475:                            */
        !          15476:                        case XML_SCHEMA_FACET_PATTERN:
        !          15477:                        case XML_SCHEMA_FACET_ENUMERATION:
        !          15478:                            break;
        !          15479:                        default: {
        !          15480:                            xmlSchemaPIllegalFacetListUnionErr(pctxt,
        !          15481:                                XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4,
        !          15482:                                type, facet);
        !          15483:                            /*
        !          15484:                            * We could return, but it's nicer to report all
        !          15485:                            * invalid facets.
        !          15486:                            */
        !          15487:                            ok = 0;
        !          15488:                        }
        !          15489:                    }
        !          15490:                    facet = facet->next;
        !          15491:                } while (facet != NULL);
        !          15492:                if (ok == 0)
        !          15493:                    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4);
        !          15494:                /*
        !          15495:                * SPEC (2.3.2.5) (same as 1.3.2)
        !          15496:                *
        !          15497:                * NOTE (2.3.2.5) This is currently done in
        !          15498:                * xmlSchemaDeriveAndValidateFacets()
        !          15499:                */
        !          15500:            }
        !          15501:        }
        !          15502:     } else if (WXS_IS_UNION(type)) {
        !          15503:        /*
        !          15504:        * 3.1 The {member type definitions} must all have {variety} of
        !          15505:        * atomic or list.
        !          15506:        */
        !          15507:        xmlSchemaTypeLinkPtr member;
        !          15508: 
        !          15509:        member = type->memberTypes;
        !          15510:        while (member != NULL) {
        !          15511:            if (WXS_IS_TYPE_NOT_FIXED(member->type))
        !          15512:                xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt);
        !          15513: 
        !          15514:            if ((! WXS_IS_ATOMIC(member->type)) &&
        !          15515:                (! WXS_IS_LIST(member->type))) {
        !          15516:                xmlSchemaPCustomErr(pctxt,
        !          15517:                    XML_SCHEMAP_COS_ST_RESTRICTS_3_1,
        !          15518:                    WXS_BASIC_CAST type, NULL,
        !          15519:                    "The member type '%s' is neither an atomic, nor a list type",
        !          15520:                    xmlSchemaGetComponentQName(&str, member->type));
        !          15521:                FREE_AND_NULL(str)
        !          15522:                return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1);
        !          15523:            }
        !          15524:            member = member->next;
        !          15525:        }
        !          15526:        /*
        !          15527:        * 3.3.1 If the {base type definition} is the �simple ur-type
        !          15528:        * definition�
        !          15529:        */
        !          15530:        if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
        !          15531:            /*
        !          15532:            * 3.3.1.1 All of the {member type definitions} must have a
        !          15533:            * {final} which does not contain union.
        !          15534:            */
        !          15535:            member = type->memberTypes;
        !          15536:            while (member != NULL) {
        !          15537:                if (xmlSchemaTypeFinalContains(member->type,
        !          15538:                    XML_SCHEMAS_TYPE_FINAL_UNION)) {
        !          15539:                    xmlSchemaPCustomErr(pctxt,
        !          15540:                        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1,
        !          15541:                        WXS_BASIC_CAST type, NULL,
        !          15542:                        "The 'final' of member type '%s' contains 'union'",
        !          15543:                        xmlSchemaGetComponentQName(&str, member->type));
        !          15544:                    FREE_AND_NULL(str)
        !          15545:                    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1);
        !          15546:                }
        !          15547:                member = member->next;
        !          15548:            }
        !          15549:            /*
        !          15550:            * 3.3.1.2 The {facets} must be empty.
        !          15551:            */
        !          15552:            if (type->facetSet != NULL) {
        !          15553:                xmlSchemaPCustomErr(pctxt,
        !          15554:                    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2,
        !          15555:                    WXS_BASIC_CAST type, NULL,
        !          15556:                    "No facets allowed", NULL);
        !          15557:                return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2);
        !          15558:            }
        !          15559:        } else {
        !          15560:            /*
        !          15561:            * 3.3.2.1 The {base type definition} must have a {variety} of union.
        !          15562:            * I.e. the variety of "list" is inherited.
        !          15563:            */
        !          15564:            if (! WXS_IS_UNION(type->baseType)) {
        !          15565:                xmlSchemaPCustomErr(pctxt,
        !          15566:                    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1,
        !          15567:                    WXS_BASIC_CAST type, NULL,
        !          15568:                    "The base type '%s' is not a union type",
        !          15569:                    xmlSchemaGetComponentQName(&str, type->baseType));
        !          15570:                FREE_AND_NULL(str)
        !          15571:                return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1);
        !          15572:            }
        !          15573:            /*
        !          15574:            * 3.3.2.2 The {final} of the {base type definition} must not contain restriction.
        !          15575:            */
        !          15576:            if (xmlSchemaTypeFinalContains(type->baseType,
        !          15577:                XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
        !          15578:                xmlSchemaPCustomErr(pctxt,
        !          15579:                    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2,
        !          15580:                    WXS_BASIC_CAST type, NULL,
        !          15581:                    "The 'final' of its base type '%s' must not contain 'restriction'",
        !          15582:                    xmlSchemaGetComponentQName(&str, type->baseType));
        !          15583:                FREE_AND_NULL(str)
        !          15584:                return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2);
        !          15585:            }
        !          15586:            /*
        !          15587:            * 3.3.2.3 The {member type definitions}, in order, must be validly
        !          15588:            * derived from the corresponding type definitions in the {base
        !          15589:            * type definition}'s {member type definitions} given the empty set,
        !          15590:            * as defined in Type Derivation OK (Simple) (�3.14.6).
        !          15591:            */
        !          15592:            {
        !          15593:                xmlSchemaTypeLinkPtr baseMember;
        !          15594: 
        !          15595:                /*
        !          15596:                * OPTIMIZE: if the type is restricting, it has no local defined
        !          15597:                * member types and inherits the member types of the base type;
        !          15598:                * thus a check for equality can be skipped.
        !          15599:                */
        !          15600:                /*
        !          15601:                * Even worse: I cannot see a scenario where a restricting
        !          15602:                * union simple type can have other member types as the member
        !          15603:                * types of it's base type. This check seems not necessary with
        !          15604:                * respect to the derivation process in libxml2.
        !          15605:                * But necessary if constructing types with an API.
        !          15606:                */
        !          15607:                if (type->memberTypes != NULL) {
        !          15608:                    member = type->memberTypes;
        !          15609:                    baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType);
        !          15610:                    if ((member == NULL) && (baseMember != NULL)) {
        !          15611:                        PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15612:                            "different number of member types in base");
        !          15613:                    }
        !          15614:                    while (member != NULL) {
        !          15615:                        if (baseMember == NULL) {
        !          15616:                            PERROR_INT("xmlSchemaCheckCOSSTRestricts",
        !          15617:                            "different number of member types in base");
        !          15618:                        } else if ((member->type != baseMember->type) &&
        !          15619:                            (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
        !          15620:                                member->type, baseMember->type, 0) != 0)) {
        !          15621:                            xmlChar *strBMT = NULL, *strBT = NULL;
        !          15622: 
        !          15623:                            xmlSchemaPCustomErrExt(pctxt,
        !          15624:                                XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3,
        !          15625:                                WXS_BASIC_CAST type, NULL,
        !          15626:                                "The member type %s is not validly "
        !          15627:                                "derived from its corresponding member "
        !          15628:                                "type %s of the base type %s",
        !          15629:                                xmlSchemaGetComponentQName(&str, member->type),
        !          15630:                                xmlSchemaGetComponentQName(&strBMT, baseMember->type),
        !          15631:                                xmlSchemaGetComponentQName(&strBT, type->baseType));
        !          15632:                            FREE_AND_NULL(str)
        !          15633:                            FREE_AND_NULL(strBMT)
        !          15634:                            FREE_AND_NULL(strBT)
        !          15635:                            return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3);
        !          15636:                        }
        !          15637:                        member = member->next;
        !          15638:                         if (baseMember != NULL)
        !          15639:                             baseMember = baseMember->next;
        !          15640:                    }
        !          15641:                }
        !          15642:            }
        !          15643:            /*
        !          15644:            * 3.3.2.4 Only pattern and enumeration facet components are
        !          15645:            * allowed among the {facets}.
        !          15646:            */
        !          15647:            if (type->facets != NULL) {
        !          15648:                xmlSchemaFacetPtr facet;
        !          15649:                int ok = 1;
        !          15650: 
        !          15651:                facet = type->facets;
        !          15652:                do {
        !          15653:                    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
        !          15654:                        (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
        !          15655:                        xmlSchemaPIllegalFacetListUnionErr(pctxt,
        !          15656:                                XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4,
        !          15657:                                type, facet);
        !          15658:                        ok = 0;
        !          15659:                    }
        !          15660:                    facet = facet->next;
        !          15661:                } while (facet != NULL);
        !          15662:                if (ok == 0)
        !          15663:                    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4);
        !          15664: 
        !          15665:            }
        !          15666:            /*
        !          15667:            * SPEC (3.3.2.5) (same as 1.3.2)
        !          15668:            *
        !          15669:            * NOTE (3.3.2.5) This is currently done in
        !          15670:            * xmlSchemaDeriveAndValidateFacets()
        !          15671:            */
        !          15672:        }
        !          15673:     }
        !          15674: 
        !          15675:     return (0);
        !          15676: }
        !          15677: 
        !          15678: /**
        !          15679:  * xmlSchemaCheckSRCSimpleType:
        !          15680:  * @ctxt:  the schema parser context
        !          15681:  * @type:  the simple type definition
        !          15682:  *
        !          15683:  * Checks crc-simple-type constraints.
        !          15684:  *
        !          15685:  * Returns 0 if the constraints are satisfied,
        !          15686:  * if not a positive error code and -1 on internal
        !          15687:  * errors.
        !          15688:  */
        !          15689: #if 0
        !          15690: static int
        !          15691: xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
        !          15692:                            xmlSchemaTypePtr type)
        !          15693: {
        !          15694:     /*
        !          15695:     * src-simple-type.1 The corresponding simple type definition, if any,
        !          15696:     * must satisfy the conditions set out in Constraints on Simple Type
        !          15697:     * Definition Schema Components (�3.14.6).
        !          15698:     */
        !          15699:     if (WXS_IS_RESTRICTION(type)) {
        !          15700:        /*
        !          15701:        * src-simple-type.2 "If the <restriction> alternative is chosen,
        !          15702:        * either it must have a base [attribute] or a <simpleType> among its
        !          15703:        * [children], but not both."
        !          15704:        * NOTE: This is checked in the parse function of <restriction>.
        !          15705:        */
        !          15706:        /*
        !          15707:        *
        !          15708:        */
        !          15709:     } else if (WXS_IS_LIST(type)) {
        !          15710:        /* src-simple-type.3 "If the <list> alternative is chosen, either it must have
        !          15711:        * an itemType [attribute] or a <simpleType> among its [children],
        !          15712:        * but not both."
        !          15713:        *
        !          15714:        * NOTE: This is checked in the parse function of <list>.
        !          15715:        */
        !          15716:     } else if (WXS_IS_UNION(type)) {
        !          15717:        /*
        !          15718:        * src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular().
        !          15719:        */
        !          15720:     }
        !          15721:     return (0);
        !          15722: }
        !          15723: #endif
        !          15724: 
        !          15725: static int
        !          15726: xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
        !          15727: {
        !          15728:    if (ctxt->vctxt == NULL) {
        !          15729:        ctxt->vctxt = xmlSchemaNewValidCtxt(NULL);
        !          15730:        if (ctxt->vctxt == NULL) {
        !          15731:            xmlSchemaPErr(ctxt, NULL,
        !          15732:                XML_SCHEMAP_INTERNAL,
        !          15733:                "Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
        !          15734:                "failed to create a temp. validation context.\n",
        !          15735:                NULL, NULL);
        !          15736:            return (-1);
        !          15737:        }
        !          15738:        /* TODO: Pass user data. */
        !          15739:        xmlSchemaSetValidErrors(ctxt->vctxt,
        !          15740:            ctxt->error, ctxt->warning, ctxt->errCtxt);
        !          15741:        xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
        !          15742:            ctxt->serror, ctxt->errCtxt);
        !          15743:     }
        !          15744:     return (0);
        !          15745: }
        !          15746: 
        !          15747: static int
        !          15748: xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
        !          15749:                             xmlNodePtr node,
        !          15750:                             xmlSchemaTypePtr type,
        !          15751:                             const xmlChar *value,
        !          15752:                             xmlSchemaValPtr *retVal,
        !          15753:                             int fireErrors,
        !          15754:                             int normalize,
        !          15755:                             int isNormalized);
        !          15756: 
        !          15757: /**
        !          15758:  * xmlSchemaParseCheckCOSValidDefault:
        !          15759:  * @pctxt:  the schema parser context
        !          15760:  * @type:  the simple type definition
        !          15761:  * @value: the default value
        !          15762:  * @node: an optional node (the holder of the value)
        !          15763:  *
        !          15764:  * Schema Component Constraint: Element Default Valid (Immediate)
        !          15765:  * (cos-valid-default)
        !          15766:  * This will be used by the parser only. For the validator there's
        !          15767:  * an other version.
        !          15768:  *
        !          15769:  * Returns 0 if the constraints are satisfied,
        !          15770:  * if not, a positive error code and -1 on internal
        !          15771:  * errors.
        !          15772:  */
        !          15773: static int
        !          15774: xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
        !          15775:                                   xmlNodePtr node,
        !          15776:                                   xmlSchemaTypePtr type,
        !          15777:                                   const xmlChar *value,
        !          15778:                                   xmlSchemaValPtr *val)
        !          15779: {
        !          15780:     int ret = 0;
        !          15781: 
        !          15782:     /*
        !          15783:     * cos-valid-default:
        !          15784:     * Schema Component Constraint: Element Default Valid (Immediate)
        !          15785:     * For a string to be a valid default with respect to a type
        !          15786:     * definition the appropriate case among the following must be true:
        !          15787:     */
        !          15788:     if WXS_IS_COMPLEX(type) {
        !          15789:        /*
        !          15790:        * Complex type.
        !          15791:        *
        !          15792:        * SPEC (2.1) "its {content type} must be a simple type definition
        !          15793:        * or mixed."
        !          15794:        * SPEC (2.2.2) "If the {content type} is mixed, then the {content
        !          15795:        * type}'s particle must be �emptiable� as defined by
        !          15796:        * Particle Emptiable (�3.9.6)."
        !          15797:        */
        !          15798:        if ((! WXS_HAS_SIMPLE_CONTENT(type)) &&
        !          15799:            ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) {
        !          15800:            /* NOTE that this covers (2.2.2) as well. */
        !          15801:            xmlSchemaPCustomErr(pctxt,
        !          15802:                XML_SCHEMAP_COS_VALID_DEFAULT_2_1,
        !          15803:                WXS_BASIC_CAST type, type->node,
        !          15804:                "For a string to be a valid default, the type definition "
        !          15805:                "must be a simple type or a complex type with mixed content "
        !          15806:                "and a particle emptiable", NULL);
        !          15807:            return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1);
        !          15808:        }
        !          15809:     }
        !          15810:     /*
        !          15811:     * 1 If the type definition is a simple type definition, then the string
        !          15812:     * must be �valid� with respect to that definition as defined by String
        !          15813:     * Valid (�3.14.4).
        !          15814:     *
        !          15815:     * AND
        !          15816:     *
        !          15817:     * 2.2.1 If the {content type} is a simple type definition, then the
        !          15818:     * string must be �valid� with respect to that simple type definition
        !          15819:     * as defined by String Valid (�3.14.4).
        !          15820:     */
        !          15821:     if (WXS_IS_SIMPLE(type))
        !          15822:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
        !          15823:            type, value, val, 1, 1, 0);
        !          15824:     else if (WXS_HAS_SIMPLE_CONTENT(type))
        !          15825:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
        !          15826:            type->contentTypeDef, value, val, 1, 1, 0);
        !          15827:     else
        !          15828:        return (ret);
        !          15829: 
        !          15830:     if (ret < 0) {
        !          15831:        PERROR_INT("xmlSchemaParseCheckCOSValidDefault",
        !          15832:            "calling xmlSchemaVCheckCVCSimpleType()");
        !          15833:     }
        !          15834: 
        !          15835:     return (ret);
        !          15836: }
        !          15837: 
        !          15838: /**
        !          15839:  * xmlSchemaCheckCTPropsCorrect:
        !          15840:  * @ctxt:  the schema parser context
        !          15841:  * @type:  the complex type definition
        !          15842:  *
        !          15843:  *.(4.6) Constraints on Complex Type Definition Schema Components
        !          15844:  * Schema Component Constraint:
        !          15845:  * Complex Type Definition Properties Correct (ct-props-correct)
        !          15846:  * STATUS: (seems) complete
        !          15847:  *
        !          15848:  * Returns 0 if the constraints are satisfied, a positive
        !          15849:  * error code if not and -1 if an internal error occured.
        !          15850:  */
        !          15851: static int
        !          15852: xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
        !          15853:                             xmlSchemaTypePtr type)
        !          15854: {
        !          15855:     /*
        !          15856:     * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily.
        !          15857:     *
        !          15858:     * SPEC (1) "The values of the properties of a complex type definition must
        !          15859:     * be as described in the property tableau in The Complex Type Definition
        !          15860:     * Schema Component (�3.4.1), modulo the impact of Missing
        !          15861:     * Sub-components (�5.3)."
        !          15862:     */
        !          15863:     if ((type->baseType != NULL) &&
        !          15864:        (WXS_IS_SIMPLE(type->baseType)) &&
        !          15865:        (WXS_IS_EXTENSION(type) == 0)) {
        !          15866:        /*
        !          15867:        * SPEC (2) "If the {base type definition} is a simple type definition,
        !          15868:        * the {derivation method} must be extension."
        !          15869:        */
        !          15870:        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          15871:            XML_SCHEMAP_SRC_CT_1,
        !          15872:            NULL, WXS_BASIC_CAST type,
        !          15873:            "If the base type is a simple type, the derivation method must be "
        !          15874:            "'extension'", NULL, NULL);
        !          15875:        return (XML_SCHEMAP_SRC_CT_1);
        !          15876:     }
        !          15877:     /*
        !          15878:     * SPEC (3) "Circular definitions are disallowed, except for the �ur-type
        !          15879:     * definition�. That is, it must be possible to reach the �ur-type
        !          15880:     * definition by repeatedly following the {base type definition}."
        !          15881:     *
        !          15882:     * NOTE (3) is done in xmlSchemaCheckTypeDefCircular().
        !          15883:     */
        !          15884:     /*
        !          15885:     * NOTE that (4) and (5) need the following:
        !          15886:     *   - attribute uses need to be already inherited (apply attr. prohibitions)
        !          15887:     *   - attribute group references need to be expanded already
        !          15888:     *   - simple types need to be typefixed already
        !          15889:     */
        !          15890:     if (type->attrUses &&
        !          15891:        (((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1))
        !          15892:     {
        !          15893:        xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses;
        !          15894:        xmlSchemaAttributeUsePtr use, tmp;
        !          15895:        int i, j, hasId = 0;
        !          15896: 
        !          15897:        for (i = uses->nbItems -1; i >= 0; i--) {
        !          15898:            use = uses->items[i];
        !          15899: 
        !          15900:            /*
        !          15901:            * SPEC ct-props-correct
        !          15902:            * (4) "Two distinct attribute declarations in the
        !          15903:            * {attribute uses} must not have identical {name}s and
        !          15904:            * {target namespace}s."
        !          15905:            */
        !          15906:            if (i > 0) {
        !          15907:                for (j = i -1; j >= 0; j--) {
        !          15908:                    tmp = uses->items[j];
        !          15909:                    if ((WXS_ATTRUSE_DECL_NAME(use) ==
        !          15910:                        WXS_ATTRUSE_DECL_NAME(tmp)) &&
        !          15911:                        (WXS_ATTRUSE_DECL_TNS(use) ==
        !          15912:                        WXS_ATTRUSE_DECL_TNS(tmp)))
        !          15913:                    {
        !          15914:                        xmlChar *str = NULL;
        !          15915: 
        !          15916:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          15917:                            XML_SCHEMAP_AG_PROPS_CORRECT,
        !          15918:                            NULL, WXS_BASIC_CAST type,
        !          15919:                            "Duplicate %s",
        !          15920:                            xmlSchemaGetComponentDesignation(&str, use),
        !          15921:                            NULL);
        !          15922:                        FREE_AND_NULL(str);
        !          15923:                        /*
        !          15924:                        * Remove the duplicate.
        !          15925:                        */
        !          15926:                        if (xmlSchemaItemListRemove(uses, i) == -1)
        !          15927:                            goto exit_failure;
        !          15928:                        goto next_use;
        !          15929:                    }
        !          15930:                }
        !          15931:            }
        !          15932:            /*
        !          15933:            * SPEC ct-props-correct
        !          15934:            * (5) "Two distinct attribute declarations in the
        !          15935:            * {attribute uses} must not have {type definition}s which
        !          15936:            * are or are derived from ID."
        !          15937:            */
        !          15938:            if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
        !          15939:                if (xmlSchemaIsDerivedFromBuiltInType(
        !          15940:                    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
        !          15941:                {
        !          15942:                    if (hasId) {
        !          15943:                        xmlChar *str = NULL;
        !          15944: 
        !          15945:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          15946:                            XML_SCHEMAP_AG_PROPS_CORRECT,
        !          15947:                            NULL, WXS_BASIC_CAST type,
        !          15948:                            "There must not exist more than one attribute "
        !          15949:                            "declaration of type 'xs:ID' "
        !          15950:                            "(or derived from 'xs:ID'). The %s violates this "
        !          15951:                            "constraint",
        !          15952:                            xmlSchemaGetComponentDesignation(&str, use),
        !          15953:                            NULL);
        !          15954:                        FREE_AND_NULL(str);
        !          15955:                        if (xmlSchemaItemListRemove(uses, i) == -1)
        !          15956:                            goto exit_failure;
        !          15957:                    }
        !          15958: 
        !          15959:                    hasId = 1;
        !          15960:                }
        !          15961:            }
        !          15962: next_use: {}
        !          15963:        }
        !          15964:     }
        !          15965:     return (0);
        !          15966: exit_failure:
        !          15967:     return(-1);
        !          15968: }
        !          15969: 
        !          15970: static int
        !          15971: xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
        !          15972:                       xmlSchemaTypePtr typeB)
        !          15973: {
        !          15974:     /*
        !          15975:     * TODO: This should implement component-identity
        !          15976:     * in the future.
        !          15977:     */
        !          15978:     if ((typeA == NULL) || (typeB == NULL))
        !          15979:        return (0);
        !          15980:     return (typeA == typeB);
        !          15981: }
        !          15982: 
        !          15983: /**
        !          15984:  * xmlSchemaCheckCOSCTDerivedOK:
        !          15985:  * @ctxt:  the schema parser context
        !          15986:  * @type:  the to-be derived complex type definition
        !          15987:  * @baseType:  the base complex type definition
        !          15988:  * @set: the given set
        !          15989:  *
        !          15990:  * Schema Component Constraint:
        !          15991:  * Type Derivation OK (Complex) (cos-ct-derived-ok)
        !          15992:  *
        !          15993:  * STATUS: completed
        !          15994:  *
        !          15995:  * Returns 0 if the constraints are satisfied, or 1
        !          15996:  * if not.
        !          15997:  */
        !          15998: static int
        !          15999: xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
        !          16000:                             xmlSchemaTypePtr type,
        !          16001:                             xmlSchemaTypePtr baseType,
        !          16002:                             int set)
        !          16003: {
        !          16004:     int equal = xmlSchemaAreEqualTypes(type, baseType);
        !          16005:     /* TODO: Error codes. */
        !          16006:     /*
        !          16007:     * SPEC "For a complex type definition (call it D, for derived)
        !          16008:     * to be validly derived from a type definition (call this
        !          16009:     * B, for base) given a subset of {extension, restriction}
        !          16010:     * all of the following must be true:"
        !          16011:     */
        !          16012:     if (! equal) {
        !          16013:        /*
        !          16014:        * SPEC (1) "If B and D are not the same type definition, then the
        !          16015:        * {derivation method} of D must not be in the subset."
        !          16016:        */
        !          16017:        if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) ||
        !          16018:            ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type))))
        !          16019:            return (1);
        !          16020:     } else {
        !          16021:        /*
        !          16022:        * SPEC (2.1) "B and D must be the same type definition."
        !          16023:        */
        !          16024:        return (0);
        !          16025:     }
        !          16026:     /*
        !          16027:     * SPEC (2.2) "B must be D's {base type definition}."
        !          16028:     */
        !          16029:     if (type->baseType == baseType)
        !          16030:        return (0);
        !          16031:     /*
        !          16032:     * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type
        !          16033:     * definition�."
        !          16034:     */
        !          16035:     if (WXS_IS_ANYTYPE(type->baseType))
        !          16036:        return (1);
        !          16037: 
        !          16038:     if (WXS_IS_COMPLEX(type->baseType)) {
        !          16039:        /*
        !          16040:        * SPEC (2.3.2.1) "If D's {base type definition} is complex, then it
        !          16041:        * must be validly derived from B given the subset as defined by this
        !          16042:        * constraint."
        !          16043:        */
        !          16044:        return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType,
        !          16045:            baseType, set));
        !          16046:     } else {
        !          16047:        /*
        !          16048:        * SPEC (2.3.2.2) "If D's {base type definition} is simple, then it
        !          16049:        * must be validly derived from B given the subset as defined in Type
        !          16050:        * Derivation OK (Simple) (�3.14.6).
        !          16051:        */
        !          16052:        return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
        !          16053:            baseType, set));
        !          16054:     }
        !          16055: }
        !          16056: 
        !          16057: /**
        !          16058:  * xmlSchemaCheckCOSDerivedOK:
        !          16059:  * @type:  the derived simple type definition
        !          16060:  * @baseType:  the base type definition
        !          16061:  *
        !          16062:  * Calls:
        !          16063:  * Type Derivation OK (Simple) AND Type Derivation OK (Complex)
        !          16064:  *
        !          16065:  * Checks wheter @type can be validly derived from @baseType.
        !          16066:  *
        !          16067:  * Returns 0 on success, an positive error code otherwise.
        !          16068:  */
        !          16069: static int
        !          16070: xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
        !          16071:                           xmlSchemaTypePtr type,
        !          16072:                           xmlSchemaTypePtr baseType,
        !          16073:                           int set)
        !          16074: {
        !          16075:     if (WXS_IS_SIMPLE(type))
        !          16076:        return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set));
        !          16077:     else
        !          16078:        return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set));
        !          16079: }
        !          16080: 
        !          16081: /**
        !          16082:  * xmlSchemaCheckCOSCTExtends:
        !          16083:  * @ctxt:  the schema parser context
        !          16084:  * @type:  the complex type definition
        !          16085:  *
        !          16086:  * (3.4.6) Constraints on Complex Type Definition Schema Components
        !          16087:  * Schema Component Constraint:
        !          16088:  * Derivation Valid (Extension) (cos-ct-extends)
        !          16089:  *
        !          16090:  * STATUS:
        !          16091:  *   missing:
        !          16092:  *     (1.5)
        !          16093:  *     (1.4.3.2.2.2) "Particle Valid (Extension)"
        !          16094:  *
        !          16095:  * Returns 0 if the constraints are satisfied, a positive
        !          16096:  * error code if not and -1 if an internal error occured.
        !          16097:  */
        !          16098: static int
        !          16099: xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
        !          16100:                           xmlSchemaTypePtr type)
        !          16101: {
        !          16102:     xmlSchemaTypePtr base = type->baseType;
        !          16103:     /*
        !          16104:     * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used
        !          16105:     * temporarily only.
        !          16106:     */
        !          16107:     /*
        !          16108:     * SPEC (1) "If the {base type definition} is a complex type definition,
        !          16109:     * then all of the following must be true:"
        !          16110:     */
        !          16111:     if (WXS_IS_COMPLEX(base)) {
        !          16112:        /*
        !          16113:        * SPEC (1.1) "The {final} of the {base type definition} must not
        !          16114:        * contain extension."
        !          16115:        */
        !          16116:        if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
        !          16117:            xmlSchemaPCustomErr(ctxt,
        !          16118:                XML_SCHEMAP_COS_CT_EXTENDS_1_1,
        !          16119:                WXS_BASIC_CAST type, NULL,
        !          16120:                "The 'final' of the base type definition "
        !          16121:                "contains 'extension'", NULL);
        !          16122:            return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
        !          16123:        }
        !          16124: 
        !          16125:        /*
        !          16126:        * ATTENTION: The constrains (1.2) and (1.3) are not applied,
        !          16127:        * since they are automatically satisfied through the
        !          16128:        * inheriting mechanism.
        !          16129:        * Note that even if redefining components, the inheriting mechanism
        !          16130:        * is used.
        !          16131:        */
        !          16132: #if 0
        !          16133:        /*
        !          16134:        * SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute
        !          16135:        * uses}
        !          16136:        * of the complex type definition itself, that is, for every attribute
        !          16137:        * use in the {attribute uses} of the {base type definition}, there
        !          16138:        * must be an attribute use in the {attribute uses} of the complex
        !          16139:        * type definition itself whose {attribute declaration} has the same
        !          16140:        * {name}, {target namespace} and {type definition} as its attribute
        !          16141:        * declaration"
        !          16142:        */
        !          16143:        if (base->attrUses != NULL) {
        !          16144:            int i, j, found;
        !          16145:            xmlSchemaAttributeUsePtr use, buse;
        !          16146: 
        !          16147:            for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) {
        !          16148:                buse = (WXS_LIST_CAST base->attrUses)->items[i];
        !          16149:                found = 0;
        !          16150:                if (type->attrUses != NULL) {
        !          16151:                    use = (WXS_LIST_CAST type->attrUses)->items[j];
        !          16152:                    for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++)
        !          16153:                    {
        !          16154:                        if ((WXS_ATTRUSE_DECL_NAME(use) ==
        !          16155:                                WXS_ATTRUSE_DECL_NAME(buse)) &&
        !          16156:                            (WXS_ATTRUSE_DECL_TNS(use) ==
        !          16157:                                WXS_ATTRUSE_DECL_TNS(buse)) &&
        !          16158:                            (WXS_ATTRUSE_TYPEDEF(use) ==
        !          16159:                                WXS_ATTRUSE_TYPEDEF(buse))
        !          16160:                        {
        !          16161:                            found = 1;
        !          16162:                            break;
        !          16163:                        }
        !          16164:                    }
        !          16165:                }
        !          16166:                if (! found) {
        !          16167:                    xmlChar *str = NULL;
        !          16168: 
        !          16169:                    xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          16170:                        XML_SCHEMAP_COS_CT_EXTENDS_1_2,
        !          16171:                        NULL, WXS_BASIC_CAST type,
        !          16172:                        /*
        !          16173:                        * TODO: The report does not indicate that also the
        !          16174:                        * type needs to be the same.
        !          16175:                        */
        !          16176:                        "This type is missing a matching correspondent "
        !          16177:                        "for its {base type}'s %s in its {attribute uses}",
        !          16178:                        xmlSchemaGetComponentDesignation(&str,
        !          16179:                            buse->children),
        !          16180:                        NULL);
        !          16181:                    FREE_AND_NULL(str)
        !          16182:                }
        !          16183:            }
        !          16184:        }
        !          16185:        /*
        !          16186:        * SPEC (1.3) "If it has an {attribute wildcard}, the complex type
        !          16187:        * definition must also have one, and the base type definition's
        !          16188:        * {attribute  wildcard}'s {namespace constraint} must be a subset
        !          16189:        * of the complex  type definition's {attribute wildcard}'s {namespace
        !          16190:        * constraint}, as defined by Wildcard Subset (�3.10.6)."
        !          16191:        */
        !          16192: 
        !          16193:        /*
        !          16194:        * MAYBE TODO: Enable if ever needed. But this will be needed only
        !          16195:        * if created the type via a schema construction API.
        !          16196:        */
        !          16197:        if (base->attributeWildcard != NULL) {
        !          16198:            if (type->attributeWilcard == NULL) {
        !          16199:                xmlChar *str = NULL;
        !          16200: 
        !          16201:                xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          16202:                    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
        !          16203:                    NULL, type,
        !          16204:                    "The base %s has an attribute wildcard, "
        !          16205:                    "but this type is missing an attribute wildcard",
        !          16206:                    xmlSchemaGetComponentDesignation(&str, base));
        !          16207:                FREE_AND_NULL(str)
        !          16208: 
        !          16209:            } else if (xmlSchemaCheckCOSNSSubset(
        !          16210:                base->attributeWildcard, type->attributeWildcard))
        !          16211:            {
        !          16212:                xmlChar *str = NULL;
        !          16213: 
        !          16214:                xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          16215:                    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
        !          16216:                    NULL, type,
        !          16217:                    "The attribute wildcard is not a valid "
        !          16218:                    "superset of the one in the base %s",
        !          16219:                    xmlSchemaGetComponentDesignation(&str, base));
        !          16220:                FREE_AND_NULL(str)
        !          16221:            }
        !          16222:        }
        !          16223: #endif
        !          16224:        /*
        !          16225:        * SPEC (1.4) "One of the following must be true:"
        !          16226:        */
        !          16227:        if ((type->contentTypeDef != NULL) &&
        !          16228:            (type->contentTypeDef == base->contentTypeDef)) {
        !          16229:            /*
        !          16230:            * SPEC (1.4.1) "The {content type} of the {base type definition}
        !          16231:            * and the {content type} of the complex type definition itself
        !          16232:            * must be the same simple type definition"
        !          16233:            * PASS
        !          16234:            */
        !          16235:        } else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
        !          16236:            (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
        !          16237:            /*
        !          16238:            * SPEC (1.4.2) "The {content type} of both the {base type
        !          16239:            * definition} and the complex type definition itself must
        !          16240:            * be empty."
        !          16241:            * PASS
        !          16242:            */
        !          16243:        } else {
        !          16244:            /*
        !          16245:            * SPEC (1.4.3) "All of the following must be true:"
        !          16246:            */
        !          16247:            if (type->subtypes == NULL) {
        !          16248:                /*
        !          16249:                * SPEC 1.4.3.1 The {content type} of the complex type
        !          16250:                * definition itself must specify a particle.
        !          16251:                */
        !          16252:                xmlSchemaPCustomErr(ctxt,
        !          16253:                    XML_SCHEMAP_COS_CT_EXTENDS_1_1,
        !          16254:                    WXS_BASIC_CAST type, NULL,
        !          16255:                    "The content type must specify a particle", NULL);
        !          16256:                return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
        !          16257:            }
        !          16258:            /*
        !          16259:            * SPEC (1.4.3.2) "One of the following must be true:"
        !          16260:            */
        !          16261:            if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
        !          16262:                /*
        !          16263:                * SPEC (1.4.3.2.1) "The {content type} of the {base type
        !          16264:                * definition} must be empty.
        !          16265:                * PASS
        !          16266:                */
        !          16267:            } else {
        !          16268:                /*
        !          16269:                * SPEC (1.4.3.2.2) "All of the following must be true:"
        !          16270:                */
        !          16271:                if ((type->contentType != base->contentType) ||
        !          16272:                    ((type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
        !          16273:                    (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
        !          16274:                    /*
        !          16275:                    * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed
        !          16276:                    * or both must be element-only."
        !          16277:                    */
        !          16278:                    xmlSchemaPCustomErr(ctxt,
        !          16279:                        XML_SCHEMAP_COS_CT_EXTENDS_1_1,
        !          16280:                        WXS_BASIC_CAST type, NULL,
        !          16281:                        "The content type of both, the type and its base "
        !          16282:                        "type, must either 'mixed' or 'element-only'", NULL);
        !          16283:                    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
        !          16284:                }
        !          16285:                /*
        !          16286:                * URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the
        !          16287:                * complex type definition must be a �valid extension�
        !          16288:                * of the {base type definition}'s particle, as defined
        !          16289:                * in Particle Valid (Extension) (�3.9.6)."
        !          16290:                *
        !          16291:                * NOTE that we won't check "Particle Valid (Extension)",
        !          16292:                * since it is ensured by the derivation process in
        !          16293:                * xmlSchemaTypeFixup(). We need to implement this when heading
        !          16294:                * for a construction API
        !          16295:                * TODO: !! This is needed to be checked if redefining a type !!
        !          16296:                */
        !          16297:            }
        !          16298:            /*
        !          16299:            * URGENT TODO (1.5)
        !          16300:            */
        !          16301:        }
        !          16302:     } else {
        !          16303:        /*
        !          16304:        * SPEC (2) "If the {base type definition} is a simple type definition,
        !          16305:        * then all of the following must be true:"
        !          16306:        */
        !          16307:        if (type->contentTypeDef != base) {
        !          16308:            /*
        !          16309:            * SPEC (2.1) "The {content type} must be the same simple type
        !          16310:            * definition."
        !          16311:            */
        !          16312:            xmlSchemaPCustomErr(ctxt,
        !          16313:                XML_SCHEMAP_COS_CT_EXTENDS_1_1,
        !          16314:                WXS_BASIC_CAST type, NULL,
        !          16315:                "The content type must be the simple base type", NULL);
        !          16316:            return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
        !          16317:        }
        !          16318:        if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
        !          16319:            /*
        !          16320:            * SPEC (2.2) "The {final} of the {base type definition} must not
        !          16321:            * contain extension"
        !          16322:            * NOTE that this is the same as (1.1).
        !          16323:            */
        !          16324:            xmlSchemaPCustomErr(ctxt,
        !          16325:                XML_SCHEMAP_COS_CT_EXTENDS_1_1,
        !          16326:                WXS_BASIC_CAST type, NULL,
        !          16327:                "The 'final' of the base type definition "
        !          16328:                "contains 'extension'", NULL);
        !          16329:            return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
        !          16330:        }
        !          16331:     }
        !          16332:     return (0);
        !          16333: }
        !          16334: 
        !          16335: /**
        !          16336:  * xmlSchemaCheckDerivationOKRestriction:
        !          16337:  * @ctxt:  the schema parser context
        !          16338:  * @type:  the complex type definition
        !          16339:  *
        !          16340:  * (3.4.6) Constraints on Complex Type Definition Schema Components
        !          16341:  * Schema Component Constraint:
        !          16342:  * Derivation Valid (Restriction, Complex) (derivation-ok-restriction)
        !          16343:  *
        !          16344:  * STATUS:
        !          16345:  *   missing:
        !          16346:  *     (5.4.2) ???
        !          16347:  *
        !          16348:  * ATTENTION:
        !          16349:  * In XML Schema 1.1 this will be:
        !          16350:  * Validation Rule: Checking complex type subsumption
        !          16351:  *
        !          16352:  * Returns 0 if the constraints are satisfied, a positive
        !          16353:  * error code if not and -1 if an internal error occured.
        !          16354:  */
        !          16355: static int
        !          16356: xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
        !          16357:                                      xmlSchemaTypePtr type)
        !          16358: {
        !          16359:     xmlSchemaTypePtr base;
        !          16360: 
        !          16361:     /*
        !          16362:     * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used
        !          16363:     * temporarily only.
        !          16364:     */
        !          16365:     base = type->baseType;
        !          16366:     if (! WXS_IS_COMPLEX(base)) {
        !          16367:        xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          16368:            XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16369:            type->node, WXS_BASIC_CAST type,
        !          16370:            "The base type must be a complex type", NULL, NULL);
        !          16371:        return(ctxt->err);
        !          16372:     }
        !          16373:     if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
        !          16374:        /*
        !          16375:        * SPEC (1) "The {base type definition} must be a complex type
        !          16376:        * definition whose {final} does not contain restriction."
        !          16377:        */
        !          16378:        xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          16379:            XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16380:            type->node, WXS_BASIC_CAST type,
        !          16381:            "The 'final' of the base type definition "
        !          16382:            "contains 'restriction'", NULL, NULL);
        !          16383:        return (ctxt->err);
        !          16384:     }
        !          16385:     /*
        !          16386:     * SPEC (2), (3) and (4)
        !          16387:     * Those are handled in a separate function, since the
        !          16388:     * same constraints are needed for redefinition of
        !          16389:     * attribute groups as well.
        !          16390:     */
        !          16391:     if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
        !          16392:        XML_SCHEMA_ACTION_DERIVE,
        !          16393:        WXS_BASIC_CAST type, WXS_BASIC_CAST base,
        !          16394:        type->attrUses, base->attrUses,
        !          16395:        type->attributeWildcard,
        !          16396:        base->attributeWildcard) == -1)
        !          16397:     {
        !          16398:        return(-1);
        !          16399:     }
        !          16400:     /*
        !          16401:     * SPEC (5) "One of the following must be true:"
        !          16402:     */
        !          16403:     if (base->builtInType == XML_SCHEMAS_ANYTYPE) {
        !          16404:        /*
        !          16405:        * SPEC (5.1) "The {base type definition} must be the
        !          16406:        * �ur-type definition�."
        !          16407:        * PASS
        !          16408:        */
        !          16409:     } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
        !          16410:            (type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
        !          16411:        /*
        !          16412:        * SPEC (5.2.1) "The {content type} of the complex type definition
        !          16413:        * must be a simple type definition"
        !          16414:        *
        !          16415:        * SPEC (5.2.2) "One of the following must be true:"
        !          16416:        */
        !          16417:        if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
        !          16418:            (base->contentType == XML_SCHEMA_CONTENT_BASIC))
        !          16419:        {
        !          16420:            int err;
        !          16421:            /*
        !          16422:            * SPEC (5.2.2.1) "The {content type} of the {base type
        !          16423:            * definition} must be a simple type definition from which
        !          16424:            * the {content type} is validly derived given the empty
        !          16425:            * set as defined in Type Derivation OK (Simple) (�3.14.6)."
        !          16426:            *
        !          16427:            * ATTENTION TODO: This seems not needed if the type implicitely
        !          16428:            * derived from the base type.
        !          16429:            *
        !          16430:            */
        !          16431:            err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
        !          16432:                type->contentTypeDef, base->contentTypeDef, 0);
        !          16433:            if (err != 0) {
        !          16434:                xmlChar *strA = NULL, *strB = NULL;
        !          16435: 
        !          16436:                if (err == -1)
        !          16437:                    return(-1);
        !          16438:                xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          16439:                    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16440:                    NULL, WXS_BASIC_CAST type,
        !          16441:                    "The {content type} %s is not validly derived from the "
        !          16442:                    "base type's {content type} %s",
        !          16443:                    xmlSchemaGetComponentDesignation(&strA,
        !          16444:                        type->contentTypeDef),
        !          16445:                    xmlSchemaGetComponentDesignation(&strB,
        !          16446:                        base->contentTypeDef));
        !          16447:                FREE_AND_NULL(strA);
        !          16448:                FREE_AND_NULL(strB);
        !          16449:                return(ctxt->err);
        !          16450:            }
        !          16451:        } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
        !          16452:            (xmlSchemaIsParticleEmptiable(
        !          16453:                (xmlSchemaParticlePtr) base->subtypes))) {
        !          16454:            /*
        !          16455:            * SPEC (5.2.2.2) "The {base type definition} must be mixed
        !          16456:            * and have a particle which is �emptiable� as defined in
        !          16457:            * Particle Emptiable (�3.9.6)."
        !          16458:            * PASS
        !          16459:            */
        !          16460:        } else {
        !          16461:            xmlSchemaPCustomErr(ctxt,
        !          16462:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16463:                WXS_BASIC_CAST type, NULL,
        !          16464:                "The content type of the base type must be either "
        !          16465:                "a simple type or 'mixed' and an emptiable particle", NULL);
        !          16466:            return (ctxt->err);
        !          16467:        }
        !          16468:     } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
        !          16469:        /*
        !          16470:        * SPEC (5.3.1) "The {content type} of the complex type itself must
        !          16471:        * be empty"
        !          16472:        */
        !          16473:        if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
        !          16474:            /*
        !          16475:            * SPEC (5.3.2.1) "The {content type} of the {base type
        !          16476:            * definition} must also be empty."
        !          16477:            * PASS
        !          16478:            */
        !          16479:        } else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
        !          16480:            (base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
        !          16481:            xmlSchemaIsParticleEmptiable(
        !          16482:                (xmlSchemaParticlePtr) base->subtypes)) {
        !          16483:            /*
        !          16484:            * SPEC (5.3.2.2) "The {content type} of the {base type
        !          16485:            * definition} must be elementOnly or mixed and have a particle
        !          16486:            * which is �emptiable� as defined in Particle Emptiable (�3.9.6)."
        !          16487:            * PASS
        !          16488:            */
        !          16489:        } else {
        !          16490:            xmlSchemaPCustomErr(ctxt,
        !          16491:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16492:                WXS_BASIC_CAST type, NULL,
        !          16493:                "The content type of the base type must be either "
        !          16494:                "empty or 'mixed' (or 'elements-only') and an emptiable "
        !          16495:                "particle", NULL);
        !          16496:            return (ctxt->err);
        !          16497:        }
        !          16498:     } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
        !          16499:        WXS_HAS_MIXED_CONTENT(type)) {
        !          16500:        /*
        !          16501:        * SPEC (5.4.1.1) "The {content type} of the complex type definition
        !          16502:        * itself must be element-only"
        !          16503:        */
        !          16504:        if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) {
        !          16505:            /*
        !          16506:            * SPEC (5.4.1.2) "The {content type} of the complex type
        !          16507:            * definition itself and of the {base type definition} must be
        !          16508:            * mixed"
        !          16509:            */
        !          16510:            xmlSchemaPCustomErr(ctxt,
        !          16511:                XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16512:                WXS_BASIC_CAST type, NULL,
        !          16513:                "If the content type is 'mixed', then the content type of the "
        !          16514:                "base type must also be 'mixed'", NULL);
        !          16515:            return (ctxt->err);
        !          16516:        }
        !          16517:        /*
        !          16518:        * SPEC (5.4.2) "The particle of the complex type definition itself
        !          16519:        * must be a �valid restriction� of the particle of the {content
        !          16520:        * type} of the {base type definition} as defined in Particle Valid
        !          16521:        * (Restriction) (�3.9.6).
        !          16522:        *
        !          16523:        * URGENT TODO: (5.4.2)
        !          16524:        */
        !          16525:     } else {
        !          16526:        xmlSchemaPCustomErr(ctxt,
        !          16527:            XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
        !          16528:            WXS_BASIC_CAST type, NULL,
        !          16529:            "The type is not a valid restriction of its base type", NULL);
        !          16530:        return (ctxt->err);
        !          16531:     }
        !          16532:     return (0);
        !          16533: }
        !          16534: 
        !          16535: /**
        !          16536:  * xmlSchemaCheckCTComponent:
        !          16537:  * @ctxt:  the schema parser context
        !          16538:  * @type:  the complex type definition
        !          16539:  *
        !          16540:  * (3.4.6) Constraints on Complex Type Definition Schema Components
        !          16541:  *
        !          16542:  * Returns 0 if the constraints are satisfied, a positive
        !          16543:  * error code if not and -1 if an internal error occured.
        !          16544:  */
        !          16545: static int
        !          16546: xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
        !          16547:                          xmlSchemaTypePtr type)
        !          16548: {
        !          16549:     int ret;
        !          16550:     /*
        !          16551:     * Complex Type Definition Properties Correct
        !          16552:     */
        !          16553:     ret = xmlSchemaCheckCTPropsCorrect(ctxt, type);
        !          16554:     if (ret != 0)
        !          16555:        return (ret);
        !          16556:     if (WXS_IS_EXTENSION(type))
        !          16557:        ret = xmlSchemaCheckCOSCTExtends(ctxt, type);
        !          16558:     else
        !          16559:        ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type);
        !          16560:     return (ret);
        !          16561: }
        !          16562: 
        !          16563: /**
        !          16564:  * xmlSchemaCheckSRCCT:
        !          16565:  * @ctxt:  the schema parser context
        !          16566:  * @type:  the complex type definition
        !          16567:  *
        !          16568:  * (3.4.3) Constraints on XML Representations of Complex Type Definitions:
        !          16569:  * Schema Representation Constraint:
        !          16570:  * Complex Type Definition Representation OK (src-ct)
        !          16571:  *
        !          16572:  * Returns 0 if the constraints are satisfied, a positive
        !          16573:  * error code if not and -1 if an internal error occured.
        !          16574:  */
        !          16575: static int
        !          16576: xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
        !          16577:                    xmlSchemaTypePtr type)
        !          16578: {
        !          16579:     xmlSchemaTypePtr base;
        !          16580:     int ret = 0;
        !          16581: 
        !          16582:     /*
        !          16583:     * TODO: Adjust the error codes here, as I used
        !          16584:     * XML_SCHEMAP_SRC_CT_1 only yet.
        !          16585:     */
        !          16586:     base = type->baseType;
        !          16587:     if (! WXS_HAS_SIMPLE_CONTENT(type)) {
        !          16588:        /*
        !          16589:        * 1 If the <complexContent> alternative is chosen, the type definition
        !          16590:        * �resolved� to by the �actual value� of the base [attribute]
        !          16591:        * must be a complex type definition;
        !          16592:        */
        !          16593:        if (! WXS_IS_COMPLEX(base)) {
        !          16594:            xmlChar *str = NULL;
        !          16595:            xmlSchemaPCustomErr(ctxt,
        !          16596:                XML_SCHEMAP_SRC_CT_1,
        !          16597:                WXS_BASIC_CAST type, type->node,
        !          16598:                "If using <complexContent>, the base type is expected to be "
        !          16599:                "a complex type. The base type '%s' is a simple type",
        !          16600:                xmlSchemaFormatQName(&str, base->targetNamespace,
        !          16601:                base->name));
        !          16602:            FREE_AND_NULL(str)
        !          16603:            return (XML_SCHEMAP_SRC_CT_1);
        !          16604:        }
        !          16605:     } else {
        !          16606:        /*
        !          16607:        * SPEC
        !          16608:        * 2 If the <simpleContent> alternative is chosen, all of the
        !          16609:        * following must be true:
        !          16610:        * 2.1 The type definition �resolved� to by the �actual value� of the
        !          16611:        * base [attribute] must be one of the following:
        !          16612:        */
        !          16613:        if (WXS_IS_SIMPLE(base)) {
        !          16614:            if (WXS_IS_EXTENSION(type) == 0) {
        !          16615:                xmlChar *str = NULL;
        !          16616:                /*
        !          16617:                * 2.1.3 only if the <extension> alternative is also
        !          16618:                * chosen, a simple type definition.
        !          16619:                */
        !          16620:                /* TODO: Change error code to ..._SRC_CT_2_1_3. */
        !          16621:                xmlSchemaPCustomErr(ctxt,
        !          16622:                    XML_SCHEMAP_SRC_CT_1,
        !          16623:                    WXS_BASIC_CAST type, NULL,
        !          16624:                    "If using <simpleContent> and <restriction>, the base "
        !          16625:                    "type must be a complex type. The base type '%s' is "
        !          16626:                    "a simple type",
        !          16627:                    xmlSchemaFormatQName(&str, base->targetNamespace,
        !          16628:                        base->name));
        !          16629:                FREE_AND_NULL(str)
        !          16630:                return (XML_SCHEMAP_SRC_CT_1);
        !          16631:            }
        !          16632:        } else {
        !          16633:            /* Base type is a complex type. */
        !          16634:            if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
        !          16635:                (base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
        !          16636:                /*
        !          16637:                * 2.1.1 a complex type definition whose {content type} is a
        !          16638:                * simple type definition;
        !          16639:                * PASS
        !          16640:                */
        !          16641:                if (base->contentTypeDef == NULL) {
        !          16642:                    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL,
        !          16643:                        WXS_BASIC_CAST type, NULL,
        !          16644:                        "Internal error: xmlSchemaCheckSRCCT, "
        !          16645:                        "'%s', base type has no content type",
        !          16646:                        type->name);
        !          16647:                    return (-1);
        !          16648:                }
        !          16649:            } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
        !          16650:                (WXS_IS_RESTRICTION(type))) {
        !          16651: 
        !          16652:                /*
        !          16653:                * 2.1.2 only if the <restriction> alternative is also
        !          16654:                * chosen, a complex type definition whose {content type}
        !          16655:                * is mixed and a particle emptiable.
        !          16656:                */
        !          16657:                if (! xmlSchemaIsParticleEmptiable(
        !          16658:                    (xmlSchemaParticlePtr) base->subtypes)) {
        !          16659:                    ret = XML_SCHEMAP_SRC_CT_1;
        !          16660:                } else
        !          16661:                    /*
        !          16662:                    * Attention: at this point the <simpleType> child is in
        !          16663:                    * ->contentTypeDef (put there during parsing).
        !          16664:                    */
        !          16665:                    if (type->contentTypeDef == NULL) {
        !          16666:                    xmlChar *str = NULL;
        !          16667:                    /*
        !          16668:                    * 2.2 If clause 2.1.2 above is satisfied, then there
        !          16669:                    * must be a <simpleType> among the [children] of
        !          16670:                    * <restriction>.
        !          16671:                    */
        !          16672:                    /* TODO: Change error code to ..._SRC_CT_2_2. */
        !          16673:                    xmlSchemaPCustomErr(ctxt,
        !          16674:                        XML_SCHEMAP_SRC_CT_1,
        !          16675:                        WXS_BASIC_CAST type, NULL,
        !          16676:                        "A <simpleType> is expected among the children "
        !          16677:                        "of <restriction>, if <simpleContent> is used and "
        !          16678:                        "the base type '%s' is a complex type",
        !          16679:                        xmlSchemaFormatQName(&str, base->targetNamespace,
        !          16680:                        base->name));
        !          16681:                    FREE_AND_NULL(str)
        !          16682:                    return (XML_SCHEMAP_SRC_CT_1);
        !          16683:                }
        !          16684:            } else {
        !          16685:                ret = XML_SCHEMAP_SRC_CT_1;
        !          16686:            }
        !          16687:        }
        !          16688:        if (ret > 0) {
        !          16689:            xmlChar *str = NULL;
        !          16690:            if (WXS_IS_RESTRICTION(type)) {
        !          16691:                xmlSchemaPCustomErr(ctxt,
        !          16692:                    XML_SCHEMAP_SRC_CT_1,
        !          16693:                    WXS_BASIC_CAST type, NULL,
        !          16694:                    "If <simpleContent> and <restriction> is used, the "
        !          16695:                    "base type must be a simple type or a complex type with "
        !          16696:                    "mixed content and particle emptiable. The base type "
        !          16697:                    "'%s' is none of those",
        !          16698:                    xmlSchemaFormatQName(&str, base->targetNamespace,
        !          16699:                    base->name));
        !          16700:            } else {
        !          16701:                xmlSchemaPCustomErr(ctxt,
        !          16702:                    XML_SCHEMAP_SRC_CT_1,
        !          16703:                    WXS_BASIC_CAST type, NULL,
        !          16704:                    "If <simpleContent> and <extension> is used, the "
        !          16705:                    "base type must be a simple type. The base type '%s' "
        !          16706:                    "is a complex type",
        !          16707:                    xmlSchemaFormatQName(&str, base->targetNamespace,
        !          16708:                    base->name));
        !          16709:            }
        !          16710:            FREE_AND_NULL(str)
        !          16711:        }
        !          16712:     }
        !          16713:     /*
        !          16714:     * SPEC (3) "The corresponding complex type definition component must
        !          16715:     * satisfy the conditions set out in Constraints on Complex Type
        !          16716:     * Definition Schema Components (�3.4.6);"
        !          16717:     * NOTE (3) will be done in xmlSchemaTypeFixup().
        !          16718:     */
        !          16719:     /*
        !          16720:     * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification
        !          16721:     * above for {attribute wildcard} is satisfied, the intensional
        !          16722:     * intersection must be expressible, as defined in Attribute Wildcard
        !          16723:     * Intersection (�3.10.6).
        !          16724:     * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses().
        !          16725:     */
        !          16726:     return (ret);
        !          16727: }
        !          16728: 
        !          16729: #ifdef ENABLE_PARTICLE_RESTRICTION
        !          16730: /**
        !          16731:  * xmlSchemaCheckParticleRangeOK:
        !          16732:  * @ctxt:  the schema parser context
        !          16733:  * @type:  the complex type definition
        !          16734:  *
        !          16735:  * (3.9.6) Constraints on Particle Schema Components
        !          16736:  * Schema Component Constraint:
        !          16737:  * Occurrence Range OK (range-ok)
        !          16738:  *
        !          16739:  * STATUS: complete
        !          16740:  *
        !          16741:  * Returns 0 if the constraints are satisfied, a positive
        !          16742:  * error code if not and -1 if an internal error occured.
        !          16743:  */
        !          16744: static int
        !          16745: xmlSchemaCheckParticleRangeOK(int rmin, int rmax,
        !          16746:                              int bmin, int bmax)
        !          16747: {
        !          16748:     if (rmin < bmin)
        !          16749:        return (1);
        !          16750:     if ((bmax != UNBOUNDED) &&
        !          16751:        (rmax > bmax))
        !          16752:        return (1);
        !          16753:     return (0);
        !          16754: }
        !          16755: 
        !          16756: /**
        !          16757:  * xmlSchemaCheckRCaseNameAndTypeOK:
        !          16758:  * @ctxt:  the schema parser context
        !          16759:  * @r: the restricting element declaration particle
        !          16760:  * @b: the base element declaration particle
        !          16761:  *
        !          16762:  * (3.9.6) Constraints on Particle Schema Components
        !          16763:  * Schema Component Constraint:
        !          16764:  * Particle Restriction OK (Elt:Elt -- NameAndTypeOK)
        !          16765:  * (rcase-NameAndTypeOK)
        !          16766:  *
        !          16767:  * STATUS:
        !          16768:  *   MISSING (3.2.3)
        !          16769:  *   CLARIFY: (3.2.2)
        !          16770:  *
        !          16771:  * Returns 0 if the constraints are satisfied, a positive
        !          16772:  * error code if not and -1 if an internal error occured.
        !          16773:  */
        !          16774: static int
        !          16775: xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
        !          16776:                                 xmlSchemaParticlePtr r,
        !          16777:                                 xmlSchemaParticlePtr b)
        !          16778: {
        !          16779:     xmlSchemaElementPtr elemR, elemB;
        !          16780: 
        !          16781:     /* TODO: Error codes (rcase-NameAndTypeOK). */
        !          16782:     elemR = (xmlSchemaElementPtr) r->children;
        !          16783:     elemB = (xmlSchemaElementPtr) b->children;
        !          16784:     /*
        !          16785:     * SPEC (1) "The declarations' {name}s and {target namespace}s are
        !          16786:     * the same."
        !          16787:     */
        !          16788:     if ((elemR != elemB) &&
        !          16789:        ((! xmlStrEqual(elemR->name, elemB->name)) ||
        !          16790:        (! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
        !          16791:        return (1);
        !          16792:     /*
        !          16793:     * SPEC (2) "R's occurrence range is a valid restriction of B's
        !          16794:     * occurrence range as defined by Occurrence Range OK (�3.9.6)."
        !          16795:     */
        !          16796:     if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
        !          16797:            b->minOccurs, b->maxOccurs) != 0)
        !          16798:        return (1);
        !          16799:     /*
        !          16800:     * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's
        !          16801:     * {scope} are global."
        !          16802:     */
        !          16803:     if (elemR == elemB)
        !          16804:        return (0);
        !          16805:     /*
        !          16806:     * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false."
        !          16807:     */
        !          16808:     if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
        !          16809:        (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
        !          16810:         return (1);
        !          16811:     /*
        !          16812:     * SPEC (3.2.2) "either B's declaration's {value constraint} is absent,
        !          16813:     * or is not fixed, or R's declaration's {value constraint} is fixed
        !          16814:     * with the same value."
        !          16815:     */
        !          16816:     if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
        !          16817:        ((elemR->value == NULL) ||
        !          16818:         ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
        !          16819:         /* TODO: Equality of the initial value or normalized or canonical? */
        !          16820:         (! xmlStrEqual(elemR->value, elemB->value))))
        !          16821:         return (1);
        !          16822:     /*
        !          16823:     * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint
        !          16824:     * definitions} is a subset of B's declaration's {identity-constraint
        !          16825:     * definitions}, if any."
        !          16826:     */
        !          16827:     if (elemB->idcs != NULL) {
        !          16828:        /* TODO */
        !          16829:     }
        !          16830:     /*
        !          16831:     * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a
        !          16832:     * superset of B's declaration's {disallowed substitutions}."
        !          16833:     */
        !          16834:     if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
        !          16835:         ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
        !          16836:        ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
        !          16837:         ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
        !          16838:        ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
        !          16839:         ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
        !          16840:         return (1);
        !          16841:     /*
        !          16842:     * SPEC (3.2.5) "R's {type definition} is validly derived given
        !          16843:     * {extension, list, union} from B's {type definition}"
        !          16844:     *
        !          16845:     * BADSPEC TODO: What's the point of adding "list" and "union" to the
        !          16846:     * set, if the corresponding constraints handle "restriction" and
        !          16847:     * "extension" only?
        !          16848:     *
        !          16849:     */
        !          16850:     {
        !          16851:        int set = 0;
        !          16852: 
        !          16853:        set |= SUBSET_EXTENSION;
        !          16854:        set |= SUBSET_LIST;
        !          16855:        set |= SUBSET_UNION;
        !          16856:        if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
        !          16857:            elemB->subtypes, set) != 0)
        !          16858:            return (1);
        !          16859:     }
        !          16860:     return (0);
        !          16861: }
        !          16862: 
        !          16863: /**
        !          16864:  * xmlSchemaCheckRCaseNSCompat:
        !          16865:  * @ctxt:  the schema parser context
        !          16866:  * @r: the restricting element declaration particle
        !          16867:  * @b: the base wildcard particle
        !          16868:  *
        !          16869:  * (3.9.6) Constraints on Particle Schema Components
        !          16870:  * Schema Component Constraint:
        !          16871:  * Particle Derivation OK (Elt:Any -- NSCompat)
        !          16872:  * (rcase-NSCompat)
        !          16873:  *
        !          16874:  * STATUS: complete
        !          16875:  *
        !          16876:  * Returns 0 if the constraints are satisfied, a positive
        !          16877:  * error code if not and -1 if an internal error occured.
        !          16878:  */
        !          16879: static int
        !          16880: xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
        !          16881:                            xmlSchemaParticlePtr r,
        !          16882:                            xmlSchemaParticlePtr b)
        !          16883: {
        !          16884:     /* TODO:Error codes (rcase-NSCompat). */
        !          16885:     /*
        !          16886:     * SPEC "For an element declaration particle to be a �valid restriction�
        !          16887:     * of a wildcard particle all of the following must be true:"
        !          16888:     *
        !          16889:     * SPEC (1) "The element declaration's {target namespace} is �valid�
        !          16890:     * with respect to the wildcard's {namespace constraint} as defined by
        !          16891:     * Wildcard allows Namespace Name (�3.10.4)."
        !          16892:     */
        !          16893:     if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children,
        !          16894:        ((xmlSchemaElementPtr) r->children)->targetNamespace) != 0)
        !          16895:        return (1);
        !          16896:     /*
        !          16897:     * SPEC (2) "R's occurrence range is a valid restriction of B's
        !          16898:     * occurrence range as defined by Occurrence Range OK (�3.9.6)."
        !          16899:     */
        !          16900:     if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
        !          16901:            b->minOccurs, b->maxOccurs) != 0)
        !          16902:        return (1);
        !          16903: 
        !          16904:     return (0);
        !          16905: }
        !          16906: 
        !          16907: /**
        !          16908:  * xmlSchemaCheckRCaseRecurseAsIfGroup:
        !          16909:  * @ctxt:  the schema parser context
        !          16910:  * @r: the restricting element declaration particle
        !          16911:  * @b: the base model group particle
        !          16912:  *
        !          16913:  * (3.9.6) Constraints on Particle Schema Components
        !          16914:  * Schema Component Constraint:
        !          16915:  * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)
        !          16916:  * (rcase-RecurseAsIfGroup)
        !          16917:  *
        !          16918:  * STATUS: TODO
        !          16919:  *
        !          16920:  * Returns 0 if the constraints are satisfied, a positive
        !          16921:  * error code if not and -1 if an internal error occured.
        !          16922:  */
        !          16923: static int
        !          16924: xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
        !          16925:                                    xmlSchemaParticlePtr r,
        !          16926:                                    xmlSchemaParticlePtr b)
        !          16927: {
        !          16928:     /* TODO: Error codes (rcase-RecurseAsIfGroup). */
        !          16929:     TODO
        !          16930:     return (0);
        !          16931: }
        !          16932: 
        !          16933: /**
        !          16934:  * xmlSchemaCheckRCaseNSSubset:
        !          16935:  * @ctxt:  the schema parser context
        !          16936:  * @r: the restricting wildcard particle
        !          16937:  * @b: the base wildcard particle
        !          16938:  *
        !          16939:  * (3.9.6) Constraints on Particle Schema Components
        !          16940:  * Schema Component Constraint:
        !          16941:  * Particle Derivation OK (Any:Any -- NSSubset)
        !          16942:  * (rcase-NSSubset)
        !          16943:  *
        !          16944:  * STATUS: complete
        !          16945:  *
        !          16946:  * Returns 0 if the constraints are satisfied, a positive
        !          16947:  * error code if not and -1 if an internal error occured.
        !          16948:  */
        !          16949: static int
        !          16950: xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
        !          16951:                                    xmlSchemaParticlePtr r,
        !          16952:                                    xmlSchemaParticlePtr b,
        !          16953:                                    int isAnyTypeBase)
        !          16954: {
        !          16955:     /* TODO: Error codes (rcase-NSSubset). */
        !          16956:     /*
        !          16957:     * SPEC (1) "R's occurrence range is a valid restriction of B's
        !          16958:     * occurrence range as defined by Occurrence Range OK (�3.9.6)."
        !          16959:     */
        !          16960:     if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
        !          16961:            b->minOccurs, b->maxOccurs))
        !          16962:        return (1);
        !          16963:     /*
        !          16964:     * SPEC (2) "R's {namespace constraint} must be an intensional subset
        !          16965:     * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)."
        !          16966:     */
        !          16967:     if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children,
        !          16968:        (xmlSchemaWildcardPtr) b->children))
        !          16969:        return (1);
        !          16970:     /*
        !          16971:     * SPEC (3) "Unless B is the content model wildcard of the �ur-type
        !          16972:     * definition�, R's {process contents} must be identical to or stronger
        !          16973:     * than B's {process contents}, where strict is stronger than lax is
        !          16974:     * stronger than skip."
        !          16975:     */
        !          16976:     if (! isAnyTypeBase) {
        !          16977:        if ( ((xmlSchemaWildcardPtr) r->children)->processContents <
        !          16978:            ((xmlSchemaWildcardPtr) b->children)->processContents)
        !          16979:            return (1);
        !          16980:     }
        !          16981: 
        !          16982:     return (0);
        !          16983: }
        !          16984: 
        !          16985: /**
        !          16986:  * xmlSchemaCheckCOSParticleRestrict:
        !          16987:  * @ctxt:  the schema parser context
        !          16988:  * @type:  the complex type definition
        !          16989:  *
        !          16990:  * (3.9.6) Constraints on Particle Schema Components
        !          16991:  * Schema Component Constraint:
        !          16992:  * Particle Valid (Restriction) (cos-particle-restrict)
        !          16993:  *
        !          16994:  * STATUS: TODO
        !          16995:  *
        !          16996:  * Returns 0 if the constraints are satisfied, a positive
        !          16997:  * error code if not and -1 if an internal error occured.
        !          16998:  */
        !          16999: static int
        !          17000: xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
        !          17001:                                  xmlSchemaParticlePtr r,
        !          17002:                                  xmlSchemaParticlePtr b)
        !          17003: {
        !          17004:     int ret = 0;
        !          17005: 
        !          17006:     /*part = WXS_TYPE_PARTICLE(type);
        !          17007:     basePart = WXS_TYPE_PARTICLE(base);
        !          17008:     */
        !          17009: 
        !          17010:     TODO
        !          17011: 
        !          17012:     /*
        !          17013:     * SPEC (1) "They are the same particle."
        !          17014:     */
        !          17015:     if (r == b)
        !          17016:        return (0);
        !          17017: 
        !          17018: 
        !          17019:     return (0);
        !          17020: }
        !          17021: 
        !          17022: #if 0
        !          17023: /**
        !          17024:  * xmlSchemaCheckRCaseNSRecurseCheckCardinality:
        !          17025:  * @ctxt:  the schema parser context
        !          17026:  * @r: the model group particle
        !          17027:  * @b: the base wildcard particle
        !          17028:  *
        !          17029:  * (3.9.6) Constraints on Particle Schema Components
        !          17030:  * Schema Component Constraint:
        !          17031:  * Particle Derivation OK (All/Choice/Sequence:Any --
        !          17032:  *                         NSRecurseCheckCardinality)
        !          17033:  * (rcase-NSRecurseCheckCardinality)
        !          17034:  *
        !          17035:  * STATUS: TODO: subst-groups
        !          17036:  *
        !          17037:  * Returns 0 if the constraints are satisfied, a positive
        !          17038:  * error code if not and -1 if an internal error occured.
        !          17039:  */
        !          17040: static int
        !          17041: xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
        !          17042:                                             xmlSchemaParticlePtr r,
        !          17043:                                             xmlSchemaParticlePtr b)
        !          17044: {
        !          17045:     xmlSchemaParticlePtr part;
        !          17046:     /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */
        !          17047:     if ((r->children == NULL) || (r->children->children == NULL))
        !          17048:        return (-1);
        !          17049:     /*
        !          17050:     * SPEC "For a group particle to be a �valid restriction� of a
        !          17051:     * wildcard particle..."
        !          17052:     *
        !          17053:     * SPEC (1) "Every member of the {particles} of the group is a �valid
        !          17054:     * restriction� of the wildcard as defined by
        !          17055:     * Particle Valid (Restriction) (�3.9.6)."
        !          17056:     */
        !          17057:     part = (xmlSchemaParticlePtr) r->children->children;
        !          17058:     do {
        !          17059:        if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b))
        !          17060:            return (1);
        !          17061:        part = (xmlSchemaParticlePtr) part->next;
        !          17062:     } while (part != NULL);
        !          17063:     /*
        !          17064:     * SPEC (2) "The effective total range of the group [...] is a
        !          17065:     * valid restriction of B's occurrence range as defined by
        !          17066:     * Occurrence Range OK (�3.9.6)."
        !          17067:     */
        !          17068:     if (xmlSchemaCheckParticleRangeOK(
        !          17069:            xmlSchemaGetParticleTotalRangeMin(r),
        !          17070:            xmlSchemaGetParticleTotalRangeMax(r),
        !          17071:            b->minOccurs, b->maxOccurs) != 0)
        !          17072:        return (1);
        !          17073:     return (0);
        !          17074: }
        !          17075: #endif
        !          17076: 
        !          17077: /**
        !          17078:  * xmlSchemaCheckRCaseRecurse:
        !          17079:  * @ctxt:  the schema parser context
        !          17080:  * @r: the <all> or <sequence> model group particle
        !          17081:  * @b: the base <all> or <sequence> model group particle
        !          17082:  *
        !          17083:  * (3.9.6) Constraints on Particle Schema Components
        !          17084:  * Schema Component Constraint:
        !          17085:  * Particle Derivation OK (All:All,Sequence:Sequence --
        !          17086:                            Recurse)
        !          17087:  * (rcase-Recurse)
        !          17088:  *
        !          17089:  * STATUS:  ?
        !          17090:  * TODO: subst-groups
        !          17091:  *
        !          17092:  * Returns 0 if the constraints are satisfied, a positive
        !          17093:  * error code if not and -1 if an internal error occured.
        !          17094:  */
        !          17095: static int
        !          17096: xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
        !          17097:                           xmlSchemaParticlePtr r,
        !          17098:                           xmlSchemaParticlePtr b)
        !          17099: {
        !          17100:     /* xmlSchemaParticlePtr part; */
        !          17101:     /* TODO: Error codes (rcase-Recurse). */
        !          17102:     if ((r->children == NULL) || (b->children == NULL) ||
        !          17103:        (r->children->type != b->children->type))
        !          17104:        return (-1);
        !          17105:     /*
        !          17106:     * SPEC "For an all or sequence group particle to be a �valid
        !          17107:     * restriction� of another group particle with the same {compositor}..."
        !          17108:     *
        !          17109:     * SPEC (1) "R's occurrence range is a valid restriction of B's
        !          17110:     * occurrence range as defined by Occurrence Range OK (�3.9.6)."
        !          17111:     */
        !          17112:     if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
        !          17113:            b->minOccurs, b->maxOccurs))
        !          17114:        return (1);
        !          17115: 
        !          17116: 
        !          17117:     return (0);
        !          17118: }
        !          17119: 
        !          17120: #endif
        !          17121: 
        !          17122: #define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
        !          17123:     xmlSchemaPCustomErrExt(pctxt,      \
        !          17124:        XML_SCHEMAP_INVALID_FACET_VALUE, \
        !          17125:        WXS_BASIC_CAST fac1, fac1->node, \
        !          17126:        "It is an error for both '%s' and '%s' to be specified on the "\
        !          17127:        "same type definition", \
        !          17128:        BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
        !          17129:        BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
        !          17130: 
        !          17131: #define FACET_RESTR_ERR(fac1, msg) \
        !          17132:     xmlSchemaPCustomErr(pctxt,      \
        !          17133:        XML_SCHEMAP_INVALID_FACET_VALUE, \
        !          17134:        WXS_BASIC_CAST fac1, fac1->node, \
        !          17135:        msg, NULL);
        !          17136: 
        !          17137: #define FACET_RESTR_FIXED_ERR(fac) \
        !          17138:     xmlSchemaPCustomErr(pctxt, \
        !          17139:        XML_SCHEMAP_INVALID_FACET_VALUE, \
        !          17140:        WXS_BASIC_CAST fac, fac->node, \
        !          17141:        "The base type's facet is 'fixed', thus the value must not " \
        !          17142:        "differ", NULL);
        !          17143: 
        !          17144: static void
        !          17145: xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
        !          17146:                        xmlSchemaFacetPtr facet1,
        !          17147:                        xmlSchemaFacetPtr facet2,
        !          17148:                        int lessGreater,
        !          17149:                        int orEqual,
        !          17150:                        int ofBase)
        !          17151: {
        !          17152:     xmlChar *msg = NULL;
        !          17153: 
        !          17154:     msg = xmlStrdup(BAD_CAST "'");
        !          17155:     msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type));
        !          17156:     msg = xmlStrcat(msg, BAD_CAST "' has to be");
        !          17157:     if (lessGreater == 0)
        !          17158:        msg = xmlStrcat(msg, BAD_CAST " equal to");
        !          17159:     if (lessGreater == 1)
        !          17160:        msg = xmlStrcat(msg, BAD_CAST " greater than");
        !          17161:     else
        !          17162:        msg = xmlStrcat(msg, BAD_CAST " less than");
        !          17163: 
        !          17164:     if (orEqual)
        !          17165:        msg = xmlStrcat(msg, BAD_CAST " or equal to");
        !          17166:     msg = xmlStrcat(msg, BAD_CAST " '");
        !          17167:     msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type));
        !          17168:     if (ofBase)
        !          17169:        msg = xmlStrcat(msg, BAD_CAST "' of the base type");
        !          17170:     else
        !          17171:        msg = xmlStrcat(msg, BAD_CAST "'");
        !          17172: 
        !          17173:     xmlSchemaPCustomErr(pctxt,
        !          17174:        XML_SCHEMAP_INVALID_FACET_VALUE,
        !          17175:        WXS_BASIC_CAST facet1, NULL,
        !          17176:        (const char *) msg, NULL);
        !          17177: 
        !          17178:     if (msg != NULL)
        !          17179:        xmlFree(msg);
        !          17180: }
        !          17181: 
        !          17182: /*
        !          17183: * xmlSchemaDeriveAndValidateFacets:
        !          17184: *
        !          17185: * Schema Component Constraint: Simple Type Restriction (Facets)
        !          17186: * (st-restrict-facets)
        !          17187: */
        !          17188: static int
        !          17189: xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
        !          17190:                                 xmlSchemaTypePtr type)
        !          17191: {
        !          17192:     xmlSchemaTypePtr base = type->baseType;
        !          17193:     xmlSchemaFacetLinkPtr link, cur, last = NULL;
        !          17194:     xmlSchemaFacetPtr facet, bfacet,
        !          17195:        flength = NULL, ftotdig = NULL, ffracdig = NULL,
        !          17196:        fmaxlen = NULL, fminlen = NULL, /* facets of the current type */
        !          17197:        fmininc = NULL, fmaxinc = NULL,
        !          17198:        fminexc = NULL, fmaxexc = NULL,
        !          17199:        bflength = NULL, bftotdig = NULL, bffracdig = NULL,
        !          17200:        bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */
        !          17201:        bfmininc = NULL, bfmaxinc = NULL,
        !          17202:        bfminexc = NULL, bfmaxexc = NULL;
        !          17203:     int res; /* err = 0, fixedErr; */
        !          17204: 
        !          17205:     /*
        !          17206:     * SPEC st-restrict-facets 1:
        !          17207:     * "The {variety} of R is the same as that of B."
        !          17208:     */
        !          17209:     /*
        !          17210:     * SPEC st-restrict-facets 2:
        !          17211:     * "If {variety} is atomic, the {primitive type definition}
        !          17212:     * of R is the same as that of B."
        !          17213:     *
        !          17214:     * NOTE: we leave 1 & 2 out for now, since this will be
        !          17215:     * satisfied by the derivation process.
        !          17216:     * CONSTRUCTION TODO: Maybe needed if using a construction API.
        !          17217:     */
        !          17218:     /*
        !          17219:     * SPEC st-restrict-facets 3:
        !          17220:     * "The {facets} of R are the union of S and the {facets}
        !          17221:     * of B, eliminating duplicates. To eliminate duplicates,
        !          17222:     * when a facet of the same kind occurs in both S and the
        !          17223:     * {facets} of B, the one in the {facets} of B is not
        !          17224:     * included, with the exception of enumeration and pattern
        !          17225:     * facets, for which multiple occurrences with distinct values
        !          17226:     * are allowed."
        !          17227:     */
        !          17228: 
        !          17229:     if ((type->facetSet == NULL) && (base->facetSet == NULL))
        !          17230:        return (0);
        !          17231: 
        !          17232:     last = type->facetSet;
        !          17233:     if (last != NULL)
        !          17234:        while (last->next != NULL)
        !          17235:            last = last->next;
        !          17236: 
        !          17237:     for (cur = type->facetSet; cur != NULL; cur = cur->next) {
        !          17238:        facet = cur->facet;
        !          17239:        switch (facet->type) {
        !          17240:            case XML_SCHEMA_FACET_LENGTH:
        !          17241:                flength = facet; break;
        !          17242:            case XML_SCHEMA_FACET_MINLENGTH:
        !          17243:                fminlen = facet; break;
        !          17244:            case XML_SCHEMA_FACET_MININCLUSIVE:
        !          17245:                fmininc = facet; break;
        !          17246:            case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          17247:                fminexc = facet; break;
        !          17248:            case XML_SCHEMA_FACET_MAXLENGTH:
        !          17249:                fmaxlen = facet; break;
        !          17250:            case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          17251:                fmaxinc = facet; break;
        !          17252:            case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          17253:                fmaxexc = facet; break;
        !          17254:            case XML_SCHEMA_FACET_TOTALDIGITS:
        !          17255:                ftotdig = facet; break;
        !          17256:            case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          17257:                ffracdig = facet; break;
        !          17258:            default:
        !          17259:                break;
        !          17260:        }
        !          17261:     }
        !          17262:     for (cur = base->facetSet; cur != NULL; cur = cur->next) {
        !          17263:        facet = cur->facet;
        !          17264:        switch (facet->type) {
        !          17265:            case XML_SCHEMA_FACET_LENGTH:
        !          17266:                bflength = facet; break;
        !          17267:            case XML_SCHEMA_FACET_MINLENGTH:
        !          17268:                bfminlen = facet; break;
        !          17269:            case XML_SCHEMA_FACET_MININCLUSIVE:
        !          17270:                bfmininc = facet; break;
        !          17271:            case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          17272:                bfminexc = facet; break;
        !          17273:            case XML_SCHEMA_FACET_MAXLENGTH:
        !          17274:                bfmaxlen = facet; break;
        !          17275:            case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          17276:                bfmaxinc = facet; break;
        !          17277:            case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          17278:                bfmaxexc = facet; break;
        !          17279:            case XML_SCHEMA_FACET_TOTALDIGITS:
        !          17280:                bftotdig = facet; break;
        !          17281:            case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          17282:                bffracdig = facet; break;
        !          17283:            default:
        !          17284:                break;
        !          17285:        }
        !          17286:     }
        !          17287:     /*
        !          17288:     * length and minLength or maxLength (2.2) + (3.2)
        !          17289:     */
        !          17290:     if (flength && (fminlen || fmaxlen)) {
        !          17291:        FACET_RESTR_ERR(flength, "It is an error for both 'length' and "
        !          17292:            "either of 'minLength' or 'maxLength' to be specified on "
        !          17293:            "the same type definition")
        !          17294:     }
        !          17295:     /*
        !          17296:     * Mutual exclusions in the same derivation step.
        !          17297:     */
        !          17298:     if ((fmaxinc) && (fmaxexc)) {
        !          17299:        /*
        !          17300:        * SCC "maxInclusive and maxExclusive"
        !          17301:        */
        !          17302:        FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
        !          17303:     }
        !          17304:     if ((fmininc) && (fminexc)) {
        !          17305:        /*
        !          17306:        * SCC "minInclusive and minExclusive"
        !          17307:        */
        !          17308:        FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
        !          17309:     }
        !          17310: 
        !          17311:     if (flength && bflength) {
        !          17312:        /*
        !          17313:        * SCC "length valid restriction"
        !          17314:        * The values have to be equal.
        !          17315:        */
        !          17316:        res = xmlSchemaCompareValues(flength->val, bflength->val);
        !          17317:        if (res == -2)
        !          17318:            goto internal_error;
        !          17319:        if (res != 0)
        !          17320:            xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
        !          17321:        if ((res != 0) && (bflength->fixed)) {
        !          17322:            FACET_RESTR_FIXED_ERR(flength)
        !          17323:        }
        !          17324: 
        !          17325:     }
        !          17326:     if (fminlen && bfminlen) {
        !          17327:        /*
        !          17328:        * SCC "minLength valid restriction"
        !          17329:        * minLength >= BASE minLength
        !          17330:        */
        !          17331:        res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
        !          17332:        if (res == -2)
        !          17333:            goto internal_error;
        !          17334:        if (res == -1)
        !          17335:            xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
        !          17336:        if ((res != 0) && (bfminlen->fixed)) {
        !          17337:            FACET_RESTR_FIXED_ERR(fminlen)
        !          17338:        }
        !          17339:     }
        !          17340:     if (fmaxlen && bfmaxlen) {
        !          17341:        /*
        !          17342:        * SCC "maxLength valid restriction"
        !          17343:        * maxLength <= BASE minLength
        !          17344:        */
        !          17345:        res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
        !          17346:        if (res == -2)
        !          17347:            goto internal_error;
        !          17348:        if (res == 1)
        !          17349:            xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
        !          17350:        if ((res != 0) && (bfmaxlen->fixed)) {
        !          17351:            FACET_RESTR_FIXED_ERR(fmaxlen)
        !          17352:        }
        !          17353:     }
        !          17354:     /*
        !          17355:     * SCC "length and minLength or maxLength"
        !          17356:     */
        !          17357:     if (! flength)
        !          17358:        flength = bflength;
        !          17359:     if (flength) {
        !          17360:        if (! fminlen)
        !          17361:            fminlen = bfminlen;
        !          17362:        if (fminlen) {
        !          17363:            /* (1.1) length >= minLength */
        !          17364:            res = xmlSchemaCompareValues(flength->val, fminlen->val);
        !          17365:            if (res == -2)
        !          17366:                goto internal_error;
        !          17367:            if (res == -1)
        !          17368:                xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
        !          17369:        }
        !          17370:        if (! fmaxlen)
        !          17371:            fmaxlen = bfmaxlen;
        !          17372:        if (fmaxlen) {
        !          17373:            /* (2.1) length <= maxLength */
        !          17374:            res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
        !          17375:            if (res == -2)
        !          17376:                goto internal_error;
        !          17377:            if (res == 1)
        !          17378:                xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
        !          17379:        }
        !          17380:     }
        !          17381:     if (fmaxinc) {
        !          17382:        /*
        !          17383:        * "maxInclusive"
        !          17384:        */
        !          17385:        if (fmininc) {
        !          17386:            /* SCC "maxInclusive >= minInclusive" */
        !          17387:            res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
        !          17388:            if (res == -2)
        !          17389:                goto internal_error;
        !          17390:            if (res == -1) {
        !          17391:                xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
        !          17392:            }
        !          17393:        }
        !          17394:        /*
        !          17395:        * SCC "maxInclusive valid restriction"
        !          17396:        */
        !          17397:        if (bfmaxinc) {
        !          17398:            /* maxInclusive <= BASE maxInclusive */
        !          17399:            res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
        !          17400:            if (res == -2)
        !          17401:                goto internal_error;
        !          17402:            if (res == 1)
        !          17403:                xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
        !          17404:            if ((res != 0) && (bfmaxinc->fixed)) {
        !          17405:                FACET_RESTR_FIXED_ERR(fmaxinc)
        !          17406:            }
        !          17407:        }
        !          17408:        if (bfmaxexc) {
        !          17409:            /* maxInclusive < BASE maxExclusive */
        !          17410:            res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
        !          17411:            if (res == -2)
        !          17412:                goto internal_error;
        !          17413:            if (res != -1) {
        !          17414:                xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
        !          17415:            }
        !          17416:        }
        !          17417:        if (bfmininc) {
        !          17418:            /* maxInclusive >= BASE minInclusive */
        !          17419:            res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
        !          17420:            if (res == -2)
        !          17421:                goto internal_error;
        !          17422:            if (res == -1) {
        !          17423:                xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
        !          17424:            }
        !          17425:        }
        !          17426:        if (bfminexc) {
        !          17427:            /* maxInclusive > BASE minExclusive */
        !          17428:            res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
        !          17429:            if (res == -2)
        !          17430:                goto internal_error;
        !          17431:            if (res != 1) {
        !          17432:                xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
        !          17433:            }
        !          17434:        }
        !          17435:     }
        !          17436:     if (fmaxexc) {
        !          17437:        /*
        !          17438:        * "maxExclusive >= minExclusive"
        !          17439:        */
        !          17440:        if (fminexc) {
        !          17441:            res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
        !          17442:            if (res == -2)
        !          17443:                goto internal_error;
        !          17444:            if (res == -1) {
        !          17445:                xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
        !          17446:            }
        !          17447:        }
        !          17448:        /*
        !          17449:        * "maxExclusive valid restriction"
        !          17450:        */
        !          17451:        if (bfmaxexc) {
        !          17452:            /* maxExclusive <= BASE maxExclusive */
        !          17453:            res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
        !          17454:            if (res == -2)
        !          17455:                goto internal_error;
        !          17456:            if (res == 1) {
        !          17457:                xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
        !          17458:            }
        !          17459:            if ((res != 0) && (bfmaxexc->fixed)) {
        !          17460:                FACET_RESTR_FIXED_ERR(fmaxexc)
        !          17461:            }
        !          17462:        }
        !          17463:        if (bfmaxinc) {
        !          17464:            /* maxExclusive <= BASE maxInclusive */
        !          17465:            res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
        !          17466:            if (res == -2)
        !          17467:                goto internal_error;
        !          17468:            if (res == 1) {
        !          17469:                xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
        !          17470:            }
        !          17471:        }
        !          17472:        if (bfmininc) {
        !          17473:            /* maxExclusive > BASE minInclusive */
        !          17474:            res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
        !          17475:            if (res == -2)
        !          17476:                goto internal_error;
        !          17477:            if (res != 1) {
        !          17478:                xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
        !          17479:            }
        !          17480:        }
        !          17481:        if (bfminexc) {
        !          17482:            /* maxExclusive > BASE minExclusive */
        !          17483:            res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
        !          17484:            if (res == -2)
        !          17485:                goto internal_error;
        !          17486:            if (res != 1) {
        !          17487:                xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
        !          17488:            }
        !          17489:        }
        !          17490:     }
        !          17491:     if (fminexc) {
        !          17492:        /*
        !          17493:        * "minExclusive < maxInclusive"
        !          17494:        */
        !          17495:        if (fmaxinc) {
        !          17496:            res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
        !          17497:            if (res == -2)
        !          17498:                goto internal_error;
        !          17499:            if (res != -1) {
        !          17500:                xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
        !          17501:            }
        !          17502:        }
        !          17503:        /*
        !          17504:        * "minExclusive valid restriction"
        !          17505:        */
        !          17506:        if (bfminexc) {
        !          17507:            /* minExclusive >= BASE minExclusive */
        !          17508:            res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
        !          17509:            if (res == -2)
        !          17510:                goto internal_error;
        !          17511:            if (res == -1) {
        !          17512:                xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
        !          17513:            }
        !          17514:            if ((res != 0) && (bfminexc->fixed)) {
        !          17515:                FACET_RESTR_FIXED_ERR(fminexc)
        !          17516:            }
        !          17517:        }
        !          17518:        if (bfmaxinc) {
        !          17519:            /* minExclusive <= BASE maxInclusive */
        !          17520:            res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
        !          17521:            if (res == -2)
        !          17522:                goto internal_error;
        !          17523:            if (res == 1) {
        !          17524:                xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
        !          17525:            }
        !          17526:        }
        !          17527:        if (bfmininc) {
        !          17528:            /* minExclusive >= BASE minInclusive */
        !          17529:            res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
        !          17530:            if (res == -2)
        !          17531:                goto internal_error;
        !          17532:            if (res == -1) {
        !          17533:                xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
        !          17534:            }
        !          17535:        }
        !          17536:        if (bfmaxexc) {
        !          17537:            /* minExclusive < BASE maxExclusive */
        !          17538:            res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
        !          17539:            if (res == -2)
        !          17540:                goto internal_error;
        !          17541:            if (res != -1) {
        !          17542:                xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
        !          17543:            }
        !          17544:        }
        !          17545:     }
        !          17546:     if (fmininc) {
        !          17547:        /*
        !          17548:        * "minInclusive < maxExclusive"
        !          17549:        */
        !          17550:        if (fmaxexc) {
        !          17551:            res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
        !          17552:            if (res == -2)
        !          17553:                goto internal_error;
        !          17554:            if (res != -1) {
        !          17555:                xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
        !          17556:            }
        !          17557:        }
        !          17558:        /*
        !          17559:        * "minExclusive valid restriction"
        !          17560:        */
        !          17561:        if (bfmininc) {
        !          17562:            /* minInclusive >= BASE minInclusive */
        !          17563:            res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
        !          17564:            if (res == -2)
        !          17565:                goto internal_error;
        !          17566:            if (res == -1) {
        !          17567:                xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
        !          17568:            }
        !          17569:            if ((res != 0) && (bfmininc->fixed)) {
        !          17570:                FACET_RESTR_FIXED_ERR(fmininc)
        !          17571:            }
        !          17572:        }
        !          17573:        if (bfmaxinc) {
        !          17574:            /* minInclusive <= BASE maxInclusive */
        !          17575:            res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
        !          17576:            if (res == -2)
        !          17577:                goto internal_error;
        !          17578:            if (res == 1) {
        !          17579:                xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
        !          17580:            }
        !          17581:        }
        !          17582:        if (bfminexc) {
        !          17583:            /* minInclusive > BASE minExclusive */
        !          17584:            res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
        !          17585:            if (res == -2)
        !          17586:                goto internal_error;
        !          17587:            if (res != 1)
        !          17588:                xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
        !          17589:        }
        !          17590:        if (bfmaxexc) {
        !          17591:            /* minInclusive < BASE maxExclusive */
        !          17592:            res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
        !          17593:            if (res == -2)
        !          17594:                goto internal_error;
        !          17595:            if (res != -1)
        !          17596:                xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
        !          17597:        }
        !          17598:     }
        !          17599:     if (ftotdig && bftotdig) {
        !          17600:        /*
        !          17601:        * SCC " totalDigits valid restriction"
        !          17602:        * totalDigits <= BASE totalDigits
        !          17603:        */
        !          17604:        res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
        !          17605:        if (res == -2)
        !          17606:            goto internal_error;
        !          17607:        if (res == 1)
        !          17608:            xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
        !          17609:            -1, 1, 1);
        !          17610:        if ((res != 0) && (bftotdig->fixed)) {
        !          17611:            FACET_RESTR_FIXED_ERR(ftotdig)
        !          17612:        }
        !          17613:     }
        !          17614:     if (ffracdig && bffracdig) {
        !          17615:        /*
        !          17616:        * SCC  "fractionDigits valid restriction"
        !          17617:        * fractionDigits <= BASE fractionDigits
        !          17618:        */
        !          17619:        res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
        !          17620:        if (res == -2)
        !          17621:            goto internal_error;
        !          17622:        if (res == 1)
        !          17623:            xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
        !          17624:            -1, 1, 1);
        !          17625:        if ((res != 0) && (bffracdig->fixed)) {
        !          17626:            FACET_RESTR_FIXED_ERR(ffracdig)
        !          17627:        }
        !          17628:     }
        !          17629:     /*
        !          17630:     * SCC "fractionDigits less than or equal to totalDigits"
        !          17631:     */
        !          17632:     if (! ftotdig)
        !          17633:        ftotdig = bftotdig;
        !          17634:     if (! ffracdig)
        !          17635:        ffracdig = bffracdig;
        !          17636:     if (ftotdig && ffracdig) {
        !          17637:        res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
        !          17638:        if (res == -2)
        !          17639:            goto internal_error;
        !          17640:        if (res == 1)
        !          17641:            xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
        !          17642:                -1, 1, 0);
        !          17643:     }
        !          17644:     /*
        !          17645:     * *Enumerations* won' be added here, since only the first set
        !          17646:     * of enumerations in the ancestor-or-self axis is used
        !          17647:     * for validation, plus we need to use the base type of those
        !          17648:     * enumerations for whitespace.
        !          17649:     *
        !          17650:     * *Patterns*: won't be add here, since they are ORed at
        !          17651:     * type level and ANDed at ancestor level. This will
        !          17652:     * happed during validation by walking the base axis
        !          17653:     * of the type.
        !          17654:     */
        !          17655:     for (cur = base->facetSet; cur != NULL; cur = cur->next) {
        !          17656:        bfacet = cur->facet;
        !          17657:        /*
        !          17658:        * Special handling of enumerations and patterns.
        !          17659:        * TODO: hmm, they should not appear in the set, so remove this.
        !          17660:        */
        !          17661:        if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
        !          17662:            (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
        !          17663:            continue;
        !          17664:        /*
        !          17665:        * Search for a duplicate facet in the current type.
        !          17666:        */
        !          17667:        link = type->facetSet;
        !          17668:        /* err = 0; */
        !          17669:        /* fixedErr = 0; */
        !          17670:        while (link != NULL) {
        !          17671:            facet = link->facet;
        !          17672:            if (facet->type == bfacet->type) {
        !          17673:                switch (facet->type) {
        !          17674:                    case XML_SCHEMA_FACET_WHITESPACE:
        !          17675:                        /*
        !          17676:                        * The whitespace must be stronger.
        !          17677:                        */
        !          17678:                        if (facet->whitespace < bfacet->whitespace) {
        !          17679:                            FACET_RESTR_ERR(facet,
        !          17680:                                "The 'whitespace' value has to be equal to "
        !          17681:                                "or stronger than the 'whitespace' value of "
        !          17682:                                "the base type")
        !          17683:                        }
        !          17684:                        if ((bfacet->fixed) &&
        !          17685:                            (facet->whitespace != bfacet->whitespace)) {
        !          17686:                            FACET_RESTR_FIXED_ERR(facet)
        !          17687:                        }
        !          17688:                        break;
        !          17689:                    default:
        !          17690:                        break;
        !          17691:                }
        !          17692:                /* Duplicate found. */
        !          17693:                break;
        !          17694:            }
        !          17695:            link = link->next;
        !          17696:        }
        !          17697:        /*
        !          17698:        * If no duplicate was found: add the base types's facet
        !          17699:        * to the set.
        !          17700:        */
        !          17701:        if (link == NULL) {
        !          17702:            link = (xmlSchemaFacetLinkPtr)
        !          17703:                xmlMalloc(sizeof(xmlSchemaFacetLink));
        !          17704:            if (link == NULL) {
        !          17705:                xmlSchemaPErrMemory(pctxt,
        !          17706:                    "deriving facets, creating a facet link", NULL);
        !          17707:                return (-1);
        !          17708:            }
        !          17709:            link->facet = cur->facet;
        !          17710:            link->next = NULL;
        !          17711:            if (last == NULL)
        !          17712:                type->facetSet = link;
        !          17713:            else
        !          17714:                last->next = link;
        !          17715:            last = link;
        !          17716:        }
        !          17717: 
        !          17718:     }
        !          17719: 
        !          17720:     return (0);
        !          17721: internal_error:
        !          17722:     PERROR_INT("xmlSchemaDeriveAndValidateFacets",
        !          17723:        "an error occured");
        !          17724:     return (-1);
        !          17725: }
        !          17726: 
        !          17727: static int
        !          17728: xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
        !          17729:                                             xmlSchemaTypePtr type)
        !          17730: {
        !          17731:     xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink;
        !          17732:     /*
        !          17733:     * The actual value is then formed by replacing any union type
        !          17734:     * definition in the �explicit members� with the members of their
        !          17735:     * {member type definitions}, in order.
        !          17736:     *
        !          17737:     * TODO: There's a bug entry at
        !          17738:     * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html"
        !          17739:     * which indicates that we'll keep the union types the future.
        !          17740:     */
        !          17741:     link = type->memberTypes;
        !          17742:     while (link != NULL) {
        !          17743: 
        !          17744:        if (WXS_IS_TYPE_NOT_FIXED(link->type))
        !          17745:            xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt);
        !          17746: 
        !          17747:        if (WXS_IS_UNION(link->type)) {
        !          17748:            subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type);
        !          17749:            if (subLink != NULL) {
        !          17750:                link->type = subLink->type;
        !          17751:                if (subLink->next != NULL) {
        !          17752:                    lastLink = link->next;
        !          17753:                    subLink = subLink->next;
        !          17754:                    prevLink = link;
        !          17755:                    while (subLink != NULL) {
        !          17756:                        newLink = (xmlSchemaTypeLinkPtr)
        !          17757:                            xmlMalloc(sizeof(xmlSchemaTypeLink));
        !          17758:                        if (newLink == NULL) {
        !          17759:                            xmlSchemaPErrMemory(pctxt, "allocating a type link",
        !          17760:                                NULL);
        !          17761:                            return (-1);
        !          17762:                        }
        !          17763:                        newLink->type = subLink->type;
        !          17764:                        prevLink->next = newLink;
        !          17765:                        prevLink = newLink;
        !          17766:                        newLink->next = lastLink;
        !          17767: 
        !          17768:                        subLink = subLink->next;
        !          17769:                    }
        !          17770:                }
        !          17771:            }
        !          17772:        }
        !          17773:        link = link->next;
        !          17774:     }
        !          17775:     return (0);
        !          17776: }
        !          17777: 
        !          17778: static void
        !          17779: xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type)
        !          17780: {
        !          17781:     int has = 0, needVal = 0, normVal = 0;
        !          17782: 
        !          17783:     has        = (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
        !          17784:     if (has) {
        !          17785:        needVal = (type->baseType->flags &
        !          17786:            XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
        !          17787:        normVal = (type->baseType->flags &
        !          17788:            XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
        !          17789:     }
        !          17790:     if (type->facets != NULL) {
        !          17791:        xmlSchemaFacetPtr fac;
        !          17792: 
        !          17793:        for (fac = type->facets; fac != NULL; fac = fac->next) {
        !          17794:            switch (fac->type) {
        !          17795:                case XML_SCHEMA_FACET_WHITESPACE:
        !          17796:                    break;
        !          17797:                case XML_SCHEMA_FACET_PATTERN:
        !          17798:                    normVal = 1;
        !          17799:                    has = 1;
        !          17800:                    break;
        !          17801:                case XML_SCHEMA_FACET_ENUMERATION:
        !          17802:                    needVal = 1;
        !          17803:                    normVal = 1;
        !          17804:                    has = 1;
        !          17805:                    break;
        !          17806:                default:
        !          17807:                    has = 1;
        !          17808:                    break;
        !          17809:            }
        !          17810:        }
        !          17811:     }
        !          17812:     if (normVal)
        !          17813:        type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
        !          17814:     if (needVal)
        !          17815:        type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
        !          17816:     if (has)
        !          17817:        type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
        !          17818: 
        !          17819:     if (has && (! needVal) && WXS_IS_ATOMIC(type)) {
        !          17820:        xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type);
        !          17821:        /*
        !          17822:        * OPTIMIZE VAL TODO: Some facets need a computed value.
        !          17823:        */
        !          17824:        if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
        !          17825:            (prim->builtInType != XML_SCHEMAS_STRING)) {
        !          17826:            type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
        !          17827:        }
        !          17828:     }
        !          17829: }
        !          17830: 
        !          17831: static int
        !          17832: xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type)
        !          17833: {
        !          17834: 
        !          17835: 
        !          17836:     /*
        !          17837:     * Evaluate the whitespace-facet value.
        !          17838:     */
        !          17839:     if (WXS_IS_LIST(type)) {
        !          17840:        type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
        !          17841:        return (0);
        !          17842:     } else if (WXS_IS_UNION(type))
        !          17843:        return (0);
        !          17844: 
        !          17845:     if (type->facetSet != NULL) {
        !          17846:        xmlSchemaFacetLinkPtr lin;
        !          17847: 
        !          17848:        for (lin = type->facetSet; lin != NULL; lin = lin->next) {
        !          17849:            if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
        !          17850:                switch (lin->facet->whitespace) {
        !          17851:                case XML_SCHEMAS_FACET_PRESERVE:
        !          17852:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
        !          17853:                    break;
        !          17854:                case XML_SCHEMAS_FACET_REPLACE:
        !          17855:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
        !          17856:                    break;
        !          17857:                case XML_SCHEMAS_FACET_COLLAPSE:
        !          17858:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
        !          17859:                    break;
        !          17860:                default:
        !          17861:                    return (-1);
        !          17862:                }
        !          17863:                return (0);
        !          17864:            }
        !          17865:        }
        !          17866:     }
        !          17867:     /*
        !          17868:     * For all �atomic� datatypes other than string (and types �derived�
        !          17869:     * by �restriction� from it) the value of whiteSpace is fixed to
        !          17870:     * collapse
        !          17871:     */
        !          17872:     {
        !          17873:        xmlSchemaTypePtr anc;
        !          17874: 
        !          17875:        for (anc = type->baseType; anc != NULL &&
        !          17876:                anc->builtInType != XML_SCHEMAS_ANYTYPE;
        !          17877:                anc = anc->baseType) {
        !          17878: 
        !          17879:            if (anc->type == XML_SCHEMA_TYPE_BASIC) {
        !          17880:                if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
        !          17881:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
        !          17882: 
        !          17883:                } else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
        !          17884:                    (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
        !          17885:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
        !          17886: 
        !          17887:                } else
        !          17888:                    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
        !          17889:                break;
        !          17890:            }
        !          17891:        }
        !          17892:     }
        !          17893:     return (0);
        !          17894: }
        !          17895: 
        !          17896: static int
        !          17897: xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
        !          17898:                          xmlSchemaTypePtr type)
        !          17899: {
        !          17900:     if (type->type != XML_SCHEMA_TYPE_SIMPLE)
        !          17901:        return(0);
        !          17902:     if (! WXS_IS_TYPE_NOT_FIXED_1(type))
        !          17903:        return(0);
        !          17904:     type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
        !          17905: 
        !          17906:     if (WXS_IS_LIST(type)) {
        !          17907:        /*
        !          17908:        * Corresponds to <simpleType><list>...
        !          17909:        */
        !          17910:        if (type->subtypes == NULL) {
        !          17911:            /*
        !          17912:            * This one is really needed, so get out.
        !          17913:            */
        !          17914:            PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
        !          17915:                "list type has no item-type assigned");
        !          17916:            return(-1);
        !          17917:        }
        !          17918:     } else if (WXS_IS_UNION(type)) {
        !          17919:        /*
        !          17920:        * Corresponds to <simpleType><union>...
        !          17921:        */
        !          17922:        if (type->memberTypes == NULL) {
        !          17923:            /*
        !          17924:            * This one is really needed, so get out.
        !          17925:            */
        !          17926:            PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
        !          17927:                "union type has no member-types assigned");
        !          17928:            return(-1);
        !          17929:        }
        !          17930:     } else {
        !          17931:        /*
        !          17932:        * Corresponds to <simpleType><restriction>...
        !          17933:        */
        !          17934:        if (type->baseType == NULL) {
        !          17935:            PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
        !          17936:                "type has no base-type assigned");
        !          17937:            return(-1);
        !          17938:        }
        !          17939:        if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType))
        !          17940:            if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1)
        !          17941:                return(-1);
        !          17942:        /*
        !          17943:        * Variety
        !          17944:        * If the <restriction> alternative is chosen, then the
        !          17945:        * {variety} of the {base type definition}.
        !          17946:        */
        !          17947:        if (WXS_IS_ATOMIC(type->baseType))
        !          17948:            type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
        !          17949:        else if (WXS_IS_LIST(type->baseType)) {
        !          17950:            type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
        !          17951:            /*
        !          17952:            * Inherit the itemType.
        !          17953:            */
        !          17954:            type->subtypes = type->baseType->subtypes;
        !          17955:        } else if (WXS_IS_UNION(type->baseType)) {
        !          17956:            type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
        !          17957:            /*
        !          17958:            * NOTE that we won't assign the memberTypes of the base,
        !          17959:            * since this will make trouble when freeing them; we will
        !          17960:            * use a lookup function to access them instead.
        !          17961:            */
        !          17962:        }
        !          17963:     }
        !          17964:     return(0);
        !          17965: }
        !          17966: 
        !          17967: #ifdef DEBUG_TYPE
        !          17968: static void
        !          17969: xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt,
        !          17970:                       xmlSchemaTypePtr type)
        !          17971: {
        !          17972:     if (type->node != NULL) {
        !          17973:         xmlGenericError(xmlGenericErrorContext,
        !          17974:                         "Type of %s : %s:%d :", name,
        !          17975:                         type->node->doc->URL,
        !          17976:                         xmlGetLineNo(type->node));
        !          17977:     } else {
        !          17978:         xmlGenericError(xmlGenericErrorContext, "Type of %s :", name);
        !          17979:     }
        !          17980:     if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) {
        !          17981:        switch (type->contentType) {
        !          17982:            case XML_SCHEMA_CONTENT_SIMPLE:
        !          17983:                xmlGenericError(xmlGenericErrorContext, "simple\n");
        !          17984:                break;
        !          17985:            case XML_SCHEMA_CONTENT_ELEMENTS:
        !          17986:                xmlGenericError(xmlGenericErrorContext, "elements\n");
        !          17987:                break;
        !          17988:            case XML_SCHEMA_CONTENT_UNKNOWN:
        !          17989:                xmlGenericError(xmlGenericErrorContext, "unknown !!!\n");
        !          17990:                break;
        !          17991:            case XML_SCHEMA_CONTENT_EMPTY:
        !          17992:                xmlGenericError(xmlGenericErrorContext, "empty\n");
        !          17993:                break;
        !          17994:            case XML_SCHEMA_CONTENT_MIXED:
        !          17995:                if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr)
        !          17996:                    type->subtypes))
        !          17997:                    xmlGenericError(xmlGenericErrorContext,
        !          17998:                        "mixed as emptiable particle\n");
        !          17999:                else
        !          18000:                    xmlGenericError(xmlGenericErrorContext, "mixed\n");
        !          18001:                break;
        !          18002:                /* Removed, since not used. */
        !          18003:                /*
        !          18004:                case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
        !          18005:                xmlGenericError(xmlGenericErrorContext, "mixed or elems\n");
        !          18006:                break;
        !          18007:                */
        !          18008:            case XML_SCHEMA_CONTENT_BASIC:
        !          18009:                xmlGenericError(xmlGenericErrorContext, "basic\n");
        !          18010:                break;
        !          18011:            default:
        !          18012:                xmlGenericError(xmlGenericErrorContext,
        !          18013:                    "not registered !!!\n");
        !          18014:                break;
        !          18015:        }
        !          18016:     }
        !          18017: }
        !          18018: #endif
        !          18019: 
        !          18020: /*
        !          18021: * 3.14.6 Constraints on Simple Type Definition Schema Components
        !          18022: */
        !          18023: static int
        !          18024: xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
        !          18025:                                 xmlSchemaTypePtr type)
        !          18026: {
        !          18027:     int res, olderrs = pctxt->nberrors;
        !          18028: 
        !          18029:     if (type->type != XML_SCHEMA_TYPE_SIMPLE)
        !          18030:        return(-1);
        !          18031: 
        !          18032:     if (! WXS_IS_TYPE_NOT_FIXED(type))
        !          18033:        return(0);
        !          18034: 
        !          18035:     type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
        !          18036:     type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
        !          18037: 
        !          18038:     if (type->baseType == NULL) {
        !          18039:        PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo",
        !          18040:            "missing baseType");
        !          18041:        goto exit_failure;
        !          18042:     }
        !          18043:     if (WXS_IS_TYPE_NOT_FIXED(type->baseType))
        !          18044:        xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt);
        !          18045:     /*
        !          18046:     * If a member type of a union is a union itself, we need to substitute
        !          18047:     * that member type for its member types.
        !          18048:     * NOTE that this might change in WXS 1.1; i.e. we will keep the union
        !          18049:     * types in WXS 1.1.
        !          18050:     */
        !          18051:     if ((type->memberTypes != NULL) &&
        !          18052:        (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1))
        !          18053:        return(-1);
        !          18054:     /*
        !          18055:     * SPEC src-simple-type 1
        !          18056:     * "The corresponding simple type definition, if any, must satisfy
        !          18057:     * the conditions set out in Constraints on Simple Type Definition
        !          18058:     * Schema Components (�3.14.6)."
        !          18059:     */
        !          18060:     /*
        !          18061:     * Schema Component Constraint: Simple Type Definition Properties Correct
        !          18062:     * (st-props-correct)
        !          18063:     */
        !          18064:     res = xmlSchemaCheckSTPropsCorrect(pctxt, type);
        !          18065:     HFAILURE HERROR
        !          18066:     /*
        !          18067:     * Schema Component Constraint: Derivation Valid (Restriction, Simple)
        !          18068:     * (cos-st-restricts)
        !          18069:     */
        !          18070:     res = xmlSchemaCheckCOSSTRestricts(pctxt, type);
        !          18071:     HFAILURE HERROR
        !          18072:     /*
        !          18073:     * TODO: Removed the error report, since it got annoying to get an
        !          18074:     * extra error report, if anything failed until now.
        !          18075:     * Enable this if needed.
        !          18076:     *
        !          18077:     * xmlSchemaPErr(ctxt, type->node,
        !          18078:     *    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
        !          18079:     *    "Simple type '%s' does not satisfy the constraints "
        !          18080:     *    "on simple type definitions.\n",
        !          18081:     *    type->name, NULL);
        !          18082:     */
        !          18083:     /*
        !          18084:     * Schema Component Constraint: Simple Type Restriction (Facets)
        !          18085:     * (st-restrict-facets)
        !          18086:     */
        !          18087:     res = xmlSchemaCheckFacetValues(type, pctxt);
        !          18088:     HFAILURE HERROR
        !          18089:     if ((type->facetSet != NULL) ||
        !          18090:        (type->baseType->facetSet != NULL)) {
        !          18091:        res = xmlSchemaDeriveAndValidateFacets(pctxt, type);
        !          18092:        HFAILURE HERROR
        !          18093:     }
        !          18094:     /*
        !          18095:     * Whitespace value.
        !          18096:     */
        !          18097:     res = xmlSchemaTypeFixupWhitespace(type);
        !          18098:     HFAILURE HERROR
        !          18099:     xmlSchemaTypeFixupOptimFacets(type);
        !          18100: 
        !          18101: exit_error:
        !          18102: #ifdef DEBUG_TYPE
        !          18103:     xmlSchemaDebugFixedType(pctxt, type);
        !          18104: #endif
        !          18105:     if (olderrs != pctxt->nberrors)
        !          18106:        return(pctxt->err);
        !          18107:     return(0);
        !          18108: 
        !          18109: exit_failure:
        !          18110: #ifdef DEBUG_TYPE
        !          18111:     xmlSchemaDebugFixedType(pctxt, type);
        !          18112: #endif
        !          18113:     return(-1);
        !          18114: }
        !          18115: 
        !          18116: static int
        !          18117: xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
        !          18118:                          xmlSchemaTypePtr type)
        !          18119: {
        !          18120:     int res = 0, olderrs = pctxt->nberrors;
        !          18121:     xmlSchemaTypePtr baseType = type->baseType;
        !          18122: 
        !          18123:     if (! WXS_IS_TYPE_NOT_FIXED(type))
        !          18124:        return(0);
        !          18125:     type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
        !          18126:     if (baseType == NULL) {
        !          18127:        PERROR_INT("xmlSchemaFixupComplexType",
        !          18128:            "missing baseType");
        !          18129:        goto exit_failure;
        !          18130:     }
        !          18131:     /*
        !          18132:     * Fixup the base type.
        !          18133:     */
        !          18134:     if (WXS_IS_TYPE_NOT_FIXED(baseType))
        !          18135:        xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
        !          18136:     if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
        !          18137:        /*
        !          18138:        * Skip fixup if the base type is invalid.
        !          18139:        * TODO: Generate a warning!
        !          18140:        */
        !          18141:        return(0);
        !          18142:     }
        !          18143:     /*
        !          18144:     * This basically checks if the base type can be derived.
        !          18145:     */
        !          18146:     res = xmlSchemaCheckSRCCT(pctxt, type);
        !          18147:     HFAILURE HERROR
        !          18148:     /*
        !          18149:     * Fixup the content type.
        !          18150:     */
        !          18151:     if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
        !          18152:        /*
        !          18153:        * Corresponds to <complexType><simpleContent>...
        !          18154:        */
        !          18155:        if ((WXS_IS_COMPLEX(baseType)) &&
        !          18156:            (baseType->contentTypeDef != NULL) &&
        !          18157:            (WXS_IS_RESTRICTION(type))) {
        !          18158:            xmlSchemaTypePtr contentBase, content;
        !          18159: #ifdef ENABLE_NAMED_LOCALS
        !          18160:            char buf[30];
        !          18161:            const xmlChar *tmpname;
        !          18162: #endif
        !          18163:            /*
        !          18164:            * SPEC (1) If <restriction> + base type is <complexType>,
        !          18165:            * "whose own {content type} is a simple type..."
        !          18166:            */
        !          18167:            if (type->contentTypeDef != NULL) {
        !          18168:                /*
        !          18169:                * SPEC (1.1) "the simple type definition corresponding to the
        !          18170:                * <simpleType> among the [children] of <restriction> if there
        !          18171:                * is one;"
        !          18172:                * Note that this "<simpleType> among the [children]" was put
        !          18173:                * into ->contentTypeDef during parsing.
        !          18174:                */
        !          18175:                contentBase = type->contentTypeDef;
        !          18176:                type->contentTypeDef = NULL;
        !          18177:            } else {
        !          18178:                /*
        !          18179:                * (1.2) "...otherwise (<restriction> has no <simpleType>
        !          18180:                * among its [children]), the simple type definition which
        !          18181:                * is the {content type} of the ... base type."
        !          18182:                */
        !          18183:                contentBase = baseType->contentTypeDef;
        !          18184:            }
        !          18185:            /*
        !          18186:            * SPEC
        !          18187:            * "... a simple type definition which restricts the simple
        !          18188:            * type definition identified in clause 1.1 or clause 1.2
        !          18189:            * with a set of facet components"
        !          18190:            *
        !          18191:            * Create the anonymous simple type, which will be the content
        !          18192:            * type of the complex type.
        !          18193:            */
        !          18194: #ifdef ENABLE_NAMED_LOCALS
        !          18195:            snprintf(buf, 29, "#scST%d", ++(pctxt->counter));
        !          18196:            tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1);
        !          18197:            content = xmlSchemaAddType(pctxt, pctxt->schema,
        !          18198:                XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace,
        !          18199:                type->node, 0);
        !          18200: #else
        !          18201:            content = xmlSchemaAddType(pctxt, pctxt->schema,
        !          18202:                XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace,
        !          18203:                type->node, 0);
        !          18204: #endif
        !          18205:            if (content == NULL)
        !          18206:                goto exit_failure;
        !          18207:            /*
        !          18208:            * We will use the same node as for the <complexType>
        !          18209:            * to have it somehow anchored in the schema doc.
        !          18210:            */
        !          18211:            content->type = XML_SCHEMA_TYPE_SIMPLE;
        !          18212:            content->baseType = contentBase;
        !          18213:            /*
        !          18214:            * Move the facets, previously anchored on the
        !          18215:            * complexType during parsing.
        !          18216:            */
        !          18217:            content->facets = type->facets;
        !          18218:            type->facets = NULL;
        !          18219:            content->facetSet = type->facetSet;
        !          18220:            type->facetSet = NULL;
        !          18221: 
        !          18222:            type->contentTypeDef = content;
        !          18223:            if (WXS_IS_TYPE_NOT_FIXED(contentBase))
        !          18224:                xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
        !          18225:            /*
        !          18226:            * Fixup the newly created type. We don't need to check
        !          18227:            * for circularity here.
        !          18228:            */
        !          18229:            res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content);
        !          18230:            HFAILURE HERROR
        !          18231:            res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content);
        !          18232:            HFAILURE HERROR
        !          18233: 
        !          18234:        } else if ((WXS_IS_COMPLEX(baseType)) &&
        !          18235:            (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
        !          18236:            (WXS_IS_RESTRICTION(type))) {
        !          18237:            /*
        !          18238:            * SPEC (2) If <restriction> + base is a mixed <complexType> with
        !          18239:            * an emptiable particle, then a simple type definition which
        !          18240:            * restricts the <restriction>'s <simpleType> child.
        !          18241:            */
        !          18242:            if ((type->contentTypeDef == NULL) ||
        !          18243:                (type->contentTypeDef->baseType == NULL)) {
        !          18244:                /*
        !          18245:                * TODO: Check if this ever happens.
        !          18246:                */
        !          18247:                xmlSchemaPCustomErr(pctxt,
        !          18248:                    XML_SCHEMAP_INTERNAL,
        !          18249:                    WXS_BASIC_CAST type, NULL,
        !          18250:                    "Internal error: xmlSchemaTypeFixup, "
        !          18251:                    "complex type '%s': the <simpleContent><restriction> "
        !          18252:                    "is missing a <simpleType> child, but was not catched "
        !          18253:                    "by xmlSchemaCheckSRCCT()", type->name);
        !          18254:                goto exit_failure;
        !          18255:            }
        !          18256:        } else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) {
        !          18257:            /*
        !          18258:            * SPEC (3) If <extension> + base is <complexType> with
        !          18259:            * <simpleType> content, "...then the {content type} of that
        !          18260:            * complex type definition"
        !          18261:            */
        !          18262:            if (baseType->contentTypeDef == NULL) {
        !          18263:                /*
        !          18264:                * TODO: Check if this ever happens. xmlSchemaCheckSRCCT
        !          18265:                * should have catched this already.
        !          18266:                */
        !          18267:                xmlSchemaPCustomErr(pctxt,
        !          18268:                    XML_SCHEMAP_INTERNAL,
        !          18269:                    WXS_BASIC_CAST type, NULL,
        !          18270:                    "Internal error: xmlSchemaTypeFixup, "
        !          18271:                    "complex type '%s': the <extension>ed base type is "
        !          18272:                    "a complex type with no simple content type",
        !          18273:                    type->name);
        !          18274:                goto exit_failure;
        !          18275:            }
        !          18276:            type->contentTypeDef = baseType->contentTypeDef;
        !          18277:        } else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) {
        !          18278:            /*
        !          18279:            * SPEC (4) <extension> + base is <simpleType>
        !          18280:            * "... then that simple type definition"
        !          18281:            */
        !          18282:            type->contentTypeDef = baseType;
        !          18283:        } else {
        !          18284:            /*
        !          18285:            * TODO: Check if this ever happens.
        !          18286:            */
        !          18287:            xmlSchemaPCustomErr(pctxt,
        !          18288:                XML_SCHEMAP_INTERNAL,
        !          18289:                WXS_BASIC_CAST type, NULL,
        !          18290:                "Internal error: xmlSchemaTypeFixup, "
        !          18291:                "complex type '%s' with <simpleContent>: unhandled "
        !          18292:                "derivation case", type->name);
        !          18293:            goto exit_failure;
        !          18294:        }
        !          18295:     } else {
        !          18296:        int dummySequence = 0;
        !          18297:        xmlSchemaParticlePtr particle =
        !          18298:            (xmlSchemaParticlePtr) type->subtypes;
        !          18299:        /*
        !          18300:        * Corresponds to <complexType><complexContent>...
        !          18301:        *
        !          18302:        * NOTE that the effective mixed was already set during parsing of
        !          18303:        * <complexType> and <complexContent>; its flag value is
        !          18304:        * XML_SCHEMAS_TYPE_MIXED.
        !          18305:        *
        !          18306:        * Compute the "effective content":
        !          18307:        * (2.1.1) + (2.1.2) + (2.1.3)
        !          18308:        */
        !          18309:        if ((particle == NULL) ||
        !          18310:            ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
        !          18311:            ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
        !          18312:            (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
        !          18313:            ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
        !          18314:            (particle->minOccurs == 0))) &&
        !          18315:            ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) {
        !          18316:            if (type->flags & XML_SCHEMAS_TYPE_MIXED) {
        !          18317:                /*
        !          18318:                * SPEC (2.1.4) "If the �effective mixed� is true, then
        !          18319:                * a particle whose properties are as follows:..."
        !          18320:                *
        !          18321:                * Empty sequence model group with
        !          18322:                * minOccurs/maxOccurs = 1 (i.e. a "particle emptiable").
        !          18323:                * NOTE that we sill assign it the <complexType> node to
        !          18324:                * somehow anchor it in the doc.
        !          18325:                */
        !          18326:                if ((particle == NULL) ||
        !          18327:                    (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
        !          18328:                    /*
        !          18329:                    * Create the particle.
        !          18330:                    */
        !          18331:                    particle = xmlSchemaAddParticle(pctxt,
        !          18332:                        type->node, 1, 1);
        !          18333:                    if (particle == NULL)
        !          18334:                        goto exit_failure;
        !          18335:                    /*
        !          18336:                    * Create the model group.
        !          18337:                    */ /* URGENT TODO: avoid adding to pending items. */
        !          18338:                    particle->children = (xmlSchemaTreeItemPtr)
        !          18339:                        xmlSchemaAddModelGroup(pctxt, pctxt->schema,
        !          18340:                        XML_SCHEMA_TYPE_SEQUENCE, type->node);
        !          18341:                    if (particle->children == NULL)
        !          18342:                        goto exit_failure;
        !          18343: 
        !          18344:                    type->subtypes = (xmlSchemaTypePtr) particle;
        !          18345:                }
        !          18346:                dummySequence = 1;
        !          18347:                type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
        !          18348:            } else {
        !          18349:                /*
        !          18350:                * SPEC (2.1.5) "otherwise empty"
        !          18351:                */
        !          18352:                type->contentType = XML_SCHEMA_CONTENT_EMPTY;
        !          18353:            }
        !          18354:        } else {
        !          18355:            /*
        !          18356:            * SPEC (2.2) "otherwise the particle corresponding to the
        !          18357:            * <all>, <choice>, <group> or <sequence> among the
        !          18358:            * [children]."
        !          18359:            */
        !          18360:            type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
        !          18361:        }
        !          18362:        /*
        !          18363:        * Compute the "content type".
        !          18364:        */
        !          18365:        if (WXS_IS_RESTRICTION(type)) {
        !          18366:            /*
        !          18367:            * SPEC (3.1) "If <restriction>..."
        !          18368:            * (3.1.1) + (3.1.2) */
        !          18369:            if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
        !          18370:                if (type->flags & XML_SCHEMAS_TYPE_MIXED)
        !          18371:                    type->contentType = XML_SCHEMA_CONTENT_MIXED;
        !          18372:            }
        !          18373:        } else {
        !          18374:            /*
        !          18375:            * SPEC (3.2) "If <extension>..."
        !          18376:            */
        !          18377:            if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
        !          18378:                /*
        !          18379:                * SPEC (3.2.1)
        !          18380:                * "If the �effective content� is empty, then the
        !          18381:                *  {content type} of the [...] base ..."
        !          18382:                */
        !          18383:                type->contentType = baseType->contentType;
        !          18384:                type->subtypes = baseType->subtypes;
        !          18385:                /*
        !          18386:                * Fixes bug #347316:
        !          18387:                * This is the case when the base type has a simple
        !          18388:                * type definition as content.
        !          18389:                */
        !          18390:                type->contentTypeDef = baseType->contentTypeDef;
        !          18391:                /*
        !          18392:                * NOTE that the effective mixed is ignored here.
        !          18393:                */
        !          18394:            } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
        !          18395:                /*
        !          18396:                * SPEC (3.2.2)
        !          18397:                */
        !          18398:                if (type->flags & XML_SCHEMAS_TYPE_MIXED)
        !          18399:                    type->contentType = XML_SCHEMA_CONTENT_MIXED;
        !          18400:            } else {
        !          18401:                /*
        !          18402:                * SPEC (3.2.3)
        !          18403:                */
        !          18404:                if (type->flags & XML_SCHEMAS_TYPE_MIXED)
        !          18405:                    type->contentType = XML_SCHEMA_CONTENT_MIXED;
        !          18406:                    /*
        !          18407:                    * "A model group whose {compositor} is sequence and whose
        !          18408:                    * {particles} are..."
        !          18409:                    */
        !          18410:                if ((WXS_TYPE_PARTICLE(type) != NULL) &&
        !          18411:                    (WXS_TYPE_PARTICLE_TERM(type) != NULL) &&
        !          18412:                    ((WXS_TYPE_PARTICLE_TERM(type))->type ==
        !          18413:                        XML_SCHEMA_TYPE_ALL))
        !          18414:                {
        !          18415:                    /*
        !          18416:                    * SPEC cos-all-limited (1)
        !          18417:                    */
        !          18418:                    xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18419:                        /* TODO: error code */
        !          18420:                        XML_SCHEMAP_COS_ALL_LIMITED,
        !          18421:                        WXS_ITEM_NODE(type), NULL,
        !          18422:                        "The type has an 'all' model group in its "
        !          18423:                        "{content type} and thus cannot be derived from "
        !          18424:                        "a non-empty type, since this would produce a "
        !          18425:                        "'sequence' model group containing the 'all' "
        !          18426:                        "model group; 'all' model groups are not "
        !          18427:                        "allowed to appear inside other model groups",
        !          18428:                        NULL, NULL);
        !          18429: 
        !          18430:                } else if ((WXS_TYPE_PARTICLE(baseType) != NULL) &&
        !          18431:                    (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) &&
        !          18432:                    ((WXS_TYPE_PARTICLE_TERM(baseType))->type ==
        !          18433:                        XML_SCHEMA_TYPE_ALL))
        !          18434:                {
        !          18435:                    /*
        !          18436:                    * SPEC cos-all-limited (1)
        !          18437:                    */
        !          18438:                    xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18439:                        /* TODO: error code */
        !          18440:                        XML_SCHEMAP_COS_ALL_LIMITED,
        !          18441:                        WXS_ITEM_NODE(type), NULL,
        !          18442:                        "A type cannot be derived by extension from a type "
        !          18443:                        "which has an 'all' model group in its "
        !          18444:                        "{content type}, since this would produce a "
        !          18445:                        "'sequence' model group containing the 'all' "
        !          18446:                        "model group; 'all' model groups are not "
        !          18447:                        "allowed to appear inside other model groups",
        !          18448:                        NULL, NULL);
        !          18449: 
        !          18450:                } else if (! dummySequence) {
        !          18451:                    xmlSchemaTreeItemPtr effectiveContent =
        !          18452:                        (xmlSchemaTreeItemPtr) type->subtypes;
        !          18453:                    /*
        !          18454:                    * Create the particle.
        !          18455:                    */
        !          18456:                    particle = xmlSchemaAddParticle(pctxt,
        !          18457:                        type->node, 1, 1);
        !          18458:                    if (particle == NULL)
        !          18459:                        goto exit_failure;
        !          18460:                    /*
        !          18461:                    * Create the "sequence" model group.
        !          18462:                    */
        !          18463:                    particle->children = (xmlSchemaTreeItemPtr)
        !          18464:                        xmlSchemaAddModelGroup(pctxt, pctxt->schema,
        !          18465:                        XML_SCHEMA_TYPE_SEQUENCE, type->node);
        !          18466:                    if (particle->children == NULL)
        !          18467:                        goto exit_failure;
        !          18468:                    WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle;
        !          18469:                    /*
        !          18470:                    * SPEC "the particle of the {content type} of
        !          18471:                    * the ... base ..."
        !          18472:                    * Create a duplicate of the base type's particle
        !          18473:                    * and assign its "term" to it.
        !          18474:                    */
        !          18475:                    particle->children->children =
        !          18476:                        (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
        !          18477:                        type->node,
        !          18478:                        ((xmlSchemaParticlePtr) type->subtypes)->minOccurs,
        !          18479:                        ((xmlSchemaParticlePtr) type->subtypes)->maxOccurs);
        !          18480:                    if (particle->children->children == NULL)
        !          18481:                        goto exit_failure;
        !          18482:                    particle = (xmlSchemaParticlePtr)
        !          18483:                        particle->children->children;
        !          18484:                    particle->children =
        !          18485:                        ((xmlSchemaParticlePtr) baseType->subtypes)->children;
        !          18486:                    /*
        !          18487:                    * SPEC "followed by the �effective content�."
        !          18488:                    */
        !          18489:                    particle->next = effectiveContent;
        !          18490:                    /*
        !          18491:                    * This all will result in:
        !          18492:                    * new-particle
        !          18493:                    *   --> new-sequence(
        !          18494:                    *         new-particle
        !          18495:                    *           --> base-model,
        !          18496:                    *         this-particle
        !          18497:                    *           --> this-model
        !          18498:                    *       )
        !          18499:                    */
        !          18500:                } else {
        !          18501:                    /*
        !          18502:                    * This is the case when there is already an empty
        !          18503:                    * <sequence> with minOccurs==maxOccurs==1.
        !          18504:                    * Just add the base types's content type.
        !          18505:                    * NOTE that, although we miss to add an intermediate
        !          18506:                    * <sequence>, this should produce no difference to
        !          18507:                    * neither the regex compilation of the content model,
        !          18508:                    * nor to the complex type contraints.
        !          18509:                    */
        !          18510:                    particle->children->children =
        !          18511:                        (xmlSchemaTreeItemPtr) baseType->subtypes;
        !          18512:                }
        !          18513:            }
        !          18514:        }
        !          18515:     }
        !          18516:     /*
        !          18517:     * Now fixup attribute uses:
        !          18518:     *   - expand attr. group references
        !          18519:     *     - intersect attribute wildcards
        !          18520:     *   - inherit attribute uses of the base type
        !          18521:     *   - inherit or union attr. wildcards if extending
        !          18522:     *   - apply attr. use prohibitions if restricting
        !          18523:     */
        !          18524:     res = xmlSchemaFixupTypeAttributeUses(pctxt, type);
        !          18525:     HFAILURE HERROR
        !          18526:     /*
        !          18527:     * Apply the complex type component constraints; this will not
        !          18528:     * check attributes, since this is done in
        !          18529:     * xmlSchemaFixupTypeAttributeUses().
        !          18530:     */
        !          18531:     res = xmlSchemaCheckCTComponent(pctxt, type);
        !          18532:     HFAILURE HERROR
        !          18533: 
        !          18534: #ifdef DEBUG_TYPE
        !          18535:     xmlSchemaDebugFixedType(pctxt, type);
        !          18536: #endif
        !          18537:     if (olderrs != pctxt->nberrors)
        !          18538:        return(pctxt->err);
        !          18539:     else
        !          18540:        return(0);
        !          18541: 
        !          18542: exit_error:
        !          18543:     type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
        !          18544: #ifdef DEBUG_TYPE
        !          18545:     xmlSchemaDebugFixedType(pctxt, type);
        !          18546: #endif
        !          18547:     return(pctxt->err);
        !          18548: 
        !          18549: exit_failure:
        !          18550:     type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
        !          18551: #ifdef DEBUG_TYPE
        !          18552:     xmlSchemaDebugFixedType(pctxt, type);
        !          18553: #endif
        !          18554:     return(-1);
        !          18555: }
        !          18556: 
        !          18557: 
        !          18558: /**
        !          18559:  * xmlSchemaTypeFixup:
        !          18560:  * @typeDecl:  the schema type definition
        !          18561:  * @ctxt:  the schema parser context
        !          18562:  *
        !          18563:  * Fixes the content model of the type.
        !          18564:  * URGENT TODO: We need an int result!
        !          18565:  */
        !          18566: static int
        !          18567: xmlSchemaTypeFixup(xmlSchemaTypePtr type,
        !          18568:                    xmlSchemaAbstractCtxtPtr actxt)
        !          18569: {
        !          18570:     if (type == NULL)
        !          18571:         return(0);
        !          18572:     if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
        !          18573:        AERROR_INT("xmlSchemaTypeFixup",
        !          18574:            "this function needs a parser context");
        !          18575:        return(-1);
        !          18576:     }
        !          18577:     if (! WXS_IS_TYPE_NOT_FIXED(type))
        !          18578:        return(0);
        !          18579:     if (type->type == XML_SCHEMA_TYPE_COMPLEX)
        !          18580:        return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type));
        !          18581:     else if (type->type == XML_SCHEMA_TYPE_SIMPLE)
        !          18582:        return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type));
        !          18583:     return(0);
        !          18584: }
        !          18585: 
        !          18586: /**
        !          18587:  * xmlSchemaCheckFacet:
        !          18588:  * @facet:  the facet
        !          18589:  * @typeDecl:  the schema type definition
        !          18590:  * @pctxt:  the schema parser context or NULL
        !          18591:  * @name: the optional name of the type
        !          18592:  *
        !          18593:  * Checks and computes the values of facets.
        !          18594:  *
        !          18595:  * Returns 0 if valid, a positive error code if not valid and
        !          18596:  *         -1 in case of an internal or API error.
        !          18597:  */
        !          18598: int
        !          18599: xmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
        !          18600:                     xmlSchemaTypePtr typeDecl,
        !          18601:                     xmlSchemaParserCtxtPtr pctxt,
        !          18602:                    const xmlChar * name ATTRIBUTE_UNUSED)
        !          18603: {
        !          18604:     int ret = 0, ctxtGiven;
        !          18605: 
        !          18606:     if ((facet == NULL) || (typeDecl == NULL))
        !          18607:         return(-1);
        !          18608:     /*
        !          18609:     * TODO: will the parser context be given if used from
        !          18610:     * the relaxNG module?
        !          18611:     */
        !          18612:     if (pctxt == NULL)
        !          18613:        ctxtGiven = 0;
        !          18614:     else
        !          18615:        ctxtGiven = 1;
        !          18616: 
        !          18617:     switch (facet->type) {
        !          18618:         case XML_SCHEMA_FACET_MININCLUSIVE:
        !          18619:         case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          18620:         case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          18621:         case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          18622:        case XML_SCHEMA_FACET_ENUMERATION: {
        !          18623:                 /*
        !          18624:                  * Okay we need to validate the value
        !          18625:                  * at that point.
        !          18626:                  */
        !          18627:                xmlSchemaTypePtr base;
        !          18628: 
        !          18629:                /* 4.3.5.5 Constraints on enumeration Schema Components
        !          18630:                * Schema Component Constraint: enumeration valid restriction
        !          18631:                * It is an �error� if any member of {value} is not in the
        !          18632:                * �value space� of {base type definition}.
        !          18633:                *
        !          18634:                * minInclusive, maxInclusive, minExclusive, maxExclusive:
        !          18635:                * The value �must� be in the
        !          18636:                * �value space� of the �base type�.
        !          18637:                */
        !          18638:                /*
        !          18639:                * This function is intended to deliver a compiled value
        !          18640:                * on the facet. In this implementation of XML Schemata the
        !          18641:                * type holding a facet, won't be a built-in type.
        !          18642:                * Thus to ensure that other API
        !          18643:                * calls (relaxng) do work, if the given type is a built-in
        !          18644:                * type, we will assume that the given built-in type *is
        !          18645:                * already* the base type.
        !          18646:                */
        !          18647:                if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
        !          18648:                    base = typeDecl->baseType;
        !          18649:                    if (base == NULL) {
        !          18650:                        PERROR_INT("xmlSchemaCheckFacet",
        !          18651:                            "a type user derived type has no base type");
        !          18652:                        return (-1);
        !          18653:                    }
        !          18654:                } else
        !          18655:                    base = typeDecl;
        !          18656: 
        !          18657:                if (! ctxtGiven) {
        !          18658:                    /*
        !          18659:                    * A context is needed if called from RelaxNG.
        !          18660:                    */
        !          18661:                    pctxt = xmlSchemaNewParserCtxt("*");
        !          18662:                    if (pctxt == NULL)
        !          18663:                        return (-1);
        !          18664:                }
        !          18665:                /*
        !          18666:                * NOTE: This call does not check the content nodes,
        !          18667:                * since they are not available:
        !          18668:                * facet->node is just the node holding the facet
        !          18669:                * definition, *not* the attribute holding the *value*
        !          18670:                * of the facet.
        !          18671:                */
        !          18672:                ret = xmlSchemaVCheckCVCSimpleType(
        !          18673:                    ACTXT_CAST pctxt, facet->node, base,
        !          18674:                    facet->value, &(facet->val), 1, 1, 0);
        !          18675:                 if (ret != 0) {
        !          18676:                    if (ret < 0) {
        !          18677:                        /* No error message for RelaxNG. */
        !          18678:                        if (ctxtGiven) {
        !          18679:                            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18680:                                XML_SCHEMAP_INTERNAL, facet->node, NULL,
        !          18681:                                "Internal error: xmlSchemaCheckFacet, "
        !          18682:                                "failed to validate the value '%s' of the "
        !          18683:                                "facet '%s' against the base type",
        !          18684:                                facet->value, xmlSchemaFacetTypeToString(facet->type));
        !          18685:                        }
        !          18686:                        goto internal_error;
        !          18687:                    }
        !          18688:                    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
        !          18689:                    /* No error message for RelaxNG. */
        !          18690:                    if (ctxtGiven) {
        !          18691:                        xmlChar *str = NULL;
        !          18692: 
        !          18693:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18694:                            ret, facet->node, WXS_BASIC_CAST facet,
        !          18695:                            "The value '%s' of the facet does not validate "
        !          18696:                            "against the base type '%s'",
        !          18697:                            facet->value,
        !          18698:                            xmlSchemaFormatQName(&str,
        !          18699:                                base->targetNamespace, base->name));
        !          18700:                        FREE_AND_NULL(str);
        !          18701:                    }
        !          18702:                    goto exit;
        !          18703:                 } else if (facet->val == NULL) {
        !          18704:                    if (ctxtGiven) {
        !          18705:                        PERROR_INT("xmlSchemaCheckFacet",
        !          18706:                            "value was not computed");
        !          18707:                    }
        !          18708:                    TODO
        !          18709:                }
        !          18710:                 break;
        !          18711:             }
        !          18712:         case XML_SCHEMA_FACET_PATTERN:
        !          18713:             facet->regexp = xmlRegexpCompile(facet->value);
        !          18714:             if (facet->regexp == NULL) {
        !          18715:                ret = XML_SCHEMAP_REGEXP_INVALID;
        !          18716:                /* No error message for RelaxNG. */
        !          18717:                if (ctxtGiven) {
        !          18718:                    xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18719:                        ret, facet->node, WXS_BASIC_CAST typeDecl,
        !          18720:                        "The value '%s' of the facet 'pattern' is not a "
        !          18721:                        "valid regular expression",
        !          18722:                        facet->value, NULL);
        !          18723:                }
        !          18724:             }
        !          18725:             break;
        !          18726:         case XML_SCHEMA_FACET_TOTALDIGITS:
        !          18727:         case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          18728:         case XML_SCHEMA_FACET_LENGTH:
        !          18729:         case XML_SCHEMA_FACET_MAXLENGTH:
        !          18730:         case XML_SCHEMA_FACET_MINLENGTH:
        !          18731: 
        !          18732:            if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
        !          18733:                ret = xmlSchemaValidatePredefinedType(
        !          18734:                    xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
        !          18735:                    facet->value, &(facet->val));
        !          18736:            } else {
        !          18737:                ret = xmlSchemaValidatePredefinedType(
        !          18738:                    xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
        !          18739:                    facet->value, &(facet->val));
        !          18740:            }
        !          18741:            if (ret != 0) {
        !          18742:                if (ret < 0) {
        !          18743:                    /* No error message for RelaxNG. */
        !          18744:                    if (ctxtGiven) {
        !          18745:                        PERROR_INT("xmlSchemaCheckFacet",
        !          18746:                            "validating facet value");
        !          18747:                    }
        !          18748:                    goto internal_error;
        !          18749:                }
        !          18750:                ret = XML_SCHEMAP_INVALID_FACET_VALUE;
        !          18751:                /* No error message for RelaxNG. */
        !          18752:                if (ctxtGiven) {
        !          18753:                    /* error code */
        !          18754:                    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
        !          18755:                        ret, facet->node, WXS_BASIC_CAST typeDecl,
        !          18756:                        "The value '%s' of the facet '%s' is not a valid '%s'",
        !          18757:                        facet->value,
        !          18758:                        xmlSchemaFacetTypeToString(facet->type),
        !          18759:                        (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
        !          18760:                            BAD_CAST "nonNegativeInteger" :
        !          18761:                            BAD_CAST "positiveInteger",
        !          18762:                        NULL);
        !          18763:                }
        !          18764:            }
        !          18765:            break;
        !          18766: 
        !          18767:         case XML_SCHEMA_FACET_WHITESPACE:{
        !          18768:                 if (xmlStrEqual(facet->value, BAD_CAST "preserve")) {
        !          18769:                     facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
        !          18770:                 } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) {
        !          18771:                     facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
        !          18772:                 } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) {
        !          18773:                     facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
        !          18774:                 } else {
        !          18775:                    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
        !          18776:                     /* No error message for RelaxNG. */
        !          18777:                    if (ctxtGiven) {
        !          18778:                        /* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */
        !          18779:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          18780:                            ret, facet->node, WXS_BASIC_CAST typeDecl,
        !          18781:                            "The value '%s' of the facet 'whitespace' is not "
        !          18782:                            "valid", facet->value, NULL);
        !          18783:                     }
        !          18784:                 }
        !          18785:             }
        !          18786:         default:
        !          18787:             break;
        !          18788:     }
        !          18789: exit:
        !          18790:     if ((! ctxtGiven) && (pctxt != NULL))
        !          18791:        xmlSchemaFreeParserCtxt(pctxt);
        !          18792:     return (ret);
        !          18793: internal_error:
        !          18794:     if ((! ctxtGiven) && (pctxt != NULL))
        !          18795:        xmlSchemaFreeParserCtxt(pctxt);
        !          18796:     return (-1);
        !          18797: }
        !          18798: 
        !          18799: /**
        !          18800:  * xmlSchemaCheckFacetValues:
        !          18801:  * @typeDecl:  the schema type definition
        !          18802:  * @ctxt:  the schema parser context
        !          18803:  *
        !          18804:  * Checks the default values types, especially for facets
        !          18805:  */
        !          18806: static int
        !          18807: xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
        !          18808:                          xmlSchemaParserCtxtPtr pctxt)
        !          18809: {
        !          18810:     int res, olderrs = pctxt->nberrors;
        !          18811:     const xmlChar *name = typeDecl->name;
        !          18812:     /*
        !          18813:     * NOTE: It is intended to use the facets list, instead
        !          18814:     * of facetSet.
        !          18815:     */
        !          18816:     if (typeDecl->facets != NULL) {
        !          18817:        xmlSchemaFacetPtr facet = typeDecl->facets;
        !          18818: 
        !          18819:        /*
        !          18820:        * Temporarily assign the "schema" to the validation context
        !          18821:        * of the parser context. This is needed for NOTATION validation.
        !          18822:        */
        !          18823:        if (pctxt->vctxt == NULL) {
        !          18824:            if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
        !          18825:                return(-1);
        !          18826:        }
        !          18827:        pctxt->vctxt->schema = pctxt->schema;
        !          18828:        while (facet != NULL) {
        !          18829:            res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name);
        !          18830:            HFAILURE
        !          18831:            facet = facet->next;
        !          18832:        }
        !          18833:        pctxt->vctxt->schema = NULL;
        !          18834:     }
        !          18835:     if (olderrs != pctxt->nberrors)
        !          18836:        return(pctxt->err);
        !          18837:     return(0);
        !          18838: exit_failure:
        !          18839:     return(-1);
        !          18840: }
        !          18841: 
        !          18842: /**
        !          18843:  * xmlSchemaGetCircModelGrDefRef:
        !          18844:  * @ctxtMGroup: the searched model group
        !          18845:  * @selfMGroup: the second searched model group
        !          18846:  * @particle: the first particle
        !          18847:  *
        !          18848:  * This one is intended to be used by
        !          18849:  * xmlSchemaCheckGroupDefCircular only.
        !          18850:  *
        !          18851:  * Returns the particle with the circular model group definition reference,
        !          18852:  * otherwise NULL.
        !          18853:  */
        !          18854: static xmlSchemaTreeItemPtr
        !          18855: xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
        !          18856:                              xmlSchemaTreeItemPtr particle)
        !          18857: {
        !          18858:     xmlSchemaTreeItemPtr circ = NULL;
        !          18859:     xmlSchemaTreeItemPtr term;
        !          18860:     xmlSchemaModelGroupDefPtr gdef;
        !          18861: 
        !          18862:     for (; particle != NULL; particle = particle->next) {
        !          18863:        term = particle->children;
        !          18864:        if (term == NULL)
        !          18865:            continue;
        !          18866:        switch (term->type) {
        !          18867:            case XML_SCHEMA_TYPE_GROUP:
        !          18868:                gdef = (xmlSchemaModelGroupDefPtr) term;
        !          18869:                if (gdef == groupDef)
        !          18870:                    return (particle);
        !          18871:                /*
        !          18872:                * Mark this model group definition to avoid infinite
        !          18873:                * recursion on circular references not yet examined.
        !          18874:                */
        !          18875:                if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
        !          18876:                    continue;
        !          18877:                if (gdef->children != NULL) {
        !          18878:                    gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
        !          18879:                    circ = xmlSchemaGetCircModelGrDefRef(groupDef,
        !          18880:                        gdef->children->children);
        !          18881:                    gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
        !          18882:                    if (circ != NULL)
        !          18883:                        return (circ);
        !          18884:                }
        !          18885:                break;
        !          18886:            case XML_SCHEMA_TYPE_SEQUENCE:
        !          18887:            case XML_SCHEMA_TYPE_CHOICE:
        !          18888:            case XML_SCHEMA_TYPE_ALL:
        !          18889:                circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
        !          18890:                if (circ != NULL)
        !          18891:                    return (circ);
        !          18892:                break;
        !          18893:            default:
        !          18894:                break;
        !          18895:        }
        !          18896:     }
        !          18897:     return (NULL);
        !          18898: }
        !          18899: 
        !          18900: /**
        !          18901:  * xmlSchemaCheckGroupDefCircular:
        !          18902:  * @item:  the model group definition
        !          18903:  * @ctxt:  the parser context
        !          18904:  * @name:  the name
        !          18905:  *
        !          18906:  * Checks for circular references to model group definitions.
        !          18907:  */
        !          18908: static void
        !          18909: xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item,
        !          18910:                               xmlSchemaParserCtxtPtr ctxt)
        !          18911: {
        !          18912:     /*
        !          18913:     * Schema Component Constraint: Model Group Correct
        !          18914:     * 2 Circular groups are disallowed. That is, within the {particles}
        !          18915:     * of a group there must not be at any depth a particle whose {term}
        !          18916:     * is the group itself.
        !          18917:     */
        !          18918:     if ((item == NULL) ||
        !          18919:        (item->type != XML_SCHEMA_TYPE_GROUP) ||
        !          18920:        (item->children == NULL))
        !          18921:        return;
        !          18922:     {
        !          18923:        xmlSchemaTreeItemPtr circ;
        !          18924: 
        !          18925:        circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children);
        !          18926:        if (circ != NULL) {
        !          18927:            xmlChar *str = NULL;
        !          18928:            /*
        !          18929:            * TODO: The error report is not adequate: this constraint
        !          18930:            * is defined for model groups but not definitions, but since
        !          18931:            * there cannot be any circular model groups without a model group
        !          18932:            * definition (if not using a construction API), we check those
        !          18933:            * defintions only.
        !          18934:            */
        !          18935:            xmlSchemaPCustomErr(ctxt,
        !          18936:                XML_SCHEMAP_MG_PROPS_CORRECT_2,
        !          18937:                NULL, WXS_ITEM_NODE(circ),
        !          18938:                "Circular reference to the model group definition '%s' "
        !          18939:                "defined", xmlSchemaFormatQName(&str,
        !          18940:                    item->targetNamespace, item->name));
        !          18941:            FREE_AND_NULL(str)
        !          18942:            /*
        !          18943:            * NOTE: We will cut the reference to avoid further
        !          18944:            * confusion of the processor. This is a fatal error.
        !          18945:            */
        !          18946:            circ->children = NULL;
        !          18947:        }
        !          18948:     }
        !          18949: }
        !          18950: 
        !          18951: /**
        !          18952:  * xmlSchemaModelGroupToModelGroupDefFixup:
        !          18953:  * @ctxt:  the parser context
        !          18954:  * @mg:  the model group
        !          18955:  *
        !          18956:  * Assigns the model group of model group definitions to the "term"
        !          18957:  * of the referencing particle.
        !          18958:  * In xmlSchemaResolveModelGroupParticleReferences the model group
        !          18959:  * definitions were assigned to the "term", since needed for the
        !          18960:  * circularity check.
        !          18961:  *
        !          18962:  * Schema Component Constraint:
        !          18963:  *     All Group Limited (cos-all-limited) (1.2)
        !          18964:  */
        !          18965: static void
        !          18966: xmlSchemaModelGroupToModelGroupDefFixup(
        !          18967:     xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
        !          18968:     xmlSchemaModelGroupPtr mg)
        !          18969: {
        !          18970:     xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
        !          18971: 
        !          18972:     while (particle != NULL) {
        !          18973:        if ((WXS_PARTICLE_TERM(particle) == NULL) ||
        !          18974:            ((WXS_PARTICLE_TERM(particle))->type !=
        !          18975:                XML_SCHEMA_TYPE_GROUP))
        !          18976:        {
        !          18977:            particle = WXS_PTC_CAST particle->next;
        !          18978:            continue;
        !          18979:        }
        !          18980:        if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) {
        !          18981:            /*
        !          18982:            * TODO: Remove the particle.
        !          18983:            */
        !          18984:            WXS_PARTICLE_TERM(particle) = NULL;
        !          18985:            particle = WXS_PTC_CAST particle->next;
        !          18986:            continue;
        !          18987:        }
        !          18988:        /*
        !          18989:        * Assign the model group to the {term} of the particle.
        !          18990:        */
        !          18991:        WXS_PARTICLE_TERM(particle) =
        !          18992:            WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
        !          18993: 
        !          18994:        particle = WXS_PTC_CAST particle->next;
        !          18995:     }
        !          18996: }
        !          18997: 
        !          18998: /**
        !          18999:  * xmlSchemaCheckAttrGroupCircularRecur:
        !          19000:  * @ctxtGr: the searched attribute group
        !          19001:  * @attr: the current attribute list to be processed
        !          19002:  *
        !          19003:  * This one is intended to be used by
        !          19004:  * xmlSchemaCheckAttrGroupCircular only.
        !          19005:  *
        !          19006:  * Returns the circular attribute grou reference, otherwise NULL.
        !          19007:  */
        !          19008: static xmlSchemaQNameRefPtr
        !          19009: xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
        !          19010:                                     xmlSchemaItemListPtr list)
        !          19011: {
        !          19012:     xmlSchemaAttributeGroupPtr gr;
        !          19013:     xmlSchemaQNameRefPtr ref, circ;
        !          19014:     int i;
        !          19015:     /*
        !          19016:     * We will search for an attribute group reference which
        !          19017:     * references the context attribute group.
        !          19018:     */
        !          19019:     for (i = 0; i < list->nbItems; i++) {
        !          19020:        ref = list->items[i];
        !          19021:        if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
        !          19022:            (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
        !          19023:            (ref->item != NULL))
        !          19024:        {
        !          19025:            gr = WXS_ATTR_GROUP_CAST ref->item;
        !          19026:            if (gr == ctxtGr)
        !          19027:                return(ref);
        !          19028:            if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
        !          19029:                continue;
        !          19030:            /*
        !          19031:            * Mark as visited to avoid infinite recursion on
        !          19032:            * circular references not yet examined.
        !          19033:            */
        !          19034:            if ((gr->attrUses) &&
        !          19035:                (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
        !          19036:            {
        !          19037:                gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
        !          19038:                circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
        !          19039:                    (xmlSchemaItemListPtr) gr->attrUses);
        !          19040:                gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
        !          19041:                if (circ != NULL)
        !          19042:                    return (circ);
        !          19043:            }
        !          19044: 
        !          19045:        }
        !          19046:     }
        !          19047:     return (NULL);
        !          19048: }
        !          19049: 
        !          19050: /**
        !          19051:  * xmlSchemaCheckAttrGroupCircular:
        !          19052:  * attrGr:  the attribute group definition
        !          19053:  * @ctxt:  the parser context
        !          19054:  * @name:  the name
        !          19055:  *
        !          19056:  * Checks for circular references of attribute groups.
        !          19057:  */
        !          19058: static int
        !          19059: xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
        !          19060:                                xmlSchemaParserCtxtPtr ctxt)
        !          19061: {
        !          19062:     /*
        !          19063:     * Schema Representation Constraint:
        !          19064:     * Attribute Group Definition Representation OK
        !          19065:     * 3 Circular group reference is disallowed outside <redefine>.
        !          19066:     * That is, unless this element information item's parent is
        !          19067:     * <redefine>, then among the [children], if any, there must
        !          19068:     * not be an <attributeGroup> with ref [attribute] which resolves
        !          19069:     * to the component corresponding to this <attributeGroup>. Indirect
        !          19070:     * circularity is also ruled out. That is, when QName resolution
        !          19071:     * (Schema Document) (�3.15.3) is applied to a �QName� arising from
        !          19072:     * any <attributeGroup>s with a ref [attribute] among the [children],
        !          19073:     * it must not be the case that a �QName� is encountered at any depth
        !          19074:     * which resolves to the component corresponding to this <attributeGroup>.
        !          19075:     */
        !          19076:     if (attrGr->attrUses == NULL)
        !          19077:        return(0);
        !          19078:     else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
        !          19079:        return(0);
        !          19080:     else {
        !          19081:        xmlSchemaQNameRefPtr circ;
        !          19082: 
        !          19083:        circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
        !          19084:            (xmlSchemaItemListPtr) attrGr->attrUses);
        !          19085:        if (circ != NULL) {
        !          19086:            xmlChar *str = NULL;
        !          19087:            /*
        !          19088:            * TODO: Report the referenced attr group as QName.
        !          19089:            */
        !          19090:            xmlSchemaPCustomErr(ctxt,
        !          19091:                XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3,
        !          19092:                NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
        !          19093:                "Circular reference to the attribute group '%s' "
        !          19094:                "defined", xmlSchemaGetComponentQName(&str, attrGr));
        !          19095:            FREE_AND_NULL(str);
        !          19096:            /*
        !          19097:            * NOTE: We will cut the reference to avoid further
        !          19098:            * confusion of the processor.
        !          19099:            * BADSPEC TODO: The spec should define how to process in this case.
        !          19100:            */
        !          19101:            circ->item = NULL;
        !          19102:            return(ctxt->err);
        !          19103:        }
        !          19104:     }
        !          19105:     return(0);
        !          19106: }
        !          19107: 
        !          19108: static int
        !          19109: xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
        !          19110:                                  xmlSchemaAttributeGroupPtr attrGr);
        !          19111: 
        !          19112: /**
        !          19113:  * xmlSchemaExpandAttributeGroupRefs:
        !          19114:  * @pctxt: the parser context
        !          19115:  * @node: the node of the component holding the attribute uses
        !          19116:  * @completeWild: the intersected wildcard to be returned
        !          19117:  * @list: the attribute uses
        !          19118:  *
        !          19119:  * Substitutes contained attribute group references
        !          19120:  * for their attribute uses. Wilcards are intersected.
        !          19121:  * Attribute use prohibitions are removed from the list
        !          19122:  * and returned via the @prohibs list.
        !          19123:  * Pointlessness of attr. prohibs, if a matching attr. decl
        !          19124:  * is existent a well, are checked.
        !          19125:  */
        !          19126: static int
        !          19127: xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
        !          19128:                                  xmlSchemaBasicItemPtr item,
        !          19129:                                  xmlSchemaWildcardPtr *completeWild,
        !          19130:                                  xmlSchemaItemListPtr list,
        !          19131:                                  xmlSchemaItemListPtr prohibs)
        !          19132: {
        !          19133:     xmlSchemaAttributeGroupPtr gr;
        !          19134:     xmlSchemaAttributeUsePtr use;
        !          19135:     xmlSchemaItemListPtr sublist;
        !          19136:     int i, j;
        !          19137:     int created = (*completeWild == NULL) ? 0 : 1;
        !          19138: 
        !          19139:     if (prohibs)
        !          19140:        prohibs->nbItems = 0;
        !          19141: 
        !          19142:     for (i = 0; i < list->nbItems; i++) {
        !          19143:        use = list->items[i];
        !          19144: 
        !          19145:        if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
        !          19146:            if (prohibs == NULL) {
        !          19147:                PERROR_INT("xmlSchemaExpandAttributeGroupRefs",
        !          19148:                    "unexpected attr prohibition found");
        !          19149:                return(-1);
        !          19150:            }
        !          19151:            /*
        !          19152:            * Remove from attribute uses.
        !          19153:            */
        !          19154:            if (xmlSchemaItemListRemove(list, i) == -1)
        !          19155:                return(-1);
        !          19156:            i--;
        !          19157:            /*
        !          19158:            * Note that duplicate prohibitions were already
        !          19159:            * handled at parsing time.
        !          19160:            */
        !          19161:            /*
        !          19162:            * Add to list of prohibitions.
        !          19163:            */
        !          19164:            xmlSchemaItemListAddSize(prohibs, 2, use);
        !          19165:            continue;
        !          19166:        }
        !          19167:        if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
        !          19168:            ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
        !          19169:        {
        !          19170:            if ((WXS_QNAME_CAST use)->item == NULL)
        !          19171:                return(-1);
        !          19172:            gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
        !          19173:            /*
        !          19174:            * Expand the referenced attr. group.
        !          19175:            * TODO: remove this, this is done in a previous step, so
        !          19176:            * already done here.
        !          19177:            */
        !          19178:            if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
        !          19179:                if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
        !          19180:                    return(-1);
        !          19181:            }
        !          19182:            /*
        !          19183:            * Build the 'complete' wildcard; i.e. intersect multiple
        !          19184:            * wildcards.
        !          19185:            */
        !          19186:            if (gr->attributeWildcard != NULL) {
        !          19187:                if (*completeWild == NULL) {
        !          19188:                    *completeWild = gr->attributeWildcard;
        !          19189:                } else {
        !          19190:                    if (! created) {
        !          19191:                        xmlSchemaWildcardPtr tmpWild;
        !          19192: 
        !          19193:                         /*
        !          19194:                        * Copy the first encountered wildcard as context,
        !          19195:                        * except for the annotation.
        !          19196:                        *
        !          19197:                        * Although the complete wildcard might not correspond
        !          19198:                        * to any node in the schema, we will anchor it on
        !          19199:                        * the node of the owner component.
        !          19200:                        */
        !          19201:                        tmpWild =  xmlSchemaAddWildcard(pctxt, pctxt->schema,
        !          19202:                            XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
        !          19203:                            WXS_ITEM_NODE(item));
        !          19204:                        if (tmpWild == NULL)
        !          19205:                            return(-1);
        !          19206:                        if (xmlSchemaCloneWildcardNsConstraints(pctxt,
        !          19207:                            tmpWild, *completeWild) == -1)
        !          19208:                            return (-1);
        !          19209:                        tmpWild->processContents = (*completeWild)->processContents;
        !          19210:                        *completeWild = tmpWild;
        !          19211:                        created = 1;
        !          19212:                    }
        !          19213: 
        !          19214:                    if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
        !          19215:                        gr->attributeWildcard) == -1)
        !          19216:                        return(-1);
        !          19217:                }
        !          19218:            }
        !          19219:            /*
        !          19220:            * Just remove the reference if the referenced group does not
        !          19221:            * contain any attribute uses.
        !          19222:            */
        !          19223:            sublist = ((xmlSchemaItemListPtr) gr->attrUses);
        !          19224:            if ((sublist == NULL) || sublist->nbItems == 0) {
        !          19225:                if (xmlSchemaItemListRemove(list, i) == -1)
        !          19226:                    return(-1);
        !          19227:                i--;
        !          19228:                continue;
        !          19229:            }
        !          19230:            /*
        !          19231:            * Add the attribute uses.
        !          19232:            */
        !          19233:            list->items[i] = sublist->items[0];
        !          19234:            if (sublist->nbItems != 1) {
        !          19235:                for (j = 1; j < sublist->nbItems; j++) {
        !          19236:                    i++;
        !          19237:                    if (xmlSchemaItemListInsert(list,
        !          19238:                            sublist->items[j], i) == -1)
        !          19239:                        return(-1);
        !          19240:                }
        !          19241:            }
        !          19242:        }
        !          19243: 
        !          19244:     }
        !          19245:     /*
        !          19246:     * Handle pointless prohibitions of declared attributes.
        !          19247:     */
        !          19248:     if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) {
        !          19249:        xmlSchemaAttributeUseProhibPtr prohib;
        !          19250: 
        !          19251:        for (i = prohibs->nbItems -1; i >= 0; i--) {
        !          19252:            prohib = prohibs->items[i];
        !          19253:            for (j = 0; j < list->nbItems; j++) {
        !          19254:                use = list->items[j];
        !          19255: 
        !          19256:                if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
        !          19257:                    (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
        !          19258:                {
        !          19259:                    xmlChar *str = NULL;
        !          19260: 
        !          19261:                    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
        !          19262:                        XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
        !          19263:                        prohib->node, NULL,
        !          19264:                        "Skipping pointless attribute use prohibition "
        !          19265:                        "'%s', since a corresponding attribute use "
        !          19266:                        "exists already in the type definition",
        !          19267:                        xmlSchemaFormatQName(&str,
        !          19268:                            prohib->targetNamespace, prohib->name),
        !          19269:                        NULL, NULL);
        !          19270:                    FREE_AND_NULL(str);
        !          19271:                    /*
        !          19272:                    * Remove the prohibition.
        !          19273:                    */
        !          19274:                    if (xmlSchemaItemListRemove(prohibs, i) == -1)
        !          19275:                        return(-1);
        !          19276:                    break;
        !          19277:                }
        !          19278:            }
        !          19279:        }
        !          19280:     }
        !          19281:     return(0);
        !          19282: }
        !          19283: 
        !          19284: /**
        !          19285:  * xmlSchemaAttributeGroupExpandRefs:
        !          19286:  * @pctxt:  the parser context
        !          19287:  * @attrGr:  the attribute group definition
        !          19288:  *
        !          19289:  * Computation of:
        !          19290:  * {attribute uses} property
        !          19291:  * {attribute wildcard} property
        !          19292:  *
        !          19293:  * Substitutes contained attribute group references
        !          19294:  * for their attribute uses. Wilcards are intersected.
        !          19295:  */
        !          19296: static int
        !          19297: xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
        !          19298:                                  xmlSchemaAttributeGroupPtr attrGr)
        !          19299: {
        !          19300:     if ((attrGr->attrUses == NULL) ||
        !          19301:        (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
        !          19302:        return(0);
        !          19303: 
        !          19304:     attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
        !          19305:     if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
        !          19306:        &(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1)
        !          19307:        return(-1);
        !          19308:     return(0);
        !          19309: }
        !          19310: 
        !          19311: /**
        !          19312:  * xmlSchemaAttributeGroupExpandRefs:
        !          19313:  * @pctxt:  the parser context
        !          19314:  * @attrGr:  the attribute group definition
        !          19315:  *
        !          19316:  * Substitutes contained attribute group references
        !          19317:  * for their attribute uses. Wilcards are intersected.
        !          19318:  *
        !          19319:  * Schema Component Constraint:
        !          19320:  *    Attribute Group Definition Properties Correct (ag-props-correct)
        !          19321:  */
        !          19322: static int
        !          19323: xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
        !          19324:                                  xmlSchemaAttributeGroupPtr attrGr)
        !          19325: {
        !          19326:     /*
        !          19327:     * SPEC ag-props-correct
        !          19328:     * (1) "The values of the properties of an attribute group definition
        !          19329:     * must be as described in the property tableau in The Attribute
        !          19330:     * Group Definition Schema Component (�3.6.1), modulo the impact of
        !          19331:     * Missing Sub-components (�5.3);"
        !          19332:     */
        !          19333: 
        !          19334:     if ((attrGr->attrUses != NULL) &&
        !          19335:        (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
        !          19336:     {
        !          19337:        xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
        !          19338:        xmlSchemaAttributeUsePtr use, tmp;
        !          19339:        int i, j, hasId = 0;
        !          19340: 
        !          19341:        for (i = uses->nbItems -1; i >= 0; i--) {
        !          19342:            use = uses->items[i];
        !          19343:            /*
        !          19344:            * SPEC ag-props-correct
        !          19345:            * (2) "Two distinct members of the {attribute uses} must not have
        !          19346:            * {attribute declaration}s both of whose {name}s match and whose
        !          19347:            * {target namespace}s are identical."
        !          19348:            */
        !          19349:            if (i > 0) {
        !          19350:                for (j = i -1; j >= 0; j--) {
        !          19351:                    tmp = uses->items[j];
        !          19352:                    if ((WXS_ATTRUSE_DECL_NAME(use) ==
        !          19353:                        WXS_ATTRUSE_DECL_NAME(tmp)) &&
        !          19354:                        (WXS_ATTRUSE_DECL_TNS(use) ==
        !          19355:                        WXS_ATTRUSE_DECL_TNS(tmp)))
        !          19356:                    {
        !          19357:                        xmlChar *str = NULL;
        !          19358: 
        !          19359:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          19360:                            XML_SCHEMAP_AG_PROPS_CORRECT,
        !          19361:                            attrGr->node, WXS_BASIC_CAST attrGr,
        !          19362:                            "Duplicate %s",
        !          19363:                            xmlSchemaGetComponentDesignation(&str, use),
        !          19364:                            NULL);
        !          19365:                        FREE_AND_NULL(str);
        !          19366:                        /*
        !          19367:                        * Remove the duplicate.
        !          19368:                        */
        !          19369:                        if (xmlSchemaItemListRemove(uses, i) == -1)
        !          19370:                            return(-1);
        !          19371:                        goto next_use;
        !          19372:                    }
        !          19373:                }
        !          19374:            }
        !          19375:            /*
        !          19376:            * SPEC ag-props-correct
        !          19377:            * (3) "Two distinct members of the {attribute uses} must not have
        !          19378:            * {attribute declaration}s both of whose {type definition}s are or
        !          19379:            * are derived from ID."
        !          19380:            * TODO: Does 'derived' include member-types of unions?
        !          19381:            */
        !          19382:            if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
        !          19383:                if (xmlSchemaIsDerivedFromBuiltInType(
        !          19384:                    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
        !          19385:                {
        !          19386:                    if (hasId) {
        !          19387:                        xmlChar *str = NULL;
        !          19388: 
        !          19389:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          19390:                            XML_SCHEMAP_AG_PROPS_CORRECT,
        !          19391:                            attrGr->node, WXS_BASIC_CAST attrGr,
        !          19392:                            "There must not exist more than one attribute "
        !          19393:                            "declaration of type 'xs:ID' "
        !          19394:                            "(or derived from 'xs:ID'). The %s violates this "
        !          19395:                            "constraint",
        !          19396:                            xmlSchemaGetComponentDesignation(&str, use),
        !          19397:                            NULL);
        !          19398:                        FREE_AND_NULL(str);
        !          19399:                        if (xmlSchemaItemListRemove(uses, i) == -1)
        !          19400:                            return(-1);
        !          19401:                    }
        !          19402:                    hasId = 1;
        !          19403:                }
        !          19404:            }
        !          19405: next_use: {}
        !          19406:        }
        !          19407:     }
        !          19408:     return(0);
        !          19409: }
        !          19410: 
        !          19411: /**
        !          19412:  * xmlSchemaResolveAttrGroupReferences:
        !          19413:  * @attrgrpDecl:  the schema attribute definition
        !          19414:  * @ctxt:  the schema parser context
        !          19415:  * @name:  the attribute name
        !          19416:  *
        !          19417:  * Resolves references to attribute group definitions.
        !          19418:  */
        !          19419: static int
        !          19420: xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref,
        !          19421:                                    xmlSchemaParserCtxtPtr ctxt)
        !          19422: {
        !          19423:     xmlSchemaAttributeGroupPtr group;
        !          19424: 
        !          19425:     if (ref->item != NULL)
        !          19426:         return(0);
        !          19427:     group = xmlSchemaGetAttributeGroup(ctxt->schema,
        !          19428:        ref->name,
        !          19429:        ref->targetNamespace);
        !          19430:     if (group == NULL) {
        !          19431:        xmlSchemaPResCompAttrErr(ctxt,
        !          19432:            XML_SCHEMAP_SRC_RESOLVE,
        !          19433:            NULL, ref->node,
        !          19434:            "ref", ref->name, ref->targetNamespace,
        !          19435:            ref->itemType, NULL);
        !          19436:        return(ctxt->err);
        !          19437:     }
        !          19438:     ref->item = WXS_BASIC_CAST group;
        !          19439:     return(0);
        !          19440: }
        !          19441: 
        !          19442: /**
        !          19443:  * xmlSchemaCheckAttrPropsCorrect:
        !          19444:  * @item:  an schema attribute declaration/use
        !          19445:  * @ctxt:  a schema parser context
        !          19446:  * @name:  the name of the attribute
        !          19447:  *
        !          19448:  *
        !          19449:  * Schema Component Constraint:
        !          19450:  *    Attribute Declaration Properties Correct (a-props-correct)
        !          19451:  *
        !          19452:  * Validates the value constraints of an attribute declaration/use.
        !          19453:  * NOTE that this needs the simle type definitions to be already
        !          19454:  *   builded and checked.
        !          19455:  */
        !          19456: static int
        !          19457: xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
        !          19458:                               xmlSchemaAttributePtr attr)
        !          19459: {
        !          19460: 
        !          19461:     /*
        !          19462:     * SPEC a-props-correct (1)
        !          19463:     * "The values of the properties of an attribute declaration must
        !          19464:     * be as described in the property tableau in The Attribute
        !          19465:     * Declaration Schema Component (�3.2.1), modulo the impact of
        !          19466:     * Missing Sub-components (�5.3)."
        !          19467:     */
        !          19468: 
        !          19469:     if (WXS_ATTR_TYPEDEF(attr) == NULL)
        !          19470:        return(0);
        !          19471: 
        !          19472:     if (attr->defValue != NULL) {
        !          19473:        int ret;
        !          19474: 
        !          19475:        /*
        !          19476:        * SPEC a-props-correct (3)
        !          19477:        * "If the {type definition} is or is derived from ID then there
        !          19478:        * must not be a {value constraint}."
        !          19479:        */
        !          19480:        if (xmlSchemaIsDerivedFromBuiltInType(
        !          19481:            WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID))
        !          19482:        {
        !          19483:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          19484:                XML_SCHEMAP_A_PROPS_CORRECT_3,
        !          19485:                NULL, WXS_BASIC_CAST attr,
        !          19486:                "Value constraints are not allowed if the type definition "
        !          19487:                "is or is derived from xs:ID",
        !          19488:                NULL, NULL);
        !          19489:            return(pctxt->err);
        !          19490:        }
        !          19491:        /*
        !          19492:        * SPEC a-props-correct (2)
        !          19493:        * "if there is a {value constraint}, the canonical lexical
        !          19494:        * representation of its value must be �valid� with respect
        !          19495:        * to the {type definition} as defined in String Valid (�3.14.4)."
        !          19496:        * TODO: Don't care about the *cononical* stuff here, this requirement
        !          19497:        * will be removed in WXS 1.1 anyway.
        !          19498:        */
        !          19499:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
        !          19500:            attr->node, WXS_ATTR_TYPEDEF(attr),
        !          19501:            attr->defValue, &(attr->defVal),
        !          19502:            1, 1, 0);
        !          19503:        if (ret != 0) {
        !          19504:            if (ret < 0) {
        !          19505:                PERROR_INT("xmlSchemaCheckAttrPropsCorrect",
        !          19506:                    "calling xmlSchemaVCheckCVCSimpleType()");
        !          19507:                return(-1);
        !          19508:            }
        !          19509:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          19510:                XML_SCHEMAP_A_PROPS_CORRECT_2,
        !          19511:                NULL, WXS_BASIC_CAST attr,
        !          19512:                "The value of the value constraint is not valid",
        !          19513:                NULL, NULL);
        !          19514:            return(pctxt->err);
        !          19515:        }
        !          19516:     }
        !          19517: 
        !          19518:     return(0);
        !          19519: }
        !          19520: 
        !          19521: static xmlSchemaElementPtr
        !          19522: xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
        !          19523:                                 xmlSchemaElementPtr ancestor)
        !          19524: {
        !          19525:     xmlSchemaElementPtr ret;
        !          19526: 
        !          19527:     if (WXS_SUBST_HEAD(ancestor) == NULL)
        !          19528:        return (NULL);
        !          19529:     if (WXS_SUBST_HEAD(ancestor) == elemDecl)
        !          19530:        return (ancestor);
        !          19531: 
        !          19532:     if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR)
        !          19533:        return (NULL);
        !          19534:     WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
        !          19535:     ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
        !          19536:        WXS_SUBST_HEAD(ancestor));
        !          19537:     WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
        !          19538: 
        !          19539:     return (ret);
        !          19540: }
        !          19541: 
        !          19542: /**
        !          19543:  * xmlSchemaCheckElemPropsCorrect:
        !          19544:  * @ctxt:  a schema parser context
        !          19545:  * @decl: the element declaration
        !          19546:  * @name:  the name of the attribute
        !          19547:  *
        !          19548:  * Schema Component Constraint:
        !          19549:  * Element Declaration Properties Correct (e-props-correct)
        !          19550:  *
        !          19551:  * STATUS:
        !          19552:  *   missing: (6)
        !          19553:  */
        !          19554: static int
        !          19555: xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
        !          19556:                               xmlSchemaElementPtr elemDecl)
        !          19557: {
        !          19558:     int ret = 0;
        !          19559:     xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
        !          19560:     /*
        !          19561:     * SPEC (1) "The values of the properties of an element declaration
        !          19562:     * must be as described in the property tableau in The Element
        !          19563:     * Declaration Schema Component (�3.3.1), modulo the impact of Missing
        !          19564:     * Sub-components (�5.3)."
        !          19565:     */
        !          19566:     if (WXS_SUBST_HEAD(elemDecl) != NULL) {
        !          19567:        xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ;
        !          19568: 
        !          19569:        xmlSchemaCheckElementDeclComponent(head, pctxt);
        !          19570:        /*
        !          19571:        * SPEC (3) "If there is a non-�absent� {substitution group
        !          19572:        * affiliation}, then {scope} must be global."
        !          19573:        */
        !          19574:        if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
        !          19575:            xmlSchemaPCustomErr(pctxt,
        !          19576:                XML_SCHEMAP_E_PROPS_CORRECT_3,
        !          19577:                WXS_BASIC_CAST elemDecl, NULL,
        !          19578:                "Only global element declarations can have a "
        !          19579:                "substitution group affiliation", NULL);
        !          19580:            ret = XML_SCHEMAP_E_PROPS_CORRECT_3;
        !          19581:        }
        !          19582:        /*
        !          19583:        * TODO: SPEC (6) "Circular substitution groups are disallowed.
        !          19584:        * That is, it must not be possible to return to an element declaration
        !          19585:        * by repeatedly following the {substitution group affiliation}
        !          19586:        * property."
        !          19587:        */
        !          19588:        if (head == elemDecl)
        !          19589:            circ = head;
        !          19590:        else if (WXS_SUBST_HEAD(head) != NULL)
        !          19591:            circ = xmlSchemaCheckSubstGroupCircular(head, head);
        !          19592:        else
        !          19593:            circ = NULL;
        !          19594:        if (circ != NULL) {
        !          19595:            xmlChar *strA = NULL, *strB = NULL;
        !          19596: 
        !          19597:            xmlSchemaPCustomErrExt(pctxt,
        !          19598:                XML_SCHEMAP_E_PROPS_CORRECT_6,
        !          19599:                WXS_BASIC_CAST circ, NULL,
        !          19600:                "The element declaration '%s' defines a circular "
        !          19601:                "substitution group to element declaration '%s'",
        !          19602:                xmlSchemaGetComponentQName(&strA, circ),
        !          19603:                xmlSchemaGetComponentQName(&strB, head),
        !          19604:                NULL);
        !          19605:            FREE_AND_NULL(strA)
        !          19606:            FREE_AND_NULL(strB)
        !          19607:            ret = XML_SCHEMAP_E_PROPS_CORRECT_6;
        !          19608:        }
        !          19609:        /*
        !          19610:        * SPEC (4) "If there is a {substitution group affiliation},
        !          19611:        * the {type definition}
        !          19612:        * of the element declaration must be validly derived from the {type
        !          19613:        * definition} of the {substitution group affiliation}, given the value
        !          19614:        * of the {substitution group exclusions} of the {substitution group
        !          19615:        * affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6)
        !          19616:        * (if the {type definition} is complex) or as defined in
        !          19617:        * Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is
        !          19618:        * simple)."
        !          19619:        *
        !          19620:        * NOTE: {substitution group exclusions} means the values of the
        !          19621:        * attribute "final".
        !          19622:        */
        !          19623: 
        !          19624:        if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
        !          19625:            int set = 0;
        !          19626: 
        !          19627:            if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
        !          19628:                set |= SUBSET_EXTENSION;
        !          19629:            if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
        !          19630:                set |= SUBSET_RESTRICTION;
        !          19631: 
        !          19632:            if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
        !          19633:                WXS_ELEM_TYPEDEF(head), set) != 0) {
        !          19634:                xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
        !          19635: 
        !          19636:                ret = XML_SCHEMAP_E_PROPS_CORRECT_4;
        !          19637:                xmlSchemaPCustomErrExt(pctxt,
        !          19638:                    XML_SCHEMAP_E_PROPS_CORRECT_4,
        !          19639:                    WXS_BASIC_CAST elemDecl, NULL,
        !          19640:                    "The type definition '%s' was "
        !          19641:                    "either rejected by the substitution group "
        !          19642:                    "affiliation '%s', or not validly derived from its type "
        !          19643:                    "definition '%s'",
        !          19644:                    xmlSchemaGetComponentQName(&strA, typeDef),
        !          19645:                    xmlSchemaGetComponentQName(&strB, head),
        !          19646:                    xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head)));
        !          19647:                FREE_AND_NULL(strA)
        !          19648:                FREE_AND_NULL(strB)
        !          19649:                FREE_AND_NULL(strC)
        !          19650:            }
        !          19651:        }
        !          19652:     }
        !          19653:     /*
        !          19654:     * SPEC (5) "If the {type definition} or {type definition}'s
        !          19655:     * {content type}
        !          19656:     * is or is derived from ID then there must not be a {value constraint}.
        !          19657:     * Note: The use of ID as a type definition for elements goes beyond
        !          19658:     * XML 1.0, and should be avoided if backwards compatibility is desired"
        !          19659:     */
        !          19660:     if ((elemDecl->value != NULL) &&
        !          19661:        ((WXS_IS_SIMPLE(typeDef) &&
        !          19662:          xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
        !          19663:         (WXS_IS_COMPLEX(typeDef) &&
        !          19664:          WXS_HAS_SIMPLE_CONTENT(typeDef) &&
        !          19665:          xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
        !          19666:            XML_SCHEMAS_ID)))) {
        !          19667: 
        !          19668:        ret = XML_SCHEMAP_E_PROPS_CORRECT_5;
        !          19669:        xmlSchemaPCustomErr(pctxt,
        !          19670:            XML_SCHEMAP_E_PROPS_CORRECT_5,
        !          19671:            WXS_BASIC_CAST elemDecl, NULL,
        !          19672:            "The type definition (or type definition's content type) is or "
        !          19673:            "is derived from ID; value constraints are not allowed in "
        !          19674:            "conjunction with such a type definition", NULL);
        !          19675:     } else if (elemDecl->value != NULL) {
        !          19676:        int vcret;
        !          19677:        xmlNodePtr node = NULL;
        !          19678: 
        !          19679:        /*
        !          19680:        * SPEC (2) "If there is a {value constraint}, the canonical lexical
        !          19681:        * representation of its value must be �valid� with respect to the
        !          19682:        * {type definition} as defined in Element Default Valid (Immediate)
        !          19683:        * (�3.3.6)."
        !          19684:        */
        !          19685:        if (typeDef == NULL) {
        !          19686:            xmlSchemaPErr(pctxt, elemDecl->node,
        !          19687:                XML_SCHEMAP_INTERNAL,
        !          19688:                "Internal error: xmlSchemaCheckElemPropsCorrect, "
        !          19689:                "type is missing... skipping validation of "
        !          19690:                "the value constraint", NULL, NULL);
        !          19691:            return (-1);
        !          19692:        }
        !          19693:        if (elemDecl->node != NULL) {
        !          19694:            if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
        !          19695:                node = (xmlNodePtr) xmlHasProp(elemDecl->node,
        !          19696:                    BAD_CAST "fixed");
        !          19697:            else
        !          19698:                node = (xmlNodePtr) xmlHasProp(elemDecl->node,
        !          19699:                    BAD_CAST "default");
        !          19700:        }
        !          19701:        vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node,
        !          19702:            typeDef, elemDecl->value, &(elemDecl->defVal));
        !          19703:        if (vcret != 0) {
        !          19704:            if (vcret < 0) {
        !          19705:                PERROR_INT("xmlSchemaElemCheckValConstr",
        !          19706:                    "failed to validate the value constraint of an "
        !          19707:                    "element declaration");
        !          19708:                return (-1);
        !          19709:            }
        !          19710:            return (vcret);
        !          19711:        }
        !          19712:     }
        !          19713: 
        !          19714:     return (ret);
        !          19715: }
        !          19716: 
        !          19717: /**
        !          19718:  * xmlSchemaCheckElemSubstGroup:
        !          19719:  * @ctxt:  a schema parser context
        !          19720:  * @decl: the element declaration
        !          19721:  * @name:  the name of the attribute
        !          19722:  *
        !          19723:  * Schema Component Constraint:
        !          19724:  * Substitution Group (cos-equiv-class)
        !          19725:  *
        !          19726:  * In Libxml2 the subst. groups will be precomputed, in terms of that
        !          19727:  * a list will be built for each subst. group head, holding all direct
        !          19728:  * referents to this head.
        !          19729:  * NOTE that this function needs:
        !          19730:  *   1. circular subst. groups to be checked beforehand
        !          19731:  *   2. the declaration's type to be derived from the head's type
        !          19732:  *
        !          19733:  * STATUS:
        !          19734:  *
        !          19735:  */
        !          19736: static void
        !          19737: xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
        !          19738:                             xmlSchemaElementPtr elemDecl)
        !          19739: {
        !          19740:     if ((WXS_SUBST_HEAD(elemDecl) == NULL) ||
        !          19741:        /* SPEC (1) "Its {abstract} is false." */
        !          19742:        (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
        !          19743:        return;
        !          19744:     {
        !          19745:        xmlSchemaElementPtr head;
        !          19746:        xmlSchemaTypePtr headType, type;
        !          19747:        int set, methSet;
        !          19748:        /*
        !          19749:        * SPEC (2) "It is validly substitutable for HEAD subject to HEAD's
        !          19750:        * {disallowed substitutions} as the blocking constraint, as defined in
        !          19751:        * Substitution Group OK (Transitive) (�3.3.6)."
        !          19752:        */
        !          19753:        for (head = WXS_SUBST_HEAD(elemDecl); head != NULL;
        !          19754:            head = WXS_SUBST_HEAD(head)) {
        !          19755:            set = 0;
        !          19756:            methSet = 0;
        !          19757:            /*
        !          19758:            * The blocking constraints.
        !          19759:            */
        !          19760:            if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
        !          19761:                continue;
        !          19762:            headType = head->subtypes;
        !          19763:            type = elemDecl->subtypes;
        !          19764:            if (headType == type)
        !          19765:                goto add_member;
        !          19766:            if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
        !          19767:                set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
        !          19768:            if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
        !          19769:                set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
        !          19770:            /*
        !          19771:            * SPEC: Substitution Group OK (Transitive) (2.3)
        !          19772:            * "The set of all {derivation method}s involved in the
        !          19773:            * derivation of D's {type definition} from C's {type definition}
        !          19774:            * does not intersect with the union of the blocking constraint,
        !          19775:            * C's {prohibited substitutions} (if C is complex, otherwise the
        !          19776:            * empty set) and the {prohibited substitutions} (respectively the
        !          19777:            * empty set) of any intermediate {type definition}s in the
        !          19778:            * derivation of D's {type definition} from C's {type definition}."
        !          19779:            */
        !          19780:            /*
        !          19781:            * OPTIMIZE TODO: Optimize this a bit, since, if traversing the
        !          19782:            * subst.head axis, the methSet does not need to be computed for
        !          19783:            * the full depth over and over.
        !          19784:            */
        !          19785:            /*
        !          19786:            * The set of all {derivation method}s involved in the derivation
        !          19787:            */
        !          19788:            while ((type != NULL) && (type != headType)) {
        !          19789:                if ((WXS_IS_EXTENSION(type)) &&
        !          19790:                    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
        !          19791:                    methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
        !          19792: 
        !          19793:                if (WXS_IS_RESTRICTION(type) &&
        !          19794:                    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
        !          19795:                    methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
        !          19796: 
        !          19797:                type = type->baseType;
        !          19798:            }
        !          19799:            /*
        !          19800:            * The {prohibited substitutions} of all intermediate types +
        !          19801:            * the head's type.
        !          19802:            */
        !          19803:            type = elemDecl->subtypes->baseType;
        !          19804:            while (type != NULL) {
        !          19805:                if (WXS_IS_COMPLEX(type)) {
        !          19806:                    if ((type->flags &
        !          19807:                            XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
        !          19808:                        ((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
        !          19809:                    set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
        !          19810:                    if ((type->flags &
        !          19811:                            XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
        !          19812:                        ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
        !          19813:                    set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
        !          19814:                } else
        !          19815:                    break;
        !          19816:                if (type == headType)
        !          19817:                    break;
        !          19818:                type = type->baseType;
        !          19819:            }
        !          19820:            if ((set != 0) &&
        !          19821:                (((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
        !          19822:                (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
        !          19823:                ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
        !          19824:                (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
        !          19825:                continue;
        !          19826:            }
        !          19827: add_member:
        !          19828:            xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl);
        !          19829:            if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
        !          19830:                head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
        !          19831:        }
        !          19832:     }
        !          19833: }
        !          19834: 
        !          19835: #ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */
        !          19836: /**
        !          19837:  * xmlSchemaCheckElementDeclComponent
        !          19838:  * @pctxt: the schema parser context
        !          19839:  * @ctxtComponent: the context component (an element declaration)
        !          19840:  * @ctxtParticle: the first particle of the context component
        !          19841:  * @searchParticle: the element declaration particle to be analysed
        !          19842:  *
        !          19843:  * Schema Component Constraint: Element Declarations Consistent
        !          19844:  */
        !          19845: static int
        !          19846: xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
        !          19847:                                    xmlSchemaBasicItemPtr ctxtComponent,
        !          19848:                                    xmlSchemaParticlePtr ctxtParticle,
        !          19849:                                    xmlSchemaParticlePtr searchParticle,
        !          19850:                                    xmlSchemaParticlePtr curParticle,
        !          19851:                                    int search)
        !          19852: {
        !          19853:     return(0);
        !          19854: 
        !          19855:     int ret = 0;
        !          19856:     xmlSchemaParticlePtr cur = curParticle;
        !          19857:     if (curParticle == NULL) {
        !          19858:        return(0);
        !          19859:     }
        !          19860:     if (WXS_PARTICLE_TERM(curParticle) == NULL) {
        !          19861:        /*
        !          19862:        * Just return in this case. A missing "term" of the particle
        !          19863:        * might arise due to an invalid "term" component.
        !          19864:        */
        !          19865:        return(0);
        !          19866:     }
        !          19867:     while (cur != NULL) {
        !          19868:        switch (WXS_PARTICLE_TERM(cur)->type) {
        !          19869:            case XML_SCHEMA_TYPE_ANY:
        !          19870:                break;
        !          19871:            case XML_SCHEMA_TYPE_ELEMENT:
        !          19872:                if (search == 0) {
        !          19873:                    ret = xmlSchemaCheckElementDeclConsistent(pctxt,
        !          19874:                        ctxtComponent, ctxtParticle, cur, ctxtParticle, 1);
        !          19875:                    if (ret != 0)
        !          19876:                        return(ret);
        !          19877:                } else {
        !          19878:                    xmlSchemaElementPtr elem =
        !          19879:                        WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur));
        !          19880:                    /*
        !          19881:                    * SPEC Element Declarations Consistent:
        !          19882:                    * "If the {particles} contains, either directly,
        !          19883:                    * indirectly (that is, within the {particles} of a
        !          19884:                    * contained model group, recursively) or �implicitly�
        !          19885:                    * two or more element declaration particles with
        !          19886:                    * the same {name} and {target namespace}, then
        !          19887:                    * all their type definitions must be the same
        !          19888:                    * top-level definition [...]"
        !          19889:                    */
        !          19890:                    if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name,
        !          19891:                            WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) &&
        !          19892:                        xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
        !          19893:                            WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
        !          19894:                    {
        !          19895:                        xmlChar *strA = NULL, *strB = NULL;
        !          19896: 
        !          19897:                        xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          19898:                            /* TODO: error code */
        !          19899:                            XML_SCHEMAP_COS_NONAMBIG,
        !          19900:                            WXS_ITEM_NODE(cur), NULL,
        !          19901:                            "In the content model of %s, there are multiple "
        !          19902:                            "element declarations for '%s' with different "
        !          19903:                            "type definitions",
        !          19904:                            xmlSchemaGetComponentDesignation(&strA,
        !          19905:                                ctxtComponent),
        !          19906:                            xmlSchemaFormatQName(&strB,
        !          19907:                                WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
        !          19908:                                WXS_PARTICLE_TERM_AS_ELEM(cur)->name));
        !          19909:                        FREE_AND_NULL(strA);
        !          19910:                        FREE_AND_NULL(strB);
        !          19911:                        return(XML_SCHEMAP_COS_NONAMBIG);
        !          19912:                    }
        !          19913:                }
        !          19914:                break;
        !          19915:            case XML_SCHEMA_TYPE_SEQUENCE: {
        !          19916:                break;
        !          19917:                }
        !          19918:            case XML_SCHEMA_TYPE_CHOICE:{
        !          19919:                /*
        !          19920:                xmlSchemaTreeItemPtr sub;
        !          19921: 
        !          19922:                sub = WXS_PARTICLE_TERM(particle)->children;  (xmlSchemaParticlePtr)
        !          19923:                while (sub != NULL) {
        !          19924:                    ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent,
        !          19925:                        ctxtParticle, ctxtElem);
        !          19926:                    if (ret != 0)
        !          19927:                        return(ret);
        !          19928:                    sub = sub->next;
        !          19929:                }
        !          19930:                */
        !          19931:                break;
        !          19932:                }
        !          19933:            case XML_SCHEMA_TYPE_ALL:
        !          19934:                break;
        !          19935:            case XML_SCHEMA_TYPE_GROUP:
        !          19936:                break;
        !          19937:            default:
        !          19938:                xmlSchemaInternalErr2(ACTXT_CAST pctxt,
        !          19939:                    "xmlSchemaCheckElementDeclConsistent",
        !          19940:                    "found unexpected term of type '%s' in content model",
        !          19941:                    WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL);
        !          19942:                return(-1);
        !          19943:        }
        !          19944:        cur = (xmlSchemaParticlePtr) cur->next;
        !          19945:     }
        !          19946: 
        !          19947: exit:
        !          19948:     return(ret);
        !          19949: }
        !          19950: #endif
        !          19951: 
        !          19952: /**
        !          19953:  * xmlSchemaCheckElementDeclComponent
        !          19954:  * @item:  an schema element declaration/particle
        !          19955:  * @ctxt:  a schema parser context
        !          19956:  * @name:  the name of the attribute
        !          19957:  *
        !          19958:  * Validates the value constraints of an element declaration.
        !          19959:  * Adds substitution group members.
        !          19960:  */
        !          19961: static void
        !          19962: xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
        !          19963:                                   xmlSchemaParserCtxtPtr ctxt)
        !          19964: {
        !          19965:     if (elemDecl == NULL)
        !          19966:        return;
        !          19967:     if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
        !          19968:        return;
        !          19969:     elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
        !          19970:     if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
        !          19971:        /*
        !          19972:        * Adds substitution group members.
        !          19973:        */
        !          19974:        xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
        !          19975:     }
        !          19976: }
        !          19977: 
        !          19978: /**
        !          19979:  * xmlSchemaResolveModelGroupParticleReferences:
        !          19980:  * @particle:  a particle component
        !          19981:  * @ctxt:  a parser context
        !          19982:  *
        !          19983:  * Resolves references of a model group's {particles} to
        !          19984:  * model group definitions and to element declarations.
        !          19985:  */
        !          19986: static void
        !          19987: xmlSchemaResolveModelGroupParticleReferences(
        !          19988:     xmlSchemaParserCtxtPtr ctxt,
        !          19989:     xmlSchemaModelGroupPtr mg)
        !          19990: {
        !          19991:     xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
        !          19992:     xmlSchemaQNameRefPtr ref;
        !          19993:     xmlSchemaBasicItemPtr refItem;
        !          19994: 
        !          19995:     /*
        !          19996:     * URGENT TODO: Test this.
        !          19997:     */
        !          19998:     while (particle != NULL) {
        !          19999:        if ((WXS_PARTICLE_TERM(particle) == NULL) ||
        !          20000:            ((WXS_PARTICLE_TERM(particle))->type !=
        !          20001:                XML_SCHEMA_EXTRA_QNAMEREF))
        !          20002:        {
        !          20003:            goto next_particle;
        !          20004:        }
        !          20005:        ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
        !          20006:        /*
        !          20007:        * Resolve the reference.
        !          20008:        * NULL the {term} by default.
        !          20009:        */
        !          20010:        particle->children = NULL;
        !          20011: 
        !          20012:        refItem = xmlSchemaGetNamedComponent(ctxt->schema,
        !          20013:            ref->itemType, ref->name, ref->targetNamespace);
        !          20014:        if (refItem == NULL) {
        !          20015:            xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
        !          20016:                NULL, WXS_ITEM_NODE(particle), "ref", ref->name,
        !          20017:                ref->targetNamespace, ref->itemType, NULL);
        !          20018:            /* TODO: remove the particle. */
        !          20019:            goto next_particle;
        !          20020:        }
        !          20021:        if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
        !          20022:            if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL)
        !          20023:                /* TODO: remove the particle. */
        !          20024:                goto next_particle;
        !          20025:            /*
        !          20026:            * NOTE that we will assign the model group definition
        !          20027:            * itself to the "term" of the particle. This will ease
        !          20028:            * the check for circular model group definitions. After
        !          20029:            * that the "term" will be assigned the model group of the
        !          20030:            * model group definition.
        !          20031:            */
        !          20032:            if ((WXS_MODELGROUPDEF_MODEL(refItem))->type ==
        !          20033:                    XML_SCHEMA_TYPE_ALL) {
        !          20034:                /*
        !          20035:                * SPEC cos-all-limited (1)
        !          20036:                * SPEC cos-all-limited (1.2)
        !          20037:                * "It appears only as the value of one or both of the
        !          20038:                * following properties:"
        !          20039:                * (1.1) "the {model group} property of a model group
        !          20040:                *        definition."
        !          20041:                * (1.2) "the {term} property of a particle [... of] the "
        !          20042:                * {content type} of a complex type definition."
        !          20043:                */
        !          20044:                xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          20045:                    /* TODO: error code */
        !          20046:                    XML_SCHEMAP_COS_ALL_LIMITED,
        !          20047:                    WXS_ITEM_NODE(particle), NULL,
        !          20048:                    "A model group definition is referenced, but "
        !          20049:                    "it contains an 'all' model group, which "
        !          20050:                    "cannot be contained by model groups",
        !          20051:                    NULL, NULL);
        !          20052:                /* TODO: remove the particle. */
        !          20053:                goto next_particle;
        !          20054:            }
        !          20055:            particle->children = (xmlSchemaTreeItemPtr) refItem;
        !          20056:        } else {
        !          20057:            /*
        !          20058:            * TODO: Are referenced element declarations the only
        !          20059:            * other components we expect here?
        !          20060:            */
        !          20061:            particle->children = (xmlSchemaTreeItemPtr) refItem;
        !          20062:        }
        !          20063: next_particle:
        !          20064:        particle = WXS_PTC_CAST particle->next;
        !          20065:     }
        !          20066: }
        !          20067: 
        !          20068: static int
        !          20069: xmlSchemaAreValuesEqual(xmlSchemaValPtr x,
        !          20070:                       xmlSchemaValPtr y)
        !          20071: {
        !          20072:     xmlSchemaTypePtr tx, ty, ptx, pty;
        !          20073:     int ret;
        !          20074: 
        !          20075:     while (x != NULL) {
        !          20076:        /* Same types. */
        !          20077:        tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x));
        !          20078:        ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y));
        !          20079:        ptx = xmlSchemaGetPrimitiveType(tx);
        !          20080:        pty = xmlSchemaGetPrimitiveType(ty);
        !          20081:        /*
        !          20082:        * (1) if a datatype T' is �derived� by �restriction� from an
        !          20083:        * atomic datatype T then the �value space� of T' is a subset of
        !          20084:        * the �value space� of T. */
        !          20085:        /*
        !          20086:        * (2) if datatypes T' and T'' are �derived� by �restriction�
        !          20087:        * from a common atomic ancestor T then the �value space�s of T'
        !          20088:        * and T'' may overlap.
        !          20089:        */
        !          20090:        if (ptx != pty)
        !          20091:            return(0);
        !          20092:        /*
        !          20093:        * We assume computed values to be normalized, so do a fast
        !          20094:        * string comparison for string based types.
        !          20095:        */
        !          20096:        if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
        !          20097:            WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
        !          20098:            if (! xmlStrEqual(
        !          20099:                xmlSchemaValueGetAsString(x),
        !          20100:                xmlSchemaValueGetAsString(y)))
        !          20101:                return (0);
        !          20102:        } else {
        !          20103:            ret = xmlSchemaCompareValuesWhtsp(
        !          20104:                x, XML_SCHEMA_WHITESPACE_PRESERVE,
        !          20105:                y, XML_SCHEMA_WHITESPACE_PRESERVE);
        !          20106:            if (ret == -2)
        !          20107:                return(-1);
        !          20108:            if (ret != 0)
        !          20109:                return(0);
        !          20110:        }
        !          20111:        /*
        !          20112:        * Lists.
        !          20113:        */
        !          20114:        x = xmlSchemaValueGetNext(x);
        !          20115:        if (x != NULL) {
        !          20116:            y = xmlSchemaValueGetNext(y);
        !          20117:            if (y == NULL)
        !          20118:                return (0);
        !          20119:        } else if (xmlSchemaValueGetNext(y) != NULL)
        !          20120:            return (0);
        !          20121:        else
        !          20122:            return (1);
        !          20123:     }
        !          20124:     return (0);
        !          20125: }
        !          20126: 
        !          20127: /**
        !          20128:  * xmlSchemaResolveAttrUseReferences:
        !          20129:  * @item:  an attribute use
        !          20130:  * @ctxt:  a parser context
        !          20131:  *
        !          20132:  * Resolves the referenced attribute declaration.
        !          20133:  */
        !          20134: static int
        !          20135: xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
        !          20136:                                  xmlSchemaParserCtxtPtr ctxt)
        !          20137: {
        !          20138:     if ((ctxt == NULL) || (ause == NULL))
        !          20139:        return(-1);
        !          20140:     if ((ause->attrDecl == NULL) ||
        !          20141:        (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
        !          20142:        return(0);
        !          20143: 
        !          20144:     {
        !          20145:        xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl;
        !          20146: 
        !          20147:        /*
        !          20148:        * TODO: Evaluate, what errors could occur if the declaration is not
        !          20149:        * found.
        !          20150:        */
        !          20151:        ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
        !          20152:            ref->name, ref->targetNamespace);
        !          20153:         if (ause->attrDecl == NULL) {
        !          20154:            xmlSchemaPResCompAttrErr(ctxt,
        !          20155:                XML_SCHEMAP_SRC_RESOLVE,
        !          20156:                WXS_BASIC_CAST ause, ause->node,
        !          20157:                "ref", ref->name, ref->targetNamespace,
        !          20158:                XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
        !          20159:             return(ctxt->err);;
        !          20160:         }
        !          20161:     }
        !          20162:     return(0);
        !          20163: }
        !          20164: 
        !          20165: /**
        !          20166:  * xmlSchemaCheckAttrUsePropsCorrect:
        !          20167:  * @ctxt:  a parser context
        !          20168:  * @use:  an attribute use
        !          20169:  *
        !          20170:  * Schema Component Constraint:
        !          20171:  * Attribute Use Correct (au-props-correct)
        !          20172:  *
        !          20173:  */
        !          20174: static int
        !          20175: xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
        !          20176:                             xmlSchemaAttributeUsePtr use)
        !          20177: {
        !          20178:     if ((ctxt == NULL) || (use == NULL))
        !          20179:        return(-1);
        !          20180:     if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) ||
        !          20181:        ((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE))
        !          20182:        return(0);
        !          20183: 
        !          20184:     /*
        !          20185:     * SPEC au-props-correct (1)
        !          20186:     * "The values of the properties of an attribute use must be as
        !          20187:     * described in the property tableau in The Attribute Use Schema
        !          20188:     * Component (�3.5.1), modulo the impact of Missing
        !          20189:     * Sub-components (�5.3)."
        !          20190:     */
        !          20191: 
        !          20192:     if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) &&
        !          20193:        ((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) &&
        !          20194:         ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
        !          20195:     {
        !          20196:        xmlSchemaPCustomErr(ctxt,
        !          20197:            XML_SCHEMAP_AU_PROPS_CORRECT_2,
        !          20198:            WXS_BASIC_CAST use, NULL,
        !          20199:            "The attribute declaration has a 'fixed' value constraint "
        !          20200:            ", thus the attribute use must also have a 'fixed' value "
        !          20201:            "constraint",
        !          20202:            NULL);
        !          20203:        return(ctxt->err);
        !          20204:     }
        !          20205:     /*
        !          20206:     * Compute and check the value constraint's value.
        !          20207:     */
        !          20208:     if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) {
        !          20209:        int ret;
        !          20210:        /*
        !          20211:        * TODO: The spec seems to be missing a check of the
        !          20212:        * value constraint of the attribute use. We will do it here.
        !          20213:        */
        !          20214:        /*
        !          20215:        * SPEC a-props-correct (3)
        !          20216:        */
        !          20217:        if (xmlSchemaIsDerivedFromBuiltInType(
        !          20218:            WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
        !          20219:        {
        !          20220:            xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          20221:                XML_SCHEMAP_AU_PROPS_CORRECT,
        !          20222:                NULL, WXS_BASIC_CAST use,
        !          20223:                "Value constraints are not allowed if the type definition "
        !          20224:                "is or is derived from xs:ID",
        !          20225:                NULL, NULL);
        !          20226:            return(ctxt->err);
        !          20227:        }
        !          20228: 
        !          20229:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
        !          20230:            use->node, WXS_ATTRUSE_TYPEDEF(use),
        !          20231:            use->defValue, &(use->defVal),
        !          20232:            1, 1, 0);
        !          20233:        if (ret != 0) {
        !          20234:            if (ret < 0) {
        !          20235:                PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect",
        !          20236:                    "calling xmlSchemaVCheckCVCSimpleType()");
        !          20237:                return(-1);
        !          20238:            }
        !          20239:            xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          20240:                XML_SCHEMAP_AU_PROPS_CORRECT,
        !          20241:                NULL, WXS_BASIC_CAST use,
        !          20242:                "The value of the value constraint is not valid",
        !          20243:                NULL, NULL);
        !          20244:            return(ctxt->err);
        !          20245:        }
        !          20246:     }
        !          20247:     /*
        !          20248:     * SPEC au-props-correct (2)
        !          20249:     * "If the {attribute declaration} has a fixed
        !          20250:     * {value constraint}, then if the attribute use itself has a
        !          20251:     * {value constraint}, it must also be fixed and its value must match
        !          20252:     * that of the {attribute declaration}'s {value constraint}."
        !          20253:     */
        !          20254:     if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) &&
        !          20255:        (((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
        !          20256:     {
        !          20257:        if (! xmlSchemaAreValuesEqual(use->defVal,
        !          20258:                (WXS_ATTRUSE_DECL(use))->defVal))
        !          20259:        {
        !          20260:            xmlSchemaPCustomErr(ctxt,
        !          20261:                XML_SCHEMAP_AU_PROPS_CORRECT_2,
        !          20262:                WXS_BASIC_CAST use, NULL,
        !          20263:                "The 'fixed' value constraint of the attribute use "
        !          20264:                "must match the attribute declaration's value "
        !          20265:                "constraint '%s'",
        !          20266:                (WXS_ATTRUSE_DECL(use))->defValue);
        !          20267:        }
        !          20268:        return(ctxt->err);
        !          20269:     }
        !          20270:     return(0);
        !          20271: }
        !          20272: 
        !          20273: 
        !          20274: 
        !          20275: 
        !          20276: /**
        !          20277:  * xmlSchemaResolveAttrTypeReferences:
        !          20278:  * @item:  an attribute declaration
        !          20279:  * @ctxt:  a parser context
        !          20280:  *
        !          20281:  * Resolves the referenced type definition component.
        !          20282:  */
        !          20283: static int
        !          20284: xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item,
        !          20285:                                   xmlSchemaParserCtxtPtr ctxt)
        !          20286: {
        !          20287:     /*
        !          20288:     * The simple type definition corresponding to the <simpleType> element
        !          20289:     * information item in the [children], if present, otherwise the simple
        !          20290:     * type definition �resolved� to by the �actual value� of the type
        !          20291:     * [attribute], if present, otherwise the �simple ur-type definition�.
        !          20292:     */
        !          20293:     if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
        !          20294:        return(0);
        !          20295:     item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
        !          20296:     if (item->subtypes != NULL)
        !          20297:         return(0);
        !          20298:     if (item->typeName != NULL) {
        !          20299:         xmlSchemaTypePtr type;
        !          20300: 
        !          20301:        type = xmlSchemaGetType(ctxt->schema, item->typeName,
        !          20302:            item->typeNs);
        !          20303:        if ((type == NULL) || (! WXS_IS_SIMPLE(type))) {
        !          20304:            xmlSchemaPResCompAttrErr(ctxt,
        !          20305:                XML_SCHEMAP_SRC_RESOLVE,
        !          20306:                WXS_BASIC_CAST item, item->node,
        !          20307:                "type", item->typeName, item->typeNs,
        !          20308:                XML_SCHEMA_TYPE_SIMPLE, NULL);
        !          20309:            return(ctxt->err);
        !          20310:        } else
        !          20311:            item->subtypes = type;
        !          20312: 
        !          20313:     } else {
        !          20314:        /*
        !          20315:        * The type defaults to the xs:anySimpleType.
        !          20316:        */
        !          20317:        item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
        !          20318:     }
        !          20319:     return(0);
        !          20320: }
        !          20321: 
        !          20322: /**
        !          20323:  * xmlSchemaResolveIDCKeyReferences:
        !          20324:  * @idc:  the identity-constraint definition
        !          20325:  * @ctxt:  the schema parser context
        !          20326:  * @name:  the attribute name
        !          20327:  *
        !          20328:  * Resolve keyRef references to key/unique IDCs.
        !          20329:  * Schema Component Constraint:
        !          20330:  *   Identity-constraint Definition Properties Correct (c-props-correct)
        !          20331:  */
        !          20332: static int
        !          20333: xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
        !          20334:                          xmlSchemaParserCtxtPtr pctxt)
        !          20335: {
        !          20336:     if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
        !          20337:         return(0);
        !          20338:     if (idc->ref->name != NULL) {
        !          20339:        idc->ref->item = (xmlSchemaBasicItemPtr)
        !          20340:            xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
        !          20341:                idc->ref->targetNamespace);
        !          20342:         if (idc->ref->item == NULL) {
        !          20343:            /*
        !          20344:            * TODO: It is actually not an error to fail to resolve
        !          20345:            * at this stage. BUT we need to be that strict!
        !          20346:            */
        !          20347:            xmlSchemaPResCompAttrErr(pctxt,
        !          20348:                XML_SCHEMAP_SRC_RESOLVE,
        !          20349:                WXS_BASIC_CAST idc, idc->node,
        !          20350:                "refer", idc->ref->name,
        !          20351:                idc->ref->targetNamespace,
        !          20352:                XML_SCHEMA_TYPE_IDC_KEY, NULL);
        !          20353:             return(pctxt->err);
        !          20354:        } else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          20355:            /*
        !          20356:            * SPEC c-props-correct (1)
        !          20357:            */
        !          20358:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          20359:                XML_SCHEMAP_C_PROPS_CORRECT,
        !          20360:                NULL, WXS_BASIC_CAST idc,
        !          20361:                "The keyref references a keyref",
        !          20362:                NULL, NULL);
        !          20363:            idc->ref->item = NULL;
        !          20364:            return(pctxt->err);
        !          20365:        } else {
        !          20366:            if (idc->nbFields !=
        !          20367:                ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
        !          20368:                xmlChar *str = NULL;
        !          20369:                xmlSchemaIDCPtr refer;
        !          20370: 
        !          20371:                refer = (xmlSchemaIDCPtr) idc->ref->item;
        !          20372:                /*
        !          20373:                * SPEC c-props-correct(2)
        !          20374:                * "If the {identity-constraint category} is keyref,
        !          20375:                * the cardinality of the {fields} must equal that of
        !          20376:                * the {fields} of the {referenced key}.
        !          20377:                */
        !          20378:                xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          20379:                    XML_SCHEMAP_C_PROPS_CORRECT,
        !          20380:                    NULL, WXS_BASIC_CAST idc,
        !          20381:                    "The cardinality of the keyref differs from the "
        !          20382:                    "cardinality of the referenced key/unique '%s'",
        !          20383:                    xmlSchemaFormatQName(&str, refer->targetNamespace,
        !          20384:                        refer->name),
        !          20385:                    NULL);
        !          20386:                FREE_AND_NULL(str)
        !          20387:                return(pctxt->err);
        !          20388:            }
        !          20389:        }
        !          20390:     }
        !          20391:     return(0);
        !          20392: }
        !          20393: 
        !          20394: static int
        !          20395: xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
        !          20396:                                       xmlSchemaParserCtxtPtr pctxt)
        !          20397: {
        !          20398:     if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
        !          20399:        prohib->targetNamespace) == NULL) {
        !          20400: 
        !          20401:        xmlSchemaPResCompAttrErr(pctxt,
        !          20402:            XML_SCHEMAP_SRC_RESOLVE,
        !          20403:            NULL, prohib->node,
        !          20404:            "ref", prohib->name, prohib->targetNamespace,
        !          20405:            XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
        !          20406:        return(XML_SCHEMAP_SRC_RESOLVE);
        !          20407:     }
        !          20408:     return(0);
        !          20409: }
        !          20410: 
        !          20411: #define WXS_REDEFINED_TYPE(c) \
        !          20412: (((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
        !          20413: 
        !          20414: #define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
        !          20415: (((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
        !          20416: 
        !          20417: #define WXS_REDEFINED_ATTR_GROUP(c) \
        !          20418: (((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
        !          20419: 
        !          20420: static int
        !          20421: xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
        !          20422: {
        !          20423:     int err = 0;
        !          20424:     xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
        !          20425:     xmlSchemaBasicItemPtr prev, item;
        !          20426:     int wasRedefined;
        !          20427: 
        !          20428:     if (redef == NULL)
        !          20429:        return(0);
        !          20430: 
        !          20431:     do {
        !          20432:        item = redef->item;
        !          20433:        /*
        !          20434:        * First try to locate the redefined component in the
        !          20435:        * schema graph starting with the redefined schema.
        !          20436:        * NOTE: According to this schema bug entry:
        !          20437:        *   http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html
        !          20438:        *   it's not clear if the referenced component needs to originate
        !          20439:        *   from the <redefine>d schema _document_ or the schema; the latter
        !          20440:        *   would include all imported and included sub-schemas of the
        !          20441:        *   <redefine>d schema. Currenlty we latter approach is used.
        !          20442:        *   SUPPLEMENT: It seems that the WG moves towards the latter
        !          20443:        *   approach, so we are doing it right.
        !          20444:        *
        !          20445:        */
        !          20446:        prev = xmlSchemaFindRedefCompInGraph(
        !          20447:            redef->targetBucket, item->type,
        !          20448:            redef->refName, redef->refTargetNs);
        !          20449:        if (prev == NULL) {
        !          20450:            xmlChar *str = NULL;
        !          20451:            xmlNodePtr node;
        !          20452: 
        !          20453:            /*
        !          20454:            * SPEC src-redefine:
        !          20455:            * (6.2.1) "The �actual value� of its own name attribute plus
        !          20456:            * target namespace must successfully �resolve� to a model
        !          20457:            * group definition in I."
        !          20458:            * (7.2.1) "The �actual value� of its own name attribute plus
        !          20459:            * target namespace must successfully �resolve� to an attribute
        !          20460:            * group definition in I."
        !          20461: 
        !          20462:            *
        !          20463:            * Note that, if we are redefining with the use of references
        !          20464:            * to components, the spec assumes the src-resolve to be used;
        !          20465:            * but this won't assure that we search only *inside* the
        !          20466:            * redefined schema.
        !          20467:            */
        !          20468:            if (redef->reference)
        !          20469:                node = WXS_ITEM_NODE(redef->reference);
        !          20470:            else
        !          20471:                node = WXS_ITEM_NODE(item);
        !          20472:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          20473:                /*
        !          20474:                * TODO: error code.
        !          20475:                * Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the
        !          20476:                * reference kind.
        !          20477:                */
        !          20478:                XML_SCHEMAP_SRC_REDEFINE, node, NULL,
        !          20479:                "The %s '%s' to be redefined could not be found in "
        !          20480:                "the redefined schema",
        !          20481:                WXS_ITEM_TYPE_NAME(item),
        !          20482:                xmlSchemaFormatQName(&str, redef->refTargetNs,
        !          20483:                    redef->refName));
        !          20484:            FREE_AND_NULL(str);
        !          20485:            err = pctxt->err;
        !          20486:            redef = redef->next;
        !          20487:            continue;
        !          20488:        }
        !          20489:        /*
        !          20490:        * TODO: Obtaining and setting the redefinition state is really
        !          20491:        * clumsy.
        !          20492:        */
        !          20493:        wasRedefined = 0;
        !          20494:        switch (item->type) {
        !          20495:            case XML_SCHEMA_TYPE_COMPLEX:
        !          20496:            case XML_SCHEMA_TYPE_SIMPLE:
        !          20497:                if ((WXS_TYPE_CAST prev)->flags &
        !          20498:                    XML_SCHEMAS_TYPE_REDEFINED)
        !          20499:                {
        !          20500:                    wasRedefined = 1;
        !          20501:                    break;
        !          20502:                }
        !          20503:                /* Mark it as redefined. */
        !          20504:                (WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED;
        !          20505:                /*
        !          20506:                * Assign the redefined type to the
        !          20507:                * base type of the redefining type.
        !          20508:                * TODO: How
        !          20509:                */
        !          20510:                ((xmlSchemaTypePtr) item)->baseType =
        !          20511:                    (xmlSchemaTypePtr) prev;
        !          20512:                break;
        !          20513:            case XML_SCHEMA_TYPE_GROUP:
        !          20514:                if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
        !          20515:                    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
        !          20516:                {
        !          20517:                    wasRedefined = 1;
        !          20518:                    break;
        !          20519:                }
        !          20520:                /* Mark it as redefined. */
        !          20521:                (WXS_MODEL_GROUPDEF_CAST prev)->flags |=
        !          20522:                    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
        !          20523:                if (redef->reference != NULL) {
        !          20524:                    /*
        !          20525:                    * Overwrite the QName-reference with the
        !          20526:                    * referenced model group def.
        !          20527:                    */
        !          20528:                    (WXS_PTC_CAST redef->reference)->children =
        !          20529:                        WXS_TREE_CAST prev;
        !          20530:                }
        !          20531:                redef->target = prev;
        !          20532:                break;
        !          20533:            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          20534:                if ((WXS_ATTR_GROUP_CAST prev)->flags &
        !          20535:                    XML_SCHEMAS_ATTRGROUP_REDEFINED)
        !          20536:                {
        !          20537:                    wasRedefined = 1;
        !          20538:                    break;
        !          20539:                }
        !          20540:                (WXS_ATTR_GROUP_CAST prev)->flags |=
        !          20541:                    XML_SCHEMAS_ATTRGROUP_REDEFINED;
        !          20542:                if (redef->reference != NULL) {
        !          20543:                    /*
        !          20544:                    * Assign the redefined attribute group to the
        !          20545:                    * QName-reference component.
        !          20546:                    * This is the easy case, since we will just
        !          20547:                    * expand the redefined group.
        !          20548:                    */
        !          20549:                    (WXS_QNAME_CAST redef->reference)->item = prev;
        !          20550:                    redef->target = NULL;
        !          20551:                } else {
        !          20552:                    /*
        !          20553:                    * This is the complicated case: we need
        !          20554:                    * to apply src-redefine (7.2.2) at a later
        !          20555:                    * stage, i.e. when attribute group references
        !          20556:                    * have beed expanded and simple types have
        !          20557:                    * beed fixed.
        !          20558:                    */
        !          20559:                    redef->target = prev;
        !          20560:                }
        !          20561:                break;
        !          20562:            default:
        !          20563:                PERROR_INT("xmlSchemaResolveRedefReferences",
        !          20564:                    "Unexpected redefined component type");
        !          20565:                return(-1);
        !          20566:        }
        !          20567:        if (wasRedefined) {
        !          20568:            xmlChar *str = NULL;
        !          20569:            xmlNodePtr node;
        !          20570: 
        !          20571:            if (redef->reference)
        !          20572:                node = WXS_ITEM_NODE(redef->reference);
        !          20573:            else
        !          20574:                node = WXS_ITEM_NODE(redef->item);
        !          20575: 
        !          20576:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          20577:                /* TODO: error code. */
        !          20578:                XML_SCHEMAP_SRC_REDEFINE,
        !          20579:                node, NULL,
        !          20580:                "The referenced %s was already redefined. Multiple "
        !          20581:                "redefinition of the same component is not supported",
        !          20582:                xmlSchemaGetComponentDesignation(&str, prev),
        !          20583:                NULL);
        !          20584:            FREE_AND_NULL(str)
        !          20585:            err = pctxt->err;
        !          20586:            redef = redef->next;
        !          20587:            continue;
        !          20588:        }
        !          20589:        redef = redef->next;
        !          20590:     } while (redef != NULL);
        !          20591: 
        !          20592:     return(err);
        !          20593: }
        !          20594: 
        !          20595: static int
        !          20596: xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
        !          20597: {
        !          20598:     int err = 0;
        !          20599:     xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
        !          20600:     xmlSchemaBasicItemPtr item;
        !          20601: 
        !          20602:     if (redef == NULL)
        !          20603:        return(0);
        !          20604: 
        !          20605:     do {
        !          20606:        if (redef->target == NULL) {
        !          20607:            redef = redef->next;
        !          20608:            continue;
        !          20609:        }
        !          20610:        item = redef->item;
        !          20611: 
        !          20612:        switch (item->type) {
        !          20613:            case XML_SCHEMA_TYPE_SIMPLE:
        !          20614:            case XML_SCHEMA_TYPE_COMPLEX:
        !          20615:                /*
        !          20616:                * Since the spec wants the {name} of the redefined
        !          20617:                * type to be 'absent', we'll NULL it.
        !          20618:                */
        !          20619:                (WXS_TYPE_CAST redef->target)->name = NULL;
        !          20620: 
        !          20621:                /*
        !          20622:                * TODO: Seems like there's nothing more to do. The normal
        !          20623:                * inheritance mechanism is used. But not 100% sure.
        !          20624:                */
        !          20625:                break;
        !          20626:            case XML_SCHEMA_TYPE_GROUP:
        !          20627:                /*
        !          20628:                * URGENT TODO:
        !          20629:                * SPEC src-redefine:
        !          20630:                * (6.2.2) "The {model group} of the model group definition
        !          20631:                * which corresponds to it per XML Representation of Model
        !          20632:                * Group Definition Schema Components (�3.7.2) must be a
        !          20633:                * �valid restriction� of the {model group} of that model
        !          20634:                * group definition in I, as defined in Particle Valid
        !          20635:                * (Restriction) (�3.9.6)."
        !          20636:                */
        !          20637:                break;
        !          20638:            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          20639:                /*
        !          20640:                * SPEC src-redefine:
        !          20641:                * (7.2.2) "The {attribute uses} and {attribute wildcard} of
        !          20642:                * the attribute group definition which corresponds to it
        !          20643:                * per XML Representation of Attribute Group Definition Schema
        !          20644:                * Components (�3.6.2) must be �valid restrictions� of the
        !          20645:                * {attribute uses} and {attribute wildcard} of that attribute
        !          20646:                * group definition in I, as defined in clause 2, clause 3 and
        !          20647:                * clause 4 of Derivation Valid (Restriction, Complex)
        !          20648:                * (�3.4.6) (where references to the base type definition are
        !          20649:                * understood as references to the attribute group definition
        !          20650:                * in I)."
        !          20651:                */
        !          20652:                err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
        !          20653:                    XML_SCHEMA_ACTION_REDEFINE,
        !          20654:                    item, redef->target,
        !          20655:                    (WXS_ATTR_GROUP_CAST item)->attrUses,
        !          20656:                    (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
        !          20657:                    (WXS_ATTR_GROUP_CAST item)->attributeWildcard,
        !          20658:                    (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
        !          20659:                if (err == -1)
        !          20660:                    return(-1);
        !          20661:                break;
        !          20662:            default:
        !          20663:                break;
        !          20664:        }
        !          20665:        redef = redef->next;
        !          20666:     } while (redef != NULL);
        !          20667:     return(0);
        !          20668: }
        !          20669: 
        !          20670: 
        !          20671: static int
        !          20672: xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
        !          20673:                       xmlSchemaBucketPtr bucket)
        !          20674: {
        !          20675:     xmlSchemaBasicItemPtr item;
        !          20676:     int err;
        !          20677:     xmlHashTablePtr *table;
        !          20678:     const xmlChar *name;
        !          20679:     int i;
        !          20680: 
        !          20681: #define WXS_GET_GLOBAL_HASH(c, slot) { \
        !          20682:     if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
        !          20683:        table = &(WXS_IMPBUCKET((c))->schema->slot); \
        !          20684:     else \
        !          20685:        table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
        !          20686: 
        !          20687:     /*
        !          20688:     * Add global components to the schema's hash tables.
        !          20689:     * This is the place where duplicate components will be
        !          20690:     * detected.
        !          20691:     * TODO: I think normally we should support imports of the
        !          20692:     *   same namespace from multiple locations. We don't do currently,
        !          20693:     *   but if we do then according to:
        !          20694:     *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224
        !          20695:     *   we would need, if imported directly, to import redefined
        !          20696:     *   components as well to be able to catch clashing components.
        !          20697:     *   (I hope I'll still know what this means after some months :-()
        !          20698:     */
        !          20699:     if (bucket == NULL)
        !          20700:        return(-1);
        !          20701:     if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
        !          20702:        return(0);
        !          20703:     bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
        !          20704: 
        !          20705:     for (i = 0; i < bucket->globals->nbItems; i++) {
        !          20706:        item = bucket->globals->items[i];
        !          20707:        table = NULL;
        !          20708:        switch (item->type) {
        !          20709:            case XML_SCHEMA_TYPE_COMPLEX:
        !          20710:            case XML_SCHEMA_TYPE_SIMPLE:
        !          20711:                if (WXS_REDEFINED_TYPE(item))
        !          20712:                    continue;
        !          20713:                name = (WXS_TYPE_CAST item)->name;
        !          20714:                WXS_GET_GLOBAL_HASH(bucket, typeDecl)
        !          20715:                break;
        !          20716:            case XML_SCHEMA_TYPE_ELEMENT:
        !          20717:                name = (WXS_ELEM_CAST item)->name;
        !          20718:                WXS_GET_GLOBAL_HASH(bucket, elemDecl)
        !          20719:                break;
        !          20720:            case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          20721:                name = (WXS_ATTR_CAST item)->name;
        !          20722:                WXS_GET_GLOBAL_HASH(bucket, attrDecl)
        !          20723:                break;
        !          20724:            case XML_SCHEMA_TYPE_GROUP:
        !          20725:                if (WXS_REDEFINED_MODEL_GROUP_DEF(item))
        !          20726:                    continue;
        !          20727:                name = (WXS_MODEL_GROUPDEF_CAST item)->name;
        !          20728:                WXS_GET_GLOBAL_HASH(bucket, groupDecl)
        !          20729:                break;
        !          20730:            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          20731:                if (WXS_REDEFINED_ATTR_GROUP(item))
        !          20732:                    continue;
        !          20733:                name = (WXS_ATTR_GROUP_CAST item)->name;
        !          20734:                WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
        !          20735:                break;
        !          20736:            case XML_SCHEMA_TYPE_IDC_KEY:
        !          20737:            case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          20738:            case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          20739:                name = (WXS_IDC_CAST item)->name;
        !          20740:                WXS_GET_GLOBAL_HASH(bucket, idcDef)
        !          20741:                break;
        !          20742:            case XML_SCHEMA_TYPE_NOTATION:
        !          20743:                name = ((xmlSchemaNotationPtr) item)->name;
        !          20744:                WXS_GET_GLOBAL_HASH(bucket, notaDecl)
        !          20745:                break;
        !          20746:            default:
        !          20747:                PERROR_INT("xmlSchemaAddComponents",
        !          20748:                    "Unexpected global component type");
        !          20749:                continue;
        !          20750:        }
        !          20751:        if (*table == NULL) {
        !          20752:            *table = xmlHashCreateDict(10, pctxt->dict);
        !          20753:            if (*table == NULL) {
        !          20754:                PERROR_INT("xmlSchemaAddComponents",
        !          20755:                    "failed to create a component hash table");
        !          20756:                return(-1);
        !          20757:            }
        !          20758:        }
        !          20759:        err = xmlHashAddEntry(*table, name, item);
        !          20760:        if (err != 0) {
        !          20761:            xmlChar *str = NULL;
        !          20762: 
        !          20763:            xmlSchemaCustomErr(ACTXT_CAST pctxt,
        !          20764:                XML_SCHEMAP_REDEFINED_TYPE,
        !          20765:                WXS_ITEM_NODE(item),
        !          20766:                WXS_BASIC_CAST item,
        !          20767:                "A global %s '%s' does already exist",
        !          20768:                WXS_ITEM_TYPE_NAME(item),
        !          20769:                xmlSchemaGetComponentQName(&str, item));
        !          20770:            FREE_AND_NULL(str);
        !          20771:        }
        !          20772:     }
        !          20773:     /*
        !          20774:     * Process imported/included schemas.
        !          20775:     */
        !          20776:     if (bucket->relations != NULL) {
        !          20777:        xmlSchemaSchemaRelationPtr rel = bucket->relations;
        !          20778:        do {
        !          20779:            if ((rel->bucket != NULL) &&
        !          20780:                ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
        !          20781:                if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
        !          20782:                    return(-1);
        !          20783:            }
        !          20784:            rel = rel->next;
        !          20785:        } while (rel != NULL);
        !          20786:     }
        !          20787:     return(0);
        !          20788: }
        !          20789: 
        !          20790: static int
        !          20791: xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
        !          20792:                         xmlSchemaBucketPtr rootBucket)
        !          20793: {
        !          20794:     xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
        !          20795:     xmlSchemaTreeItemPtr item, *items;
        !          20796:     int nbItems, i, ret = 0;
        !          20797:     xmlSchemaBucketPtr oldbucket = con->bucket;
        !          20798:     xmlSchemaElementPtr elemDecl;
        !          20799: 
        !          20800: #define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
        !          20801: 
        !          20802:     if ((con->pending == NULL) ||
        !          20803:        (con->pending->nbItems == 0))
        !          20804:        return(0);
        !          20805: 
        !          20806:     /*
        !          20807:     * Since xmlSchemaFixupComplexType() will create new particles
        !          20808:     * (local components), and those particle components need a bucket
        !          20809:     * on the constructor, we'll assure here that the constructor has
        !          20810:     * a bucket.
        !          20811:     * TODO: Think about storing locals _only_ on the main bucket.
        !          20812:     */
        !          20813:     if (con->bucket == NULL)
        !          20814:        con->bucket = rootBucket;
        !          20815: 
        !          20816:     /* TODO:
        !          20817:     * SPEC (src-redefine):
        !          20818:     * (6.2) "If it has no such self-reference, then all of the
        !          20819:     * following must be true:"
        !          20820: 
        !          20821:     * (6.2.2) The {model group} of the model group definition which
        !          20822:     * corresponds to it per XML Representation of Model Group
        !          20823:     * Definition Schema Components (�3.7.2) must be a �valid
        !          20824:     * restriction� of the {model group} of that model group definition
        !          20825:     * in I, as defined in Particle Valid (Restriction) (�3.9.6)."
        !          20826:     */
        !          20827:     xmlSchemaCheckSRCRedefineFirst(pctxt);
        !          20828: 
        !          20829:     /*
        !          20830:     * Add global components to the schemata's hash tables.
        !          20831:     */
        !          20832:     xmlSchemaAddComponents(pctxt, rootBucket);
        !          20833: 
        !          20834:     pctxt->ctxtType = NULL;
        !          20835:     items = (xmlSchemaTreeItemPtr *) con->pending->items;
        !          20836:     nbItems = con->pending->nbItems;
        !          20837:     /*
        !          20838:     * Now that we have parsed *all* the schema document(s) and converted
        !          20839:     * them to schema components, we can resolve references, apply component
        !          20840:     * constraints, create the FSA from the content model, etc.
        !          20841:     */
        !          20842:     /*
        !          20843:     * Resolve references of..
        !          20844:     *
        !          20845:     * 1. element declarations:
        !          20846:     *   - the type definition
        !          20847:     *   - the substitution group affiliation
        !          20848:     * 2. simple/complex types:
        !          20849:     *   - the base type definition
        !          20850:     *   - the memberTypes of union types
        !          20851:     *   - the itemType of list types
        !          20852:     * 3. attributes declarations and attribute uses:
        !          20853:     *   - the type definition
        !          20854:     *   - if an attribute use, then the attribute declaration
        !          20855:     * 4. attribute group references:
        !          20856:     *   - the attribute group definition
        !          20857:     * 5. particles:
        !          20858:     *   - the term of the particle (e.g. a model group)
        !          20859:     * 6. IDC key-references:
        !          20860:     *   - the referenced IDC 'key' or 'unique' definition
        !          20861:     * 7. Attribute prohibitions which had a "ref" attribute.
        !          20862:     */
        !          20863:     for (i = 0; i < nbItems; i++) {
        !          20864:        item = items[i];
        !          20865:        switch (item->type) {
        !          20866:            case XML_SCHEMA_TYPE_ELEMENT:
        !          20867:                xmlSchemaResolveElementReferences(
        !          20868:                    (xmlSchemaElementPtr) item, pctxt);
        !          20869:                FIXHFAILURE;
        !          20870:                break;
        !          20871:            case XML_SCHEMA_TYPE_COMPLEX:
        !          20872:            case XML_SCHEMA_TYPE_SIMPLE:
        !          20873:                xmlSchemaResolveTypeReferences(
        !          20874:                    (xmlSchemaTypePtr) item, pctxt);
        !          20875:                FIXHFAILURE;
        !          20876:                break;
        !          20877:            case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          20878:                xmlSchemaResolveAttrTypeReferences(
        !          20879:                    (xmlSchemaAttributePtr) item, pctxt);
        !          20880:                FIXHFAILURE;
        !          20881:                break;
        !          20882:            case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          20883:                xmlSchemaResolveAttrUseReferences(
        !          20884:                    (xmlSchemaAttributeUsePtr) item, pctxt);
        !          20885:                FIXHFAILURE;
        !          20886:                break;
        !          20887:            case XML_SCHEMA_EXTRA_QNAMEREF:
        !          20888:                if ((WXS_QNAME_CAST item)->itemType ==
        !          20889:                    XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
        !          20890:                {
        !          20891:                    xmlSchemaResolveAttrGroupReferences(
        !          20892:                        WXS_QNAME_CAST item, pctxt);
        !          20893:                }
        !          20894:                FIXHFAILURE;
        !          20895:                break;
        !          20896:            case XML_SCHEMA_TYPE_SEQUENCE:
        !          20897:            case XML_SCHEMA_TYPE_CHOICE:
        !          20898:            case XML_SCHEMA_TYPE_ALL:
        !          20899:                xmlSchemaResolveModelGroupParticleReferences(pctxt,
        !          20900:                    WXS_MODEL_GROUP_CAST item);
        !          20901:                FIXHFAILURE;
        !          20902:                break;
        !          20903:            case XML_SCHEMA_TYPE_IDC_KEY:
        !          20904:            case XML_SCHEMA_TYPE_IDC_UNIQUE:
        !          20905:            case XML_SCHEMA_TYPE_IDC_KEYREF:
        !          20906:                xmlSchemaResolveIDCKeyReferences(
        !          20907:                    (xmlSchemaIDCPtr) item, pctxt);
        !          20908:                FIXHFAILURE;
        !          20909:                break;
        !          20910:            case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
        !          20911:                /*
        !          20912:                * Handle attribue prohibition which had a
        !          20913:                * "ref" attribute.
        !          20914:                */
        !          20915:                xmlSchemaResolveAttrUseProhibReferences(
        !          20916:                    WXS_ATTR_PROHIB_CAST item, pctxt);
        !          20917:                FIXHFAILURE;
        !          20918:                break;
        !          20919:            default:
        !          20920:                break;
        !          20921:        }
        !          20922:     }
        !          20923:     if (pctxt->nberrors != 0)
        !          20924:        goto exit_error;
        !          20925: 
        !          20926:     /*
        !          20927:     * Now that all references are resolved we
        !          20928:     * can check for circularity of...
        !          20929:     * 1. the base axis of type definitions
        !          20930:     * 2. nested model group definitions
        !          20931:     * 3. nested attribute group definitions
        !          20932:     * TODO: check for circual substitution groups.
        !          20933:     */
        !          20934:     for (i = 0; i < nbItems; i++) {
        !          20935:        item = items[i];
        !          20936:        /*
        !          20937:        * Let's better stop on the first error here.
        !          20938:        */
        !          20939:        switch (item->type) {
        !          20940:            case XML_SCHEMA_TYPE_COMPLEX:
        !          20941:            case XML_SCHEMA_TYPE_SIMPLE:
        !          20942:                xmlSchemaCheckTypeDefCircular(
        !          20943:                    (xmlSchemaTypePtr) item, pctxt);
        !          20944:                FIXHFAILURE;
        !          20945:                if (pctxt->nberrors != 0)
        !          20946:                    goto exit_error;
        !          20947:                break;
        !          20948:            case XML_SCHEMA_TYPE_GROUP:
        !          20949:                xmlSchemaCheckGroupDefCircular(
        !          20950:                    (xmlSchemaModelGroupDefPtr) item, pctxt);
        !          20951:                FIXHFAILURE;
        !          20952:                if (pctxt->nberrors != 0)
        !          20953:                    goto exit_error;
        !          20954:                break;
        !          20955:            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          20956:                xmlSchemaCheckAttrGroupCircular(
        !          20957:                    (xmlSchemaAttributeGroupPtr) item, pctxt);
        !          20958:                FIXHFAILURE;
        !          20959:                if (pctxt->nberrors != 0)
        !          20960:                    goto exit_error;
        !          20961:                break;
        !          20962:            default:
        !          20963:                break;
        !          20964:        }
        !          20965:     }
        !          20966:     if (pctxt->nberrors != 0)
        !          20967:        goto exit_error;
        !          20968:     /*
        !          20969:     * Model group definition references:
        !          20970:     * Such a reference is reflected by a particle at the component
        !          20971:     * level. Until now the 'term' of such particles pointed
        !          20972:     * to the model group definition; this was done, in order to
        !          20973:     * ease circularity checks. Now we need to set the 'term' of
        !          20974:     * such particles to the model group of the model group definition.
        !          20975:     */
        !          20976:     for (i = 0; i < nbItems; i++) {
        !          20977:        item = items[i];
        !          20978:        switch (item->type) {
        !          20979:            case XML_SCHEMA_TYPE_SEQUENCE:
        !          20980:            case XML_SCHEMA_TYPE_CHOICE:
        !          20981:                xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
        !          20982:                    WXS_MODEL_GROUP_CAST item);
        !          20983:                break;
        !          20984:            default:
        !          20985:                break;
        !          20986:        }
        !          20987:     }
        !          20988:     if (pctxt->nberrors != 0)
        !          20989:        goto exit_error;
        !          20990:     /*
        !          20991:     * Expand attribute group references of attribute group definitions.
        !          20992:     */
        !          20993:     for (i = 0; i < nbItems; i++) {
        !          20994:        item = items[i];
        !          20995:        switch (item->type) {
        !          20996:             case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          20997:                if ((! WXS_ATTR_GROUP_EXPANDED(item)) &&
        !          20998:                    WXS_ATTR_GROUP_HAS_REFS(item))
        !          20999:                {
        !          21000:                    xmlSchemaAttributeGroupExpandRefs(pctxt,
        !          21001:                        WXS_ATTR_GROUP_CAST item);
        !          21002:                    FIXHFAILURE;
        !          21003:                }
        !          21004:                break;
        !          21005:            default:
        !          21006:                break;
        !          21007:        }
        !          21008:     }
        !          21009:     if (pctxt->nberrors != 0)
        !          21010:        goto exit_error;
        !          21011:     /*
        !          21012:     * First compute the variety of simple types. This is needed as
        !          21013:     * a seperate step, since otherwise we won't be able to detect
        !          21014:     * circular union types in all cases.
        !          21015:     */
        !          21016:     for (i = 0; i < nbItems; i++) {
        !          21017:        item = items[i];
        !          21018:        switch (item->type) {
        !          21019:             case XML_SCHEMA_TYPE_SIMPLE:
        !          21020:                if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) {
        !          21021:                    xmlSchemaFixupSimpleTypeStageOne(pctxt,
        !          21022:                        (xmlSchemaTypePtr) item);
        !          21023:                    FIXHFAILURE;
        !          21024:                }
        !          21025:                break;
        !          21026:            default:
        !          21027:                break;
        !          21028:        }
        !          21029:     }
        !          21030:     if (pctxt->nberrors != 0)
        !          21031:        goto exit_error;
        !          21032:     /*
        !          21033:     * Detect circular union types. Note that this needs the variety to
        !          21034:     * be already computed.
        !          21035:     */
        !          21036:     for (i = 0; i < nbItems; i++) {
        !          21037:        item = items[i];
        !          21038:        switch (item->type) {
        !          21039:             case XML_SCHEMA_TYPE_SIMPLE:
        !          21040:                if (((xmlSchemaTypePtr) item)->memberTypes != NULL) {
        !          21041:                    xmlSchemaCheckUnionTypeDefCircular(pctxt,
        !          21042:                        (xmlSchemaTypePtr) item);
        !          21043:                    FIXHFAILURE;
        !          21044:                }
        !          21045:                break;
        !          21046:            default:
        !          21047:                break;
        !          21048:        }
        !          21049:     }
        !          21050:     if (pctxt->nberrors != 0)
        !          21051:        goto exit_error;
        !          21052: 
        !          21053:     /*
        !          21054:     * Do the complete type fixup for simple types.
        !          21055:     */
        !          21056:     for (i = 0; i < nbItems; i++) {
        !          21057:        item = items[i];
        !          21058:        switch (item->type) {
        !          21059:             case XML_SCHEMA_TYPE_SIMPLE:
        !          21060:                if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
        !          21061:                    xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item);
        !          21062:                    FIXHFAILURE;
        !          21063:                }
        !          21064:                break;
        !          21065:            default:
        !          21066:                break;
        !          21067:        }
        !          21068:     }
        !          21069:     if (pctxt->nberrors != 0)
        !          21070:        goto exit_error;
        !          21071:     /*
        !          21072:     * At this point we need build and check all simple types.
        !          21073:     */
        !          21074:     /*
        !          21075:     * Apply contraints for attribute declarations.
        !          21076:     */
        !          21077:     for (i = 0; i < nbItems; i++) {
        !          21078:        item = items[i];
        !          21079:        switch (item->type) {
        !          21080:            case XML_SCHEMA_TYPE_ATTRIBUTE:
        !          21081:                xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item);
        !          21082:                FIXHFAILURE;
        !          21083:                break;
        !          21084:            default:
        !          21085:                break;
        !          21086:        }
        !          21087:     }
        !          21088:     if (pctxt->nberrors != 0)
        !          21089:        goto exit_error;
        !          21090:     /*
        !          21091:     * Apply constraints for attribute uses.
        !          21092:     */
        !          21093:     for (i = 0; i < nbItems; i++) {
        !          21094:        item = items[i];
        !          21095:        switch (item->type) {
        !          21096:            case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
        !          21097:                if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) {
        !          21098:                    xmlSchemaCheckAttrUsePropsCorrect(pctxt,
        !          21099:                        WXS_ATTR_USE_CAST item);
        !          21100:                    FIXHFAILURE;
        !          21101:                }
        !          21102:                break;
        !          21103:            default:
        !          21104:                break;
        !          21105:        }
        !          21106:     }
        !          21107:     if (pctxt->nberrors != 0)
        !          21108:        goto exit_error;
        !          21109: 
        !          21110:     /*
        !          21111:     * Apply constraints for attribute group definitions.
        !          21112:     */
        !          21113:     for (i = 0; i < nbItems; i++) {
        !          21114:        item = items[i];
        !          21115:        switch (item->type) {
        !          21116:        case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
        !          21117:            if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) &&
        !          21118:                ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1))
        !          21119:            {
        !          21120:                xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item);
        !          21121:                FIXHFAILURE;
        !          21122:            }
        !          21123:            break;
        !          21124:        default:
        !          21125:            break;
        !          21126:        }
        !          21127:     }
        !          21128:     if (pctxt->nberrors != 0)
        !          21129:        goto exit_error;
        !          21130: 
        !          21131:     /*
        !          21132:     * Apply constraints for redefinitions.
        !          21133:     */
        !          21134:     if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL)
        !          21135:        xmlSchemaCheckSRCRedefineSecond(pctxt);
        !          21136:     if (pctxt->nberrors != 0)
        !          21137:        goto exit_error;
        !          21138: 
        !          21139:     /*
        !          21140:     * Complex types are builded and checked.
        !          21141:     */
        !          21142:     for (i = 0; i < nbItems; i++) {
        !          21143:        item = con->pending->items[i];
        !          21144:        switch (item->type) {
        !          21145:            case XML_SCHEMA_TYPE_COMPLEX:
        !          21146:                if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
        !          21147:                    xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item);
        !          21148:                    FIXHFAILURE;
        !          21149:                }
        !          21150:                break;
        !          21151:            default:
        !          21152:                break;
        !          21153:        }
        !          21154:     }
        !          21155:     if (pctxt->nberrors != 0)
        !          21156:        goto exit_error;
        !          21157: 
        !          21158:     /*
        !          21159:     * The list could have changed, since xmlSchemaFixupComplexType()
        !          21160:     * will create particles and model groups in some cases.
        !          21161:     */
        !          21162:     items = (xmlSchemaTreeItemPtr *) con->pending->items;
        !          21163:     nbItems = con->pending->nbItems;
        !          21164: 
        !          21165:     /*
        !          21166:     * Apply some constraints for element declarations.
        !          21167:     */
        !          21168:     for (i = 0; i < nbItems; i++) {
        !          21169:        item = items[i];
        !          21170:        switch (item->type) {
        !          21171:            case XML_SCHEMA_TYPE_ELEMENT:
        !          21172:                elemDecl = (xmlSchemaElementPtr) item;
        !          21173: 
        !          21174:                if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
        !          21175:                {
        !          21176:                    xmlSchemaCheckElementDeclComponent(
        !          21177:                        (xmlSchemaElementPtr) elemDecl, pctxt);
        !          21178:                    FIXHFAILURE;
        !          21179:                }
        !          21180: 
        !          21181: #ifdef WXS_ELEM_DECL_CONS_ENABLED
        !          21182:                /*
        !          21183:                * Schema Component Constraint: Element Declarations Consistent
        !          21184:                * Apply this constraint to local types of element declarations.
        !          21185:                */
        !          21186:                if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) &&
        !          21187:                    (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
        !          21188:                    (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
        !          21189:                {
        !          21190:                    xmlSchemaCheckElementDeclConsistent(pctxt,
        !          21191:                        WXS_BASIC_CAST elemDecl,
        !          21192:                        WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
        !          21193:                        NULL, NULL, 0);
        !          21194:                }
        !          21195: #endif
        !          21196:                break;
        !          21197:            default:
        !          21198:                break;
        !          21199:        }
        !          21200:     }
        !          21201:     if (pctxt->nberrors != 0)
        !          21202:        goto exit_error;
        !          21203: 
        !          21204:     /*
        !          21205:     * Finally we can build the automaton from the content model of
        !          21206:     * complex types.
        !          21207:     */
        !          21208: 
        !          21209:     for (i = 0; i < nbItems; i++) {
        !          21210:        item = items[i];
        !          21211:        switch (item->type) {
        !          21212:            case XML_SCHEMA_TYPE_COMPLEX:
        !          21213:                xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt);
        !          21214:                /* FIXHFAILURE; */
        !          21215:                break;
        !          21216:            default:
        !          21217:                break;
        !          21218:        }
        !          21219:     }
        !          21220:     if (pctxt->nberrors != 0)
        !          21221:        goto exit_error;
        !          21222:     /*
        !          21223:     * URGENT TODO: cos-element-consistent
        !          21224:     */
        !          21225:     goto exit;
        !          21226: 
        !          21227: exit_error:
        !          21228:     ret = pctxt->err;
        !          21229:     goto exit;
        !          21230: 
        !          21231: exit_failure:
        !          21232:     ret = -1;
        !          21233: 
        !          21234: exit:
        !          21235:     /*
        !          21236:     * Reset the constructor. This is needed for XSI acquisition, since
        !          21237:     * those items will be processed over and over again for every XSI
        !          21238:     * if not cleared here.
        !          21239:     */
        !          21240:     con->bucket = oldbucket;
        !          21241:     con->pending->nbItems = 0;
        !          21242:     if (con->substGroups != NULL) {
        !          21243:        xmlHashFree(con->substGroups,
        !          21244:            (xmlHashDeallocator) xmlSchemaSubstGroupFree);
        !          21245:        con->substGroups = NULL;
        !          21246:     }
        !          21247:     if (con->redefs != NULL) {
        !          21248:        xmlSchemaRedefListFree(con->redefs);
        !          21249:        con->redefs = NULL;
        !          21250:     }
        !          21251:     return(ret);
        !          21252: }
        !          21253: /**
        !          21254:  * xmlSchemaParse:
        !          21255:  * @ctxt:  a schema validation context
        !          21256:  *
        !          21257:  * parse a schema definition resource and build an internal
        !          21258:  * XML Shema struture which can be used to validate instances.
        !          21259:  *
        !          21260:  * Returns the internal XML Schema structure built from the resource or
        !          21261:  *         NULL in case of error
        !          21262:  */
        !          21263: xmlSchemaPtr
        !          21264: xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
        !          21265: {
        !          21266:     xmlSchemaPtr mainSchema = NULL;
        !          21267:     xmlSchemaBucketPtr bucket = NULL;
        !          21268:     int res;
        !          21269: 
        !          21270:     /*
        !          21271:     * This one is used if the schema to be parsed was specified via
        !          21272:     * the API; i.e. not automatically by the validated instance document.
        !          21273:     */
        !          21274: 
        !          21275:     xmlSchemaInitTypes();
        !          21276: 
        !          21277:     if (ctxt == NULL)
        !          21278:         return (NULL);
        !          21279: 
        !          21280:     /* TODO: Init the context. Is this all we need?*/
        !          21281:     ctxt->nberrors = 0;
        !          21282:     ctxt->err = 0;
        !          21283:     ctxt->counter = 0;
        !          21284: 
        !          21285:     /* Create the *main* schema. */
        !          21286:     mainSchema = xmlSchemaNewSchema(ctxt);
        !          21287:     if (mainSchema == NULL)
        !          21288:        goto exit_failure;
        !          21289:     /*
        !          21290:     * Create the schema constructor.
        !          21291:     */
        !          21292:     if (ctxt->constructor == NULL) {
        !          21293:        ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
        !          21294:        if (ctxt->constructor == NULL)
        !          21295:            return(NULL);
        !          21296:        /* Take ownership of the constructor to be able to free it. */
        !          21297:        ctxt->ownsConstructor = 1;
        !          21298:     }
        !          21299:     ctxt->constructor->mainSchema = mainSchema;
        !          21300:     /*
        !          21301:     * Locate and add the schema document.
        !          21302:     */
        !          21303:     res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
        !          21304:        ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL,
        !          21305:        NULL, NULL, &bucket);
        !          21306:     if (res == -1)
        !          21307:        goto exit_failure;
        !          21308:     if (res != 0)
        !          21309:        goto exit;
        !          21310: 
        !          21311:     if (bucket == NULL) {
        !          21312:        /* TODO: Error code, actually we failed to *locate* the schema. */
        !          21313:        if (ctxt->URL)
        !          21314:            xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
        !          21315:                NULL, NULL,
        !          21316:                "Failed to locate the main schema resource at '%s'",
        !          21317:                ctxt->URL, NULL);
        !          21318:        else
        !          21319:            xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
        !          21320:                NULL, NULL,
        !          21321:                "Failed to locate the main schema resource",
        !          21322:                    NULL, NULL);
        !          21323:        goto exit;
        !          21324:     }
        !          21325:     /* Then do the parsing for good. */
        !          21326:     if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
        !          21327:        goto exit_failure;
        !          21328:     if (ctxt->nberrors != 0)
        !          21329:        goto exit;
        !          21330: 
        !          21331:     mainSchema->doc = bucket->doc;
        !          21332:     mainSchema->preserve = ctxt->preserve;
        !          21333: 
        !          21334:     ctxt->schema = mainSchema;
        !          21335: 
        !          21336:     if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
        !          21337:        goto exit_failure;
        !          21338: 
        !          21339:     /*
        !          21340:     * TODO: This is not nice, since we cannot distinguish from the
        !          21341:     * result if there was an internal error or not.
        !          21342:     */
        !          21343: exit:
        !          21344:     if (ctxt->nberrors != 0) {
        !          21345:        if (mainSchema) {
        !          21346:            xmlSchemaFree(mainSchema);
        !          21347:            mainSchema = NULL;
        !          21348:        }
        !          21349:        if (ctxt->constructor) {
        !          21350:            xmlSchemaConstructionCtxtFree(ctxt->constructor);
        !          21351:            ctxt->constructor = NULL;
        !          21352:            ctxt->ownsConstructor = 0;
        !          21353:        }
        !          21354:     }
        !          21355:     ctxt->schema = NULL;
        !          21356:     return(mainSchema);
        !          21357: exit_failure:
        !          21358:     /*
        !          21359:     * Quite verbose, but should catch internal errors, which were
        !          21360:     * not communitated.
        !          21361:     */
        !          21362:     if (mainSchema) {
        !          21363:         xmlSchemaFree(mainSchema);
        !          21364:        mainSchema = NULL;
        !          21365:     }
        !          21366:     if (ctxt->constructor) {
        !          21367:        xmlSchemaConstructionCtxtFree(ctxt->constructor);
        !          21368:        ctxt->constructor = NULL;
        !          21369:        ctxt->ownsConstructor = 0;
        !          21370:     }
        !          21371:     PERROR_INT2("xmlSchemaParse",
        !          21372:        "An internal error occured");
        !          21373:     ctxt->schema = NULL;
        !          21374:     return(NULL);
        !          21375: }
        !          21376: 
        !          21377: /**
        !          21378:  * xmlSchemaSetParserErrors:
        !          21379:  * @ctxt:  a schema validation context
        !          21380:  * @err:  the error callback
        !          21381:  * @warn:  the warning callback
        !          21382:  * @ctx:  contextual data for the callbacks
        !          21383:  *
        !          21384:  * Set the callback functions used to handle errors for a validation context
        !          21385:  */
        !          21386: void
        !          21387: xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
        !          21388:                          xmlSchemaValidityErrorFunc err,
        !          21389:                          xmlSchemaValidityWarningFunc warn, void *ctx)
        !          21390: {
        !          21391:     if (ctxt == NULL)
        !          21392:         return;
        !          21393:     ctxt->error = err;
        !          21394:     ctxt->warning = warn;
        !          21395:     ctxt->errCtxt = ctx;
        !          21396:     if (ctxt->vctxt != NULL)
        !          21397:        xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx);
        !          21398: }
        !          21399: 
        !          21400: /**
        !          21401:  * xmlSchemaSetParserStructuredErrors:
        !          21402:  * @ctxt:  a schema parser context
        !          21403:  * @serror:  the structured error function
        !          21404:  * @ctx: the functions context
        !          21405:  *
        !          21406:  * Set the structured error callback
        !          21407:  */
        !          21408: void
        !          21409: xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
        !          21410:                                   xmlStructuredErrorFunc serror,
        !          21411:                                   void *ctx)
        !          21412: {
        !          21413:     if (ctxt == NULL)
        !          21414:        return;
        !          21415:     ctxt->serror = serror;
        !          21416:     ctxt->errCtxt = ctx;
        !          21417:     if (ctxt->vctxt != NULL)
        !          21418:        xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx);
        !          21419: }
        !          21420: 
        !          21421: /**
        !          21422:  * xmlSchemaGetParserErrors:
        !          21423:  * @ctxt:  a XMl-Schema parser context
        !          21424:  * @err: the error callback result
        !          21425:  * @warn: the warning callback result
        !          21426:  * @ctx: contextual data for the callbacks result
        !          21427:  *
        !          21428:  * Get the callback information used to handle errors for a parser context
        !          21429:  *
        !          21430:  * Returns -1 in case of failure, 0 otherwise
        !          21431:  */
        !          21432: int
        !          21433: xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
        !          21434:                         xmlSchemaValidityErrorFunc * err,
        !          21435:                         xmlSchemaValidityWarningFunc * warn, void **ctx)
        !          21436: {
        !          21437:        if (ctxt == NULL)
        !          21438:                return(-1);
        !          21439:        if (err != NULL)
        !          21440:                *err = ctxt->error;
        !          21441:        if (warn != NULL)
        !          21442:                *warn = ctxt->warning;
        !          21443:        if (ctx != NULL)
        !          21444:                *ctx = ctxt->errCtxt;
        !          21445:        return(0);
        !          21446: }
        !          21447: 
        !          21448: /**
        !          21449:  * xmlSchemaFacetTypeToString:
        !          21450:  * @type:  the facet type
        !          21451:  *
        !          21452:  * Convert the xmlSchemaTypeType to a char string.
        !          21453:  *
        !          21454:  * Returns the char string representation of the facet type if the
        !          21455:  *     type is a facet and an "Internal Error" string otherwise.
        !          21456:  */
        !          21457: static const xmlChar *
        !          21458: xmlSchemaFacetTypeToString(xmlSchemaTypeType type)
        !          21459: {
        !          21460:     switch (type) {
        !          21461:         case XML_SCHEMA_FACET_PATTERN:
        !          21462:             return (BAD_CAST "pattern");
        !          21463:         case XML_SCHEMA_FACET_MAXEXCLUSIVE:
        !          21464:             return (BAD_CAST "maxExclusive");
        !          21465:         case XML_SCHEMA_FACET_MAXINCLUSIVE:
        !          21466:             return (BAD_CAST "maxInclusive");
        !          21467:         case XML_SCHEMA_FACET_MINEXCLUSIVE:
        !          21468:             return (BAD_CAST "minExclusive");
        !          21469:         case XML_SCHEMA_FACET_MININCLUSIVE:
        !          21470:             return (BAD_CAST "minInclusive");
        !          21471:         case XML_SCHEMA_FACET_WHITESPACE:
        !          21472:             return (BAD_CAST "whiteSpace");
        !          21473:         case XML_SCHEMA_FACET_ENUMERATION:
        !          21474:             return (BAD_CAST "enumeration");
        !          21475:         case XML_SCHEMA_FACET_LENGTH:
        !          21476:             return (BAD_CAST "length");
        !          21477:         case XML_SCHEMA_FACET_MAXLENGTH:
        !          21478:             return (BAD_CAST "maxLength");
        !          21479:         case XML_SCHEMA_FACET_MINLENGTH:
        !          21480:             return (BAD_CAST "minLength");
        !          21481:         case XML_SCHEMA_FACET_TOTALDIGITS:
        !          21482:             return (BAD_CAST "totalDigits");
        !          21483:         case XML_SCHEMA_FACET_FRACTIONDIGITS:
        !          21484:             return (BAD_CAST "fractionDigits");
        !          21485:         default:
        !          21486:             break;
        !          21487:     }
        !          21488:     return (BAD_CAST "Internal Error");
        !          21489: }
        !          21490: 
        !          21491: static xmlSchemaWhitespaceValueType
        !          21492: xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type)
        !          21493: {
        !          21494:     /*
        !          21495:     * The normalization type can be changed only for types which are derived
        !          21496:     * from xsd:string.
        !          21497:     */
        !          21498:     if (type->type == XML_SCHEMA_TYPE_BASIC) {
        !          21499:        /*
        !          21500:        * Note that we assume a whitespace of preserve for anySimpleType.
        !          21501:        */
        !          21502:        if ((type->builtInType == XML_SCHEMAS_STRING) ||
        !          21503:            (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
        !          21504:            return(XML_SCHEMA_WHITESPACE_PRESERVE);
        !          21505:        else if (type->builtInType == XML_SCHEMAS_NORMSTRING)
        !          21506:            return(XML_SCHEMA_WHITESPACE_REPLACE);
        !          21507:        else {
        !          21508:            /*
        !          21509:            * For all �atomic� datatypes other than string (and types �derived�
        !          21510:            * by �restriction� from it) the value of whiteSpace is fixed to
        !          21511:            * collapse
        !          21512:            * Note that this includes built-in list datatypes.
        !          21513:            */
        !          21514:            return(XML_SCHEMA_WHITESPACE_COLLAPSE);
        !          21515:        }
        !          21516:     } else if (WXS_IS_LIST(type)) {
        !          21517:        /*
        !          21518:        * For list types the facet "whiteSpace" is fixed to "collapse".
        !          21519:        */
        !          21520:        return (XML_SCHEMA_WHITESPACE_COLLAPSE);
        !          21521:     } else if (WXS_IS_UNION(type)) {
        !          21522:        return (XML_SCHEMA_WHITESPACE_UNKNOWN);
        !          21523:     } else if (WXS_IS_ATOMIC(type)) {
        !          21524:        if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
        !          21525:            return (XML_SCHEMA_WHITESPACE_PRESERVE);
        !          21526:        else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
        !          21527:            return (XML_SCHEMA_WHITESPACE_REPLACE);
        !          21528:        else
        !          21529:            return (XML_SCHEMA_WHITESPACE_COLLAPSE);
        !          21530:     }
        !          21531:     return (-1);
        !          21532: }
        !          21533: 
        !          21534: /************************************************************************
        !          21535:  *                                                                     *
        !          21536:  *                     Simple type validation                          *
        !          21537:  *                                                                     *
        !          21538:  ************************************************************************/
        !          21539: 
        !          21540: 
        !          21541: /************************************************************************
        !          21542:  *                                                                     *
        !          21543:  *                     DOM Validation code                             *
        !          21544:  *                                                                     *
        !          21545:  ************************************************************************/
        !          21546: 
        !          21547: /**
        !          21548:  * xmlSchemaAssembleByLocation:
        !          21549:  * @pctxt:  a schema parser context
        !          21550:  * @vctxt:  a schema validation context
        !          21551:  * @schema: the existing schema
        !          21552:  * @node: the node that fired the assembling
        !          21553:  * @nsName: the namespace name of the new schema
        !          21554:  * @location: the location of the schema
        !          21555:  *
        !          21556:  * Expands an existing schema by an additional schema.
        !          21557:  *
        !          21558:  * Returns 0 if the new schema is correct, a positive error code
        !          21559:  * number otherwise and -1 in case of an internal or API error.
        !          21560:  */
        !          21561: static int
        !          21562: xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
        !          21563:                            xmlSchemaPtr schema,
        !          21564:                            xmlNodePtr node,
        !          21565:                            const xmlChar *nsName,
        !          21566:                            const xmlChar *location)
        !          21567: {
        !          21568:     int ret = 0;
        !          21569:     xmlSchemaParserCtxtPtr pctxt;
        !          21570:     xmlSchemaBucketPtr bucket = NULL;
        !          21571: 
        !          21572:     if ((vctxt == NULL) || (schema == NULL))
        !          21573:        return (-1);
        !          21574: 
        !          21575:     if (vctxt->pctxt == NULL) {
        !          21576:        VERROR_INT("xmlSchemaAssembleByLocation",
        !          21577:            "no parser context available");
        !          21578:        return(-1);
        !          21579:     }
        !          21580:     pctxt = vctxt->pctxt;
        !          21581:     if (pctxt->constructor == NULL) {
        !          21582:        PERROR_INT("xmlSchemaAssembleByLocation",
        !          21583:            "no constructor");
        !          21584:        return(-1);
        !          21585:     }
        !          21586:     /*
        !          21587:     * Acquire the schema document.
        !          21588:     */
        !          21589:     location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
        !          21590:        location, node);
        !          21591:     /*
        !          21592:     * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here;
        !          21593:     * the process will automatically change this to
        !          21594:     * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document.
        !          21595:     */
        !          21596:     ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
        !          21597:        location, NULL, NULL, 0, node, NULL, nsName,
        !          21598:        &bucket);
        !          21599:     if (ret != 0)
        !          21600:        return(ret);
        !          21601:     if (bucket == NULL) {
        !          21602:        /*
        !          21603:        * Generate a warning that the document could not be located.
        !          21604:        */
        !          21605:        xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
        !          21606:            node, NULL,
        !          21607:            "The document at location '%s' could not be acquired",
        !          21608:            location, NULL, NULL);
        !          21609:        return(ret);
        !          21610:     }
        !          21611:     /*
        !          21612:     * The first located schema will be handled as if all other
        !          21613:     * schemas imported by XSI were imported by this first schema.
        !          21614:     */
        !          21615:     if ((bucket != NULL) &&
        !          21616:        (WXS_CONSTRUCTOR(pctxt)->bucket == NULL))
        !          21617:        WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
        !          21618:     /*
        !          21619:     * TODO: Is this handled like an import? I.e. is it not an error
        !          21620:     * if the schema cannot be located?
        !          21621:     */
        !          21622:     if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket)))
        !          21623:        return(0);
        !          21624:     /*
        !          21625:     * We will reuse the parser context for every schema imported
        !          21626:     * directly via XSI. So reset the context.
        !          21627:     */
        !          21628:     pctxt->nberrors = 0;
        !          21629:     pctxt->err = 0;
        !          21630:     pctxt->doc = bucket->doc;
        !          21631: 
        !          21632:     ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket);
        !          21633:     if (ret == -1) {
        !          21634:        pctxt->doc = NULL;
        !          21635:        goto exit_failure;
        !          21636:     }
        !          21637:     /* Paranoid error channelling. */
        !          21638:     if ((ret == 0) && (pctxt->nberrors != 0))
        !          21639:        ret = pctxt->err;
        !          21640:     if (pctxt->nberrors == 0) {
        !          21641:        /*
        !          21642:        * Only bother to fixup pending components, if there was
        !          21643:        * no error yet.
        !          21644:        * For every XSI acquired schema (and its sub-schemata) we will
        !          21645:        * fixup the components.
        !          21646:        */
        !          21647:        xmlSchemaFixupComponents(pctxt, bucket);
        !          21648:        ret = pctxt->err;
        !          21649:        /*
        !          21650:        * Not nice, but we need somehow to channel the schema parser
        !          21651:        * error to the validation context.
        !          21652:        */
        !          21653:        if ((ret != 0) && (vctxt->err == 0))
        !          21654:            vctxt->err = ret;
        !          21655:        vctxt->nberrors += pctxt->nberrors;
        !          21656:     } else {
        !          21657:        /* Add to validation error sum. */
        !          21658:        vctxt->nberrors += pctxt->nberrors;
        !          21659:     }
        !          21660:     pctxt->doc = NULL;
        !          21661:     return(ret);
        !          21662: exit_failure:
        !          21663:     pctxt->doc = NULL;
        !          21664:     return (-1);
        !          21665: }
        !          21666: 
        !          21667: static xmlSchemaAttrInfoPtr
        !          21668: xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
        !          21669:                         int metaType)
        !          21670: {
        !          21671:     if (vctxt->nbAttrInfos == 0)
        !          21672:        return (NULL);
        !          21673:     {
        !          21674:        int i;
        !          21675:        xmlSchemaAttrInfoPtr iattr;
        !          21676: 
        !          21677:        for (i = 0; i < vctxt->nbAttrInfos; i++) {
        !          21678:            iattr = vctxt->attrInfos[i];
        !          21679:            if (iattr->metaType == metaType)
        !          21680:                return (iattr);
        !          21681:        }
        !          21682: 
        !          21683:     }
        !          21684:     return (NULL);
        !          21685: }
        !          21686: 
        !          21687: /**
        !          21688:  * xmlSchemaAssembleByXSI:
        !          21689:  * @vctxt:  a schema validation context
        !          21690:  *
        !          21691:  * Expands an existing schema by an additional schema using
        !          21692:  * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute
        !          21693:  * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace
        !          21694:  * must be set to 1.
        !          21695:  *
        !          21696:  * Returns 0 if the new schema is correct, a positive error code
        !          21697:  * number otherwise and -1 in case of an internal or API error.
        !          21698:  */
        !          21699: static int
        !          21700: xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
        !          21701: {
        !          21702:     const xmlChar *cur, *end;
        !          21703:     const xmlChar *nsname = NULL, *location;
        !          21704:     int count = 0;
        !          21705:     int ret = 0;
        !          21706:     xmlSchemaAttrInfoPtr iattr;
        !          21707: 
        !          21708:     /*
        !          21709:     * Parse the value; we will assume an even number of values
        !          21710:     * to be given (this is how Xerces and XSV work).
        !          21711:     *
        !          21712:     * URGENT TODO: !! This needs to work for both
        !          21713:     * @noNamespaceSchemaLocation AND @schemaLocation on the same
        !          21714:     * element !!
        !          21715:     */
        !          21716:     iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          21717:        XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
        !          21718:     if (iattr == NULL)
        !          21719:        iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          21720:        XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
        !          21721:     if (iattr == NULL)
        !          21722:        return (0);
        !          21723:     cur = iattr->value;
        !          21724:     do {
        !          21725:        /*
        !          21726:        * TODO: Move the string parsing mechanism away from here.
        !          21727:        */
        !          21728:        if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
        !          21729:            /*
        !          21730:            * Get the namespace name.
        !          21731:            */
        !          21732:            while (IS_BLANK_CH(*cur))
        !          21733:                cur++;
        !          21734:            end = cur;
        !          21735:            while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          21736:                end++;
        !          21737:            if (end == cur)
        !          21738:                break;
        !          21739:            count++; /* TODO: Don't use the schema's dict. */
        !          21740:            nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
        !          21741:            cur = end;
        !          21742:        }
        !          21743:        /*
        !          21744:        * Get the URI.
        !          21745:        */
        !          21746:        while (IS_BLANK_CH(*cur))
        !          21747:            cur++;
        !          21748:        end = cur;
        !          21749:        while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          21750:            end++;
        !          21751:        if (end == cur) {
        !          21752:            if (iattr->metaType ==
        !          21753:                XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
        !          21754:            {
        !          21755:                /*
        !          21756:                * If using @schemaLocation then tuples are expected.
        !          21757:                * I.e. the namespace name *and* the document's URI.
        !          21758:                */
        !          21759:                xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
        !          21760:                    iattr->node, NULL,
        !          21761:                    "The value must consist of tuples: the target namespace "
        !          21762:                    "name and the document's URI", NULL, NULL, NULL);
        !          21763:            }
        !          21764:            break;
        !          21765:        }
        !          21766:        count++; /* TODO: Don't use the schema's dict. */
        !          21767:        location = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
        !          21768:        cur = end;
        !          21769:        ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
        !          21770:            iattr->node, nsname, location);
        !          21771:        if (ret == -1) {
        !          21772:            VERROR_INT("xmlSchemaAssembleByXSI",
        !          21773:                "assembling schemata");
        !          21774:            return (-1);
        !          21775:        }
        !          21776:     } while (*cur != 0);
        !          21777:     return (ret);
        !          21778: }
        !          21779: 
        !          21780: static const xmlChar *
        !          21781: xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
        !          21782:                         const xmlChar *prefix)
        !          21783: {
        !          21784:     if (vctxt->sax != NULL) {
        !          21785:        int i, j;
        !          21786:        xmlSchemaNodeInfoPtr inode;
        !          21787: 
        !          21788:        for (i = vctxt->depth; i >= 0; i--) {
        !          21789:            if (vctxt->elemInfos[i]->nbNsBindings != 0) {
        !          21790:                inode = vctxt->elemInfos[i];
        !          21791:                for (j = 0; j < inode->nbNsBindings * 2; j += 2) {
        !          21792:                    if (((prefix == NULL) &&
        !          21793:                            (inode->nsBindings[j] == NULL)) ||
        !          21794:                        ((prefix != NULL) && xmlStrEqual(prefix,
        !          21795:                            inode->nsBindings[j]))) {
        !          21796: 
        !          21797:                        /*
        !          21798:                        * Note that the namespace bindings are already
        !          21799:                        * in a string dict.
        !          21800:                        */
        !          21801:                        return (inode->nsBindings[j+1]);
        !          21802:                    }
        !          21803:                }
        !          21804:            }
        !          21805:        }
        !          21806:        return (NULL);
        !          21807: #ifdef LIBXML_READER_ENABLED
        !          21808:     } else if (vctxt->reader != NULL) {
        !          21809:        xmlChar *nsName;
        !          21810: 
        !          21811:        nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix);
        !          21812:        if (nsName != NULL) {
        !          21813:            const xmlChar *ret;
        !          21814: 
        !          21815:            ret = xmlDictLookup(vctxt->dict, nsName, -1);
        !          21816:            xmlFree(nsName);
        !          21817:            return (ret);
        !          21818:        } else
        !          21819:            return (NULL);
        !          21820: #endif
        !          21821:     } else {
        !          21822:        xmlNsPtr ns;
        !          21823: 
        !          21824:        if ((vctxt->inode->node == NULL) ||
        !          21825:            (vctxt->inode->node->doc == NULL)) {
        !          21826:            VERROR_INT("xmlSchemaLookupNamespace",
        !          21827:                "no node or node's doc avaliable");
        !          21828:            return (NULL);
        !          21829:        }
        !          21830:        ns = xmlSearchNs(vctxt->inode->node->doc,
        !          21831:            vctxt->inode->node, prefix);
        !          21832:        if (ns != NULL)
        !          21833:            return (ns->href);
        !          21834:        return (NULL);
        !          21835:     }
        !          21836: }
        !          21837: 
        !          21838: /*
        !          21839: * This one works on the schema of the validation context.
        !          21840: */
        !          21841: static int
        !          21842: xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
        !          21843:                          xmlSchemaPtr schema,
        !          21844:                          xmlNodePtr node,
        !          21845:                          const xmlChar *value,
        !          21846:                          xmlSchemaValPtr *val,
        !          21847:                          int valNeeded)
        !          21848: {
        !          21849:     int ret;
        !          21850: 
        !          21851:     if (vctxt && (vctxt->schema == NULL)) {
        !          21852:        VERROR_INT("xmlSchemaValidateNotation",
        !          21853:            "a schema is needed on the validation context");
        !          21854:        return (-1);
        !          21855:     }
        !          21856:     ret = xmlValidateQName(value, 1);
        !          21857:     if (ret != 0)
        !          21858:        return (ret);
        !          21859:     {
        !          21860:        xmlChar *localName = NULL;
        !          21861:        xmlChar *prefix = NULL;
        !          21862: 
        !          21863:        localName = xmlSplitQName2(value, &prefix);
        !          21864:        if (prefix != NULL) {
        !          21865:            const xmlChar *nsName = NULL;
        !          21866: 
        !          21867:            if (vctxt != NULL)
        !          21868:                nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix);
        !          21869:            else if (node != NULL) {
        !          21870:                xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix);
        !          21871:                if (ns != NULL)
        !          21872:                    nsName = ns->href;
        !          21873:            } else {
        !          21874:                xmlFree(prefix);
        !          21875:                xmlFree(localName);
        !          21876:                return (1);
        !          21877:            }
        !          21878:            if (nsName == NULL) {
        !          21879:                xmlFree(prefix);
        !          21880:                xmlFree(localName);
        !          21881:                return (1);
        !          21882:            }
        !          21883:            if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) {
        !          21884:                if ((valNeeded) && (val != NULL)) {
        !          21885:                    (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName),
        !          21886:                                                       xmlStrdup(nsName));
        !          21887:                    if (*val == NULL)
        !          21888:                        ret = -1;
        !          21889:                }
        !          21890:            } else
        !          21891:                ret = 1;
        !          21892:            xmlFree(prefix);
        !          21893:            xmlFree(localName);
        !          21894:        } else {
        !          21895:            if (xmlSchemaGetNotation(schema, value, NULL) != NULL) {
        !          21896:                if (valNeeded && (val != NULL)) {
        !          21897:                    (*val) = xmlSchemaNewNOTATIONValue(
        !          21898:                        BAD_CAST xmlStrdup(value), NULL);
        !          21899:                    if (*val == NULL)
        !          21900:                        ret = -1;
        !          21901:                }
        !          21902:            } else
        !          21903:                return (1);
        !          21904:        }
        !          21905:     }
        !          21906:     return (ret);
        !          21907: }
        !          21908: 
        !          21909: static int
        !          21910: xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
        !          21911:                       const xmlChar* lname,
        !          21912:                       const xmlChar* nsname)
        !          21913: {
        !          21914:     int i;
        !          21915: 
        !          21916:     lname = xmlDictLookup(vctxt->dict, lname, -1);
        !          21917:     if (lname == NULL)
        !          21918:        return(-1);
        !          21919:     if (nsname != NULL) {
        !          21920:        nsname = xmlDictLookup(vctxt->dict, nsname, -1);
        !          21921:        if (nsname == NULL)
        !          21922:            return(-1);
        !          21923:     }
        !          21924:     for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) {
        !          21925:        if ((vctxt->nodeQNames->items [i] == lname) &&
        !          21926:            (vctxt->nodeQNames->items[i +1] == nsname))
        !          21927:            /* Already there */
        !          21928:            return(i);
        !          21929:     }
        !          21930:     /* Add new entry. */
        !          21931:     i = vctxt->nodeQNames->nbItems;
        !          21932:     xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname);
        !          21933:     xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname);
        !          21934:     return(i);
        !          21935: }
        !          21936: 
        !          21937: /************************************************************************
        !          21938:  *                                                                     *
        !          21939:  *  Validation of identity-constraints (IDC)                            *
        !          21940:  *                                                                     *
        !          21941:  ************************************************************************/
        !          21942: 
        !          21943: /**
        !          21944:  * xmlSchemaAugmentIDC:
        !          21945:  * @idcDef: the IDC definition
        !          21946:  *
        !          21947:  * Creates an augmented IDC definition item.
        !          21948:  *
        !          21949:  * Returns the item, or NULL on internal errors.
        !          21950:  */
        !          21951: static void
        !          21952: xmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef,
        !          21953:                    xmlSchemaValidCtxtPtr vctxt)
        !          21954: {
        !          21955:     xmlSchemaIDCAugPtr aidc;
        !          21956: 
        !          21957:     aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug));
        !          21958:     if (aidc == NULL) {
        !          21959:        xmlSchemaVErrMemory(vctxt,
        !          21960:            "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
        !          21961:            NULL);
        !          21962:        return;
        !          21963:     }
        !          21964:     aidc->keyrefDepth = -1;
        !          21965:     aidc->def = idcDef;
        !          21966:     aidc->next = NULL;
        !          21967:     if (vctxt->aidcs == NULL)
        !          21968:        vctxt->aidcs = aidc;
        !          21969:     else {
        !          21970:        aidc->next = vctxt->aidcs;
        !          21971:        vctxt->aidcs = aidc;
        !          21972:     }
        !          21973:     /*
        !          21974:     * Save if we have keyrefs at all.
        !          21975:     */
        !          21976:     if ((vctxt->hasKeyrefs == 0) &&
        !          21977:        (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
        !          21978:        vctxt->hasKeyrefs = 1;
        !          21979: }
        !          21980: 
        !          21981: /**
        !          21982:  * xmlSchemaAugmentImportedIDC:
        !          21983:  * @imported: the imported schema
        !          21984:  *
        !          21985:  * Creates an augmented IDC definition for the imported schema.
        !          21986:  */
        !          21987: static void
        !          21988: xmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) {
        !          21989:     if (imported->schema->idcDef != NULL) {
        !          21990:            xmlHashScan(imported->schema->idcDef ,
        !          21991:            (xmlHashScanner) xmlSchemaAugmentIDC, vctxt);
        !          21992:     }
        !          21993: }
        !          21994: 
        !          21995: /**
        !          21996:  * xmlSchemaIDCNewBinding:
        !          21997:  * @idcDef: the IDC definition of this binding
        !          21998:  *
        !          21999:  * Creates a new IDC binding.
        !          22000:  *
        !          22001:  * Returns the new IDC binding, NULL on internal errors.
        !          22002:  */
        !          22003: static xmlSchemaPSVIIDCBindingPtr
        !          22004: xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
        !          22005: {
        !          22006:     xmlSchemaPSVIIDCBindingPtr ret;
        !          22007: 
        !          22008:     ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc(
        !          22009:            sizeof(xmlSchemaPSVIIDCBinding));
        !          22010:     if (ret == NULL) {
        !          22011:        xmlSchemaVErrMemory(NULL,
        !          22012:            "allocating a PSVI IDC binding item", NULL);
        !          22013:        return (NULL);
        !          22014:     }
        !          22015:     memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding));
        !          22016:     ret->definition = idcDef;
        !          22017:     return (ret);
        !          22018: }
        !          22019: 
        !          22020: /**
        !          22021:  * xmlSchemaIDCStoreNodeTableItem:
        !          22022:  * @vctxt: the WXS validation context
        !          22023:  * @item: the IDC node table item
        !          22024:  *
        !          22025:  * The validation context is used to store IDC node table items.
        !          22026:  * They are stored to avoid copying them if IDC node-tables are merged
        !          22027:  * with corresponding parent IDC node-tables (bubbling).
        !          22028:  *
        !          22029:  * Returns 0 if succeeded, -1 on internal errors.
        !          22030:  */
        !          22031: static int
        !          22032: xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
        !          22033:                               xmlSchemaPSVIIDCNodePtr item)
        !          22034: {
        !          22035:     /*
        !          22036:     * Add to gobal list.
        !          22037:     */
        !          22038:     if (vctxt->idcNodes == NULL) {
        !          22039:        vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
        !          22040:            xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr));
        !          22041:        if (vctxt->idcNodes == NULL) {
        !          22042:            xmlSchemaVErrMemory(vctxt,
        !          22043:                "allocating the IDC node table item list", NULL);
        !          22044:            return (-1);
        !          22045:        }
        !          22046:        vctxt->sizeIdcNodes = 20;
        !          22047:     } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
        !          22048:        vctxt->sizeIdcNodes *= 2;
        !          22049:        vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
        !          22050:            xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
        !          22051:            sizeof(xmlSchemaPSVIIDCNodePtr));
        !          22052:        if (vctxt->idcNodes == NULL) {
        !          22053:            xmlSchemaVErrMemory(vctxt,
        !          22054:                "re-allocating the IDC node table item list", NULL);
        !          22055:            return (-1);
        !          22056:        }
        !          22057:     }
        !          22058:     vctxt->idcNodes[vctxt->nbIdcNodes++] = item;
        !          22059: 
        !          22060:     return (0);
        !          22061: }
        !          22062: 
        !          22063: /**
        !          22064:  * xmlSchemaIDCStoreKey:
        !          22065:  * @vctxt: the WXS validation context
        !          22066:  * @item: the IDC key
        !          22067:  *
        !          22068:  * The validation context is used to store an IDC key.
        !          22069:  *
        !          22070:  * Returns 0 if succeeded, -1 on internal errors.
        !          22071:  */
        !          22072: static int
        !          22073: xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
        !          22074:                     xmlSchemaPSVIIDCKeyPtr key)
        !          22075: {
        !          22076:     /*
        !          22077:     * Add to gobal list.
        !          22078:     */
        !          22079:     if (vctxt->idcKeys == NULL) {
        !          22080:        vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
        !          22081:            xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr));
        !          22082:        if (vctxt->idcKeys == NULL) {
        !          22083:            xmlSchemaVErrMemory(vctxt,
        !          22084:                "allocating the IDC key storage list", NULL);
        !          22085:            return (-1);
        !          22086:        }
        !          22087:        vctxt->sizeIdcKeys = 40;
        !          22088:     } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
        !          22089:        vctxt->sizeIdcKeys *= 2;
        !          22090:        vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
        !          22091:            xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
        !          22092:            sizeof(xmlSchemaPSVIIDCKeyPtr));
        !          22093:        if (vctxt->idcKeys == NULL) {
        !          22094:            xmlSchemaVErrMemory(vctxt,
        !          22095:                "re-allocating the IDC key storage list", NULL);
        !          22096:            return (-1);
        !          22097:        }
        !          22098:     }
        !          22099:     vctxt->idcKeys[vctxt->nbIdcKeys++] = key;
        !          22100: 
        !          22101:     return (0);
        !          22102: }
        !          22103: 
        !          22104: /**
        !          22105:  * xmlSchemaIDCAppendNodeTableItem:
        !          22106:  * @bind: the IDC binding
        !          22107:  * @ntItem: the node-table item
        !          22108:  *
        !          22109:  * Appends the IDC node-table item to the binding.
        !          22110:  *
        !          22111:  * Returns 0 on success and -1 on internal errors.
        !          22112:  */
        !          22113: static int
        !          22114: xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind,
        !          22115:                                xmlSchemaPSVIIDCNodePtr ntItem)
        !          22116: {
        !          22117:     if (bind->nodeTable == NULL) {
        !          22118:        bind->sizeNodes = 10;
        !          22119:        bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
        !          22120:            xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
        !          22121:        if (bind->nodeTable == NULL) {
        !          22122:            xmlSchemaVErrMemory(NULL,
        !          22123:                "allocating an array of IDC node-table items", NULL);
        !          22124:            return(-1);
        !          22125:        }
        !          22126:     } else if (bind->sizeNodes <= bind->nbNodes) {
        !          22127:        bind->sizeNodes *= 2;
        !          22128:        bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
        !          22129:            xmlRealloc(bind->nodeTable, bind->sizeNodes *
        !          22130:                sizeof(xmlSchemaPSVIIDCNodePtr));
        !          22131:        if (bind->nodeTable == NULL) {
        !          22132:            xmlSchemaVErrMemory(NULL,
        !          22133:                "re-allocating an array of IDC node-table items", NULL);
        !          22134:            return(-1);
        !          22135:        }
        !          22136:     }
        !          22137:     bind->nodeTable[bind->nbNodes++] = ntItem;
        !          22138:     return(0);
        !          22139: }
        !          22140: 
        !          22141: /**
        !          22142:  * xmlSchemaIDCAcquireBinding:
        !          22143:  * @vctxt: the WXS validation context
        !          22144:  * @matcher: the IDC matcher
        !          22145:  *
        !          22146:  * Looks up an PSVI IDC binding, for the IDC definition and
        !          22147:  * of the given matcher. If none found, a new one is created
        !          22148:  * and added to the IDC table.
        !          22149:  *
        !          22150:  * Returns an IDC binding or NULL on internal errors.
        !          22151:  */
        !          22152: static xmlSchemaPSVIIDCBindingPtr
        !          22153: xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
        !          22154:                          xmlSchemaIDCMatcherPtr matcher)
        !          22155: {
        !          22156:     xmlSchemaNodeInfoPtr ielem;
        !          22157: 
        !          22158:     ielem = vctxt->elemInfos[matcher->depth];
        !          22159: 
        !          22160:     if (ielem->idcTable == NULL) {
        !          22161:        ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
        !          22162:        if (ielem->idcTable == NULL)
        !          22163:            return (NULL);
        !          22164:        return(ielem->idcTable);
        !          22165:     } else {
        !          22166:        xmlSchemaPSVIIDCBindingPtr bind = NULL;
        !          22167: 
        !          22168:        bind = ielem->idcTable;
        !          22169:        do {
        !          22170:            if (bind->definition == matcher->aidc->def)
        !          22171:                return(bind);
        !          22172:            if (bind->next == NULL) {
        !          22173:                bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
        !          22174:                if (bind->next == NULL)
        !          22175:                    return (NULL);
        !          22176:                return(bind->next);
        !          22177:            }
        !          22178:            bind = bind->next;
        !          22179:        } while (bind != NULL);
        !          22180:     }
        !          22181:     return (NULL);
        !          22182: }
        !          22183: 
        !          22184: static xmlSchemaItemListPtr
        !          22185: xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
        !          22186:                             xmlSchemaIDCMatcherPtr matcher)
        !          22187: {
        !          22188:     if (matcher->targets == NULL)
        !          22189:        matcher->targets = xmlSchemaItemListCreate();
        !          22190:     return(matcher->targets);
        !          22191: }
        !          22192: 
        !          22193: /**
        !          22194:  * xmlSchemaIDCFreeKey:
        !          22195:  * @key: the IDC key
        !          22196:  *
        !          22197:  * Frees an IDC key together with its compiled value.
        !          22198:  */
        !          22199: static void
        !          22200: xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key)
        !          22201: {
        !          22202:     if (key->val != NULL)
        !          22203:        xmlSchemaFreeValue(key->val);
        !          22204:     xmlFree(key);
        !          22205: }
        !          22206: 
        !          22207: /**
        !          22208:  * xmlSchemaIDCFreeBinding:
        !          22209:  *
        !          22210:  * Frees an IDC binding. Note that the node table-items
        !          22211:  * are not freed.
        !          22212:  */
        !          22213: static void
        !          22214: xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind)
        !          22215: {
        !          22216:     if (bind->nodeTable != NULL)
        !          22217:        xmlFree(bind->nodeTable);
        !          22218:     if (bind->dupls != NULL)
        !          22219:        xmlSchemaItemListFree(bind->dupls);
        !          22220:     xmlFree(bind);
        !          22221: }
        !          22222: 
        !          22223: /**
        !          22224:  * xmlSchemaIDCFreeIDCTable:
        !          22225:  * @bind: the first IDC binding in the list
        !          22226:  *
        !          22227:  * Frees an IDC table, i.e. all the IDC bindings in the list.
        !          22228:  */
        !          22229: static void
        !          22230: xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind)
        !          22231: {
        !          22232:     xmlSchemaPSVIIDCBindingPtr prev;
        !          22233: 
        !          22234:     while (bind != NULL) {
        !          22235:        prev = bind;
        !          22236:        bind = bind->next;
        !          22237:        xmlSchemaIDCFreeBinding(prev);
        !          22238:     }
        !          22239: }
        !          22240: 
        !          22241: /**
        !          22242:  * xmlSchemaIDCFreeMatcherList:
        !          22243:  * @matcher: the first IDC matcher in the list
        !          22244:  *
        !          22245:  * Frees a list of IDC matchers.
        !          22246:  */
        !          22247: static void
        !          22248: xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
        !          22249: {
        !          22250:     xmlSchemaIDCMatcherPtr next;
        !          22251: 
        !          22252:     while (matcher != NULL) {
        !          22253:        next = matcher->next;
        !          22254:        if (matcher->keySeqs != NULL) {
        !          22255:            int i;
        !          22256:            for (i = 0; i < matcher->sizeKeySeqs; i++)
        !          22257:                if (matcher->keySeqs[i] != NULL)
        !          22258:                    xmlFree(matcher->keySeqs[i]);
        !          22259:            xmlFree(matcher->keySeqs);
        !          22260:        }
        !          22261:        if (matcher->targets != NULL) {
        !          22262:            if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          22263:                int i;
        !          22264:                xmlSchemaPSVIIDCNodePtr idcNode;
        !          22265:                /*
        !          22266:                * Node-table items for keyrefs are not stored globally
        !          22267:                * to the validation context, since they are not bubbled.
        !          22268:                * We need to free them here.
        !          22269:                */
        !          22270:                for (i = 0; i < matcher->targets->nbItems; i++) {
        !          22271:                    idcNode =
        !          22272:                        (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
        !          22273:                    xmlFree(idcNode->keys);
        !          22274:                    xmlFree(idcNode);
        !          22275:                }
        !          22276:            }
        !          22277:            xmlSchemaItemListFree(matcher->targets);
        !          22278:        }
        !          22279:        xmlFree(matcher);
        !          22280:        matcher = next;
        !          22281:     }
        !          22282: }
        !          22283: 
        !          22284: /**
        !          22285:  * xmlSchemaIDCReleaseMatcherList:
        !          22286:  * @vctxt: the WXS validation context
        !          22287:  * @matcher: the first IDC matcher in the list
        !          22288:  *
        !          22289:  * Caches a list of IDC matchers for reuse.
        !          22290:  */
        !          22291: static void
        !          22292: xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
        !          22293:                               xmlSchemaIDCMatcherPtr matcher)
        !          22294: {
        !          22295:     xmlSchemaIDCMatcherPtr next;
        !          22296: 
        !          22297:     while (matcher != NULL) {
        !          22298:        next = matcher->next;
        !          22299:        if (matcher->keySeqs != NULL) {
        !          22300:            int i;
        !          22301:            /*
        !          22302:            * Don't free the array, but only the content.
        !          22303:            */
        !          22304:            for (i = 0; i < matcher->sizeKeySeqs; i++)
        !          22305:                if (matcher->keySeqs[i] != NULL) {
        !          22306:                    xmlFree(matcher->keySeqs[i]);
        !          22307:                    matcher->keySeqs[i] = NULL;
        !          22308:                }
        !          22309:        }
        !          22310:        if (matcher->targets) {
        !          22311:            if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          22312:                int i;
        !          22313:                xmlSchemaPSVIIDCNodePtr idcNode;
        !          22314:                /*
        !          22315:                * Node-table items for keyrefs are not stored globally
        !          22316:                * to the validation context, since they are not bubbled.
        !          22317:                * We need to free them here.
        !          22318:                */
        !          22319:                for (i = 0; i < matcher->targets->nbItems; i++) {
        !          22320:                    idcNode =
        !          22321:                        (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
        !          22322:                    xmlFree(idcNode->keys);
        !          22323:                    xmlFree(idcNode);
        !          22324:                }
        !          22325:            }
        !          22326:            xmlSchemaItemListFree(matcher->targets);
        !          22327:            matcher->targets = NULL;
        !          22328:        }
        !          22329:        matcher->next = NULL;
        !          22330:        /*
        !          22331:        * Cache the matcher.
        !          22332:        */
        !          22333:        if (vctxt->idcMatcherCache != NULL)
        !          22334:            matcher->nextCached = vctxt->idcMatcherCache;
        !          22335:        vctxt->idcMatcherCache = matcher;
        !          22336: 
        !          22337:        matcher = next;
        !          22338:     }
        !          22339: }
        !          22340: 
        !          22341: /**
        !          22342:  * xmlSchemaIDCAddStateObject:
        !          22343:  * @vctxt: the WXS validation context
        !          22344:  * @matcher: the IDC matcher
        !          22345:  * @sel: the XPath information
        !          22346:  * @parent: the parent "selector" state object if any
        !          22347:  * @type: "selector" or "field"
        !          22348:  *
        !          22349:  * Creates/reuses and activates state objects for the given
        !          22350:  * XPath information; if the XPath expression consists of unions,
        !          22351:  * multiple state objects are created for every unioned expression.
        !          22352:  *
        !          22353:  * Returns 0 on success and -1 on internal errors.
        !          22354:  */
        !          22355: static int
        !          22356: xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
        !          22357:                        xmlSchemaIDCMatcherPtr matcher,
        !          22358:                        xmlSchemaIDCSelectPtr sel,
        !          22359:                        int type)
        !          22360: {
        !          22361:     xmlSchemaIDCStateObjPtr sto;
        !          22362: 
        !          22363:     /*
        !          22364:     * Reuse the state objects from the pool.
        !          22365:     */
        !          22366:     if (vctxt->xpathStatePool != NULL) {
        !          22367:        sto = vctxt->xpathStatePool;
        !          22368:        vctxt->xpathStatePool = sto->next;
        !          22369:        sto->next = NULL;
        !          22370:     } else {
        !          22371:        /*
        !          22372:        * Create a new state object.
        !          22373:        */
        !          22374:        sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj));
        !          22375:        if (sto == NULL) {
        !          22376:            xmlSchemaVErrMemory(NULL,
        !          22377:                "allocating an IDC state object", NULL);
        !          22378:            return (-1);
        !          22379:        }
        !          22380:        memset(sto, 0, sizeof(xmlSchemaIDCStateObj));
        !          22381:     }
        !          22382:     /*
        !          22383:     * Add to global list.
        !          22384:     */
        !          22385:     if (vctxt->xpathStates != NULL)
        !          22386:        sto->next = vctxt->xpathStates;
        !          22387:     vctxt->xpathStates = sto;
        !          22388: 
        !          22389:     /*
        !          22390:     * Free the old xpath validation context.
        !          22391:     */
        !          22392:     if (sto->xpathCtxt != NULL)
        !          22393:        xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
        !          22394: 
        !          22395:     /*
        !          22396:     * Create a new XPath (pattern) validation context.
        !          22397:     */
        !          22398:     sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt(
        !          22399:        (xmlPatternPtr) sel->xpathComp);
        !          22400:     if (sto->xpathCtxt == NULL) {
        !          22401:        VERROR_INT("xmlSchemaIDCAddStateObject",
        !          22402:            "failed to create an XPath validation context");
        !          22403:        return (-1);
        !          22404:     }
        !          22405:     sto->type = type;
        !          22406:     sto->depth = vctxt->depth;
        !          22407:     sto->matcher = matcher;
        !          22408:     sto->sel = sel;
        !          22409:     sto->nbHistory = 0;
        !          22410: 
        !          22411: #ifdef DEBUG_IDC
        !          22412:     xmlGenericError(xmlGenericErrorContext, "IDC:   STO push '%s'\n",
        !          22413:        sto->sel->xpath);
        !          22414: #endif
        !          22415:     return (0);
        !          22416: }
        !          22417: 
        !          22418: /**
        !          22419:  * xmlSchemaXPathEvaluate:
        !          22420:  * @vctxt: the WXS validation context
        !          22421:  * @nodeType: the nodeType of the current node
        !          22422:  *
        !          22423:  * Evaluates all active XPath state objects.
        !          22424:  *
        !          22425:  * Returns the number of IC "field" state objects which resolved to
        !          22426:  * this node, 0 if none resolved and -1 on internal errors.
        !          22427:  */
        !          22428: static int
        !          22429: xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
        !          22430:                       xmlElementType nodeType)
        !          22431: {
        !          22432:     xmlSchemaIDCStateObjPtr sto, head = NULL, first;
        !          22433:     int res, resolved = 0, depth = vctxt->depth;
        !          22434: 
        !          22435:     if (vctxt->xpathStates == NULL)
        !          22436:        return (0);
        !          22437: 
        !          22438:     if (nodeType == XML_ATTRIBUTE_NODE)
        !          22439:        depth++;
        !          22440: #ifdef DEBUG_IDC
        !          22441:     {
        !          22442:        xmlChar *str = NULL;
        !          22443:        xmlGenericError(xmlGenericErrorContext,
        !          22444:            "IDC: EVAL on %s, depth %d, type %d\n",
        !          22445:            xmlSchemaFormatQName(&str, vctxt->inode->nsName,
        !          22446:                vctxt->inode->localName), depth, nodeType);
        !          22447:        FREE_AND_NULL(str)
        !          22448:     }
        !          22449: #endif
        !          22450:     /*
        !          22451:     * Process all active XPath state objects.
        !          22452:     */
        !          22453:     first = vctxt->xpathStates;
        !          22454:     sto = first;
        !          22455:     while (sto != head) {
        !          22456: #ifdef DEBUG_IDC
        !          22457:        if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR)
        !          22458:            xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] selector '%s'\n",
        !          22459:                sto->matcher->aidc->def->name, sto->sel->xpath);
        !          22460:        else
        !          22461:            xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] field '%s'\n",
        !          22462:                sto->matcher->aidc->def->name, sto->sel->xpath);
        !          22463: #endif
        !          22464:        if (nodeType == XML_ELEMENT_NODE)
        !          22465:            res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
        !          22466:                vctxt->inode->localName, vctxt->inode->nsName);
        !          22467:        else
        !          22468:            res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
        !          22469:                vctxt->inode->localName, vctxt->inode->nsName);
        !          22470: 
        !          22471:        if (res == -1) {
        !          22472:            VERROR_INT("xmlSchemaXPathEvaluate",
        !          22473:                "calling xmlStreamPush()");
        !          22474:            return (-1);
        !          22475:        }
        !          22476:        if (res == 0)
        !          22477:            goto next_sto;
        !          22478:        /*
        !          22479:        * Full match.
        !          22480:        */
        !          22481: #ifdef DEBUG_IDC
        !          22482:        xmlGenericError(xmlGenericErrorContext, "IDC:     "
        !          22483:            "MATCH\n");
        !          22484: #endif
        !          22485:        /*
        !          22486:        * Register a match in the state object history.
        !          22487:        */
        !          22488:        if (sto->history == NULL) {
        !          22489:            sto->history = (int *) xmlMalloc(5 * sizeof(int));
        !          22490:            if (sto->history == NULL) {
        !          22491:                xmlSchemaVErrMemory(NULL,
        !          22492:                    "allocating the state object history", NULL);
        !          22493:                return(-1);
        !          22494:            }
        !          22495:            sto->sizeHistory = 5;
        !          22496:        } else if (sto->sizeHistory <= sto->nbHistory) {
        !          22497:            sto->sizeHistory *= 2;
        !          22498:            sto->history = (int *) xmlRealloc(sto->history,
        !          22499:                sto->sizeHistory * sizeof(int));
        !          22500:            if (sto->history == NULL) {
        !          22501:                xmlSchemaVErrMemory(NULL,
        !          22502:                    "re-allocating the state object history", NULL);
        !          22503:                return(-1);
        !          22504:            }
        !          22505:        }
        !          22506:        sto->history[sto->nbHistory++] = depth;
        !          22507: 
        !          22508: #ifdef DEBUG_IDC
        !          22509:        xmlGenericError(xmlGenericErrorContext, "IDC:       push match '%d'\n",
        !          22510:            vctxt->depth);
        !          22511: #endif
        !          22512: 
        !          22513:        if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
        !          22514:            xmlSchemaIDCSelectPtr sel;
        !          22515:            /*
        !          22516:            * Activate state objects for the IDC fields of
        !          22517:            * the IDC selector.
        !          22518:            */
        !          22519: #ifdef DEBUG_IDC
        !          22520:            xmlGenericError(xmlGenericErrorContext, "IDC:     "
        !          22521:                "activating field states\n");
        !          22522: #endif
        !          22523:            sel = sto->matcher->aidc->def->fields;
        !          22524:            while (sel != NULL) {
        !          22525:                if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
        !          22526:                    sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
        !          22527:                    return (-1);
        !          22528:                sel = sel->next;
        !          22529:            }
        !          22530:        } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
        !          22531:            /*
        !          22532:            * An IDC key node was found by the IDC field.
        !          22533:            */
        !          22534: #ifdef DEBUG_IDC
        !          22535:            xmlGenericError(xmlGenericErrorContext,
        !          22536:                "IDC:     key found\n");
        !          22537: #endif
        !          22538:            /*
        !          22539:            * Notify that the character value of this node is
        !          22540:            * needed.
        !          22541:            */
        !          22542:            if (resolved == 0) {
        !          22543:                if ((vctxt->inode->flags &
        !          22544:                    XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
        !          22545:                vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
        !          22546:            }
        !          22547:            resolved++;
        !          22548:        }
        !          22549: next_sto:
        !          22550:        if (sto->next == NULL) {
        !          22551:            /*
        !          22552:            * Evaluate field state objects created on this node as well.
        !          22553:            */
        !          22554:            head = first;
        !          22555:            sto = vctxt->xpathStates;
        !          22556:        } else
        !          22557:            sto = sto->next;
        !          22558:     }
        !          22559:     return (resolved);
        !          22560: }
        !          22561: 
        !          22562: static const xmlChar *
        !          22563: xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
        !          22564:                              xmlChar **buf,
        !          22565:                              xmlSchemaPSVIIDCKeyPtr *seq,
        !          22566:                              int count)
        !          22567: {
        !          22568:     int i, res;
        !          22569:     xmlChar *value = NULL;
        !          22570: 
        !          22571:     *buf = xmlStrdup(BAD_CAST "[");
        !          22572:     for (i = 0; i < count; i++) {
        !          22573:        *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          22574:        res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val,
        !          22575:            xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type),
        !          22576:            &value);
        !          22577:        if (res == 0)
        !          22578:            *buf = xmlStrcat(*buf, BAD_CAST value);
        !          22579:        else {
        !          22580:            VERROR_INT("xmlSchemaFormatIDCKeySequence",
        !          22581:                "failed to compute a canonical value");
        !          22582:            *buf = xmlStrcat(*buf, BAD_CAST "???");
        !          22583:        }
        !          22584:        if (i < count -1)
        !          22585:            *buf = xmlStrcat(*buf, BAD_CAST "', ");
        !          22586:        else
        !          22587:            *buf = xmlStrcat(*buf, BAD_CAST "'");
        !          22588:        if (value != NULL) {
        !          22589:            xmlFree(value);
        !          22590:            value = NULL;
        !          22591:        }
        !          22592:     }
        !          22593:     *buf = xmlStrcat(*buf, BAD_CAST "]");
        !          22594: 
        !          22595:     return (BAD_CAST *buf);
        !          22596: }
        !          22597: 
        !          22598: /**
        !          22599:  * xmlSchemaXPathPop:
        !          22600:  * @vctxt: the WXS validation context
        !          22601:  *
        !          22602:  * Pops all XPath states.
        !          22603:  *
        !          22604:  * Returns 0 on success and -1 on internal errors.
        !          22605:  */
        !          22606: static int
        !          22607: xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
        !          22608: {
        !          22609:     xmlSchemaIDCStateObjPtr sto;
        !          22610:     int res;
        !          22611: 
        !          22612:     if (vctxt->xpathStates == NULL)
        !          22613:        return(0);
        !          22614:     sto = vctxt->xpathStates;
        !          22615:     do {
        !          22616:        res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
        !          22617:        if (res == -1)
        !          22618:            return (-1);
        !          22619:        sto = sto->next;
        !          22620:     } while (sto != NULL);
        !          22621:     return(0);
        !          22622: }
        !          22623: 
        !          22624: /**
        !          22625:  * xmlSchemaXPathProcessHistory:
        !          22626:  * @vctxt: the WXS validation context
        !          22627:  * @type: the simple/complex type of the current node if any at all
        !          22628:  * @val: the precompiled value
        !          22629:  *
        !          22630:  * Processes and pops the history items of the IDC state objects.
        !          22631:  * IDC key-sequences are validated/created on IDC bindings.
        !          22632:  *
        !          22633:  * Returns 0 on success and -1 on internal errors.
        !          22634:  */
        !          22635: static int
        !          22636: xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
        !          22637:                             int depth)
        !          22638: {
        !          22639:     xmlSchemaIDCStateObjPtr sto, nextsto;
        !          22640:     int res, matchDepth;
        !          22641:     xmlSchemaPSVIIDCKeyPtr key = NULL;
        !          22642:     xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL;
        !          22643: 
        !          22644:     if (vctxt->xpathStates == NULL)
        !          22645:        return (0);
        !          22646:     sto = vctxt->xpathStates;
        !          22647: 
        !          22648: #ifdef DEBUG_IDC
        !          22649:     {
        !          22650:        xmlChar *str = NULL;
        !          22651:        xmlGenericError(xmlGenericErrorContext,
        !          22652:            "IDC: BACK on %s, depth %d\n",
        !          22653:            xmlSchemaFormatQName(&str, vctxt->inode->nsName,
        !          22654:                vctxt->inode->localName), vctxt->depth);
        !          22655:        FREE_AND_NULL(str)
        !          22656:     }
        !          22657: #endif
        !          22658:     /*
        !          22659:     * Evaluate the state objects.
        !          22660:     */
        !          22661:     while (sto != NULL) {
        !          22662:        res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
        !          22663:        if (res == -1) {
        !          22664:            VERROR_INT("xmlSchemaXPathProcessHistory",
        !          22665:                "calling xmlStreamPop()");
        !          22666:            return (-1);
        !          22667:        }
        !          22668: #ifdef DEBUG_IDC
        !          22669:        xmlGenericError(xmlGenericErrorContext, "IDC:   stream pop '%s'\n",
        !          22670:            sto->sel->xpath);
        !          22671: #endif
        !          22672:        if (sto->nbHistory == 0)
        !          22673:            goto deregister_check;
        !          22674: 
        !          22675:        matchDepth = sto->history[sto->nbHistory -1];
        !          22676: 
        !          22677:        /*
        !          22678:        * Only matches at the current depth are of interest.
        !          22679:        */
        !          22680:        if (matchDepth != depth) {
        !          22681:            sto = sto->next;
        !          22682:            continue;
        !          22683:        }
        !          22684:        if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
        !          22685:            /*
        !          22686:            * NOTE: According to
        !          22687:            *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198
        !          22688:            *   ... the simple-content of complex types is also allowed.
        !          22689:            */
        !          22690: 
        !          22691:            if (WXS_IS_COMPLEX(type)) {
        !          22692:                if (WXS_HAS_SIMPLE_CONTENT(type)) {
        !          22693:                    /*
        !          22694:                    * Sanity check for complex types with simple content.
        !          22695:                    */
        !          22696:                    simpleType = type->contentTypeDef;
        !          22697:                    if (simpleType == NULL) {
        !          22698:                        VERROR_INT("xmlSchemaXPathProcessHistory",
        !          22699:                            "field resolves to a CT with simple content "
        !          22700:                            "but the CT is missing the ST definition");
        !          22701:                        return (-1);
        !          22702:                    }
        !          22703:                } else
        !          22704:                    simpleType = NULL;
        !          22705:            } else
        !          22706:                simpleType = type;
        !          22707:            if (simpleType == NULL) {
        !          22708:                xmlChar *str = NULL;
        !          22709: 
        !          22710:                /*
        !          22711:                * Not qualified if the field resolves to a node of non
        !          22712:                * simple type.
        !          22713:                */
        !          22714:                xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          22715:                    XML_SCHEMAV_CVC_IDC, NULL,
        !          22716:                    WXS_BASIC_CAST sto->matcher->aidc->def,
        !          22717:                    "The XPath '%s' of a field of %s does evaluate to a node of "
        !          22718:                    "non-simple type",
        !          22719:                    sto->sel->xpath,
        !          22720:                    xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def));
        !          22721:                FREE_AND_NULL(str);
        !          22722:                sto->nbHistory--;
        !          22723:                goto deregister_check;
        !          22724:            }
        !          22725: 
        !          22726:            if ((key == NULL) && (vctxt->inode->val == NULL)) {
        !          22727:                /*
        !          22728:                * Failed to provide the normalized value; maybe
        !          22729:                * the value was invalid.
        !          22730:                */
        !          22731:                VERROR(XML_SCHEMAV_CVC_IDC,
        !          22732:                    WXS_BASIC_CAST sto->matcher->aidc->def,
        !          22733:                    "Warning: No precomputed value available, the value "
        !          22734:                    "was either invalid or something strange happend");
        !          22735:                sto->nbHistory--;
        !          22736:                goto deregister_check;
        !          22737:            } else {
        !          22738:                xmlSchemaIDCMatcherPtr matcher = sto->matcher;
        !          22739:                xmlSchemaPSVIIDCKeyPtr *keySeq;
        !          22740:                int pos, idx;
        !          22741: 
        !          22742:                /*
        !          22743:                * The key will be anchored on the matcher's list of
        !          22744:                * key-sequences. The position in this list is determined
        !          22745:                * by the target node's depth relative to the matcher's
        !          22746:                * depth of creation (i.e. the depth of the scope element).
        !          22747:                *
        !          22748:                * Element        Depth    Pos   List-entries
        !          22749:                * <scope>          0              NULL
        !          22750:                *   <bar>          1              NULL
        !          22751:                *     <target/>    2       2      target
        !          22752:                *   <bar>
        !          22753:                 * </scope>
        !          22754:                *
        !          22755:                * The size of the list is only dependant on the depth of
        !          22756:                * the tree.
        !          22757:                * An entry will be NULLed in selector_leave, i.e. when
        !          22758:                * we hit the target's
        !          22759:                */
        !          22760:                pos = sto->depth - matcher->depth;
        !          22761:                idx = sto->sel->index;
        !          22762: 
        !          22763:                /*
        !          22764:                * Create/grow the array of key-sequences.
        !          22765:                */
        !          22766:                if (matcher->keySeqs == NULL) {
        !          22767:                    if (pos > 9)
        !          22768:                        matcher->sizeKeySeqs = pos * 2;
        !          22769:                    else
        !          22770:                        matcher->sizeKeySeqs = 10;
        !          22771:                    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
        !          22772:                        xmlMalloc(matcher->sizeKeySeqs *
        !          22773:                        sizeof(xmlSchemaPSVIIDCKeyPtr *));
        !          22774:                    if (matcher->keySeqs == NULL) {
        !          22775:                        xmlSchemaVErrMemory(NULL,
        !          22776:                            "allocating an array of key-sequences",
        !          22777:                            NULL);
        !          22778:                        return(-1);
        !          22779:                    }
        !          22780:                    memset(matcher->keySeqs, 0,
        !          22781:                        matcher->sizeKeySeqs *
        !          22782:                        sizeof(xmlSchemaPSVIIDCKeyPtr *));
        !          22783:                } else if (pos >= matcher->sizeKeySeqs) {
        !          22784:                    int i = matcher->sizeKeySeqs;
        !          22785: 
        !          22786:                    matcher->sizeKeySeqs *= 2;
        !          22787:                    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
        !          22788:                        xmlRealloc(matcher->keySeqs,
        !          22789:                        matcher->sizeKeySeqs *
        !          22790:                        sizeof(xmlSchemaPSVIIDCKeyPtr *));
        !          22791:                    if (matcher->keySeqs == NULL) {
        !          22792:                        xmlSchemaVErrMemory(NULL,
        !          22793:                            "reallocating an array of key-sequences",
        !          22794:                            NULL);
        !          22795:                        return (-1);
        !          22796:                    }
        !          22797:                    /*
        !          22798:                    * The array needs to be NULLed.
        !          22799:                    * TODO: Use memset?
        !          22800:                    */
        !          22801:                    for (; i < matcher->sizeKeySeqs; i++)
        !          22802:                        matcher->keySeqs[i] = NULL;
        !          22803:                }
        !          22804: 
        !          22805:                /*
        !          22806:                * Get/create the key-sequence.
        !          22807:                */
        !          22808:                keySeq = matcher->keySeqs[pos];
        !          22809:                if (keySeq == NULL) {
        !          22810:                    goto create_sequence;
        !          22811:                } else if (keySeq[idx] != NULL) {
        !          22812:                    xmlChar *str = NULL;
        !          22813:                    /*
        !          22814:                    * cvc-identity-constraint:
        !          22815:                    * 3 For each node in the �target node set� all
        !          22816:                    * of the {fields}, with that node as the context
        !          22817:                    * node, evaluate to either an empty node-set or
        !          22818:                    * a node-set with exactly one member, which must
        !          22819:                    * have a simple type.
        !          22820:                    *
        !          22821:                    * The key was already set; report an error.
        !          22822:                    */
        !          22823:                    xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          22824:                        XML_SCHEMAV_CVC_IDC, NULL,
        !          22825:                        WXS_BASIC_CAST matcher->aidc->def,
        !          22826:                        "The XPath '%s' of a field of %s evaluates to a "
        !          22827:                        "node-set with more than one member",
        !          22828:                        sto->sel->xpath,
        !          22829:                        xmlSchemaGetIDCDesignation(&str, matcher->aidc->def));
        !          22830:                    FREE_AND_NULL(str);
        !          22831:                    sto->nbHistory--;
        !          22832:                    goto deregister_check;
        !          22833:                } else
        !          22834:                    goto create_key;
        !          22835: 
        !          22836: create_sequence:
        !          22837:                /*
        !          22838:                * Create a key-sequence.
        !          22839:                */
        !          22840:                keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc(
        !          22841:                    matcher->aidc->def->nbFields *
        !          22842:                    sizeof(xmlSchemaPSVIIDCKeyPtr));
        !          22843:                if (keySeq == NULL) {
        !          22844:                    xmlSchemaVErrMemory(NULL,
        !          22845:                        "allocating an IDC key-sequence", NULL);
        !          22846:                    return(-1);
        !          22847:                }
        !          22848:                memset(keySeq, 0, matcher->aidc->def->nbFields *
        !          22849:                    sizeof(xmlSchemaPSVIIDCKeyPtr));
        !          22850:                matcher->keySeqs[pos] = keySeq;
        !          22851: create_key:
        !          22852:                /*
        !          22853:                * Create a key once per node only.
        !          22854:                */
        !          22855:                if (key == NULL) {
        !          22856:                    key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc(
        !          22857:                        sizeof(xmlSchemaPSVIIDCKey));
        !          22858:                    if (key == NULL) {
        !          22859:                        xmlSchemaVErrMemory(NULL,
        !          22860:                            "allocating a IDC key", NULL);
        !          22861:                        xmlFree(keySeq);
        !          22862:                        matcher->keySeqs[pos] = NULL;
        !          22863:                        return(-1);
        !          22864:                    }
        !          22865:                    /*
        !          22866:                    * Consume the compiled value.
        !          22867:                    */
        !          22868:                    key->type = simpleType;
        !          22869:                    key->val = vctxt->inode->val;
        !          22870:                    vctxt->inode->val = NULL;
        !          22871:                    /*
        !          22872:                    * Store the key in a global list.
        !          22873:                    */
        !          22874:                    if (xmlSchemaIDCStoreKey(vctxt, key) == -1) {
        !          22875:                        xmlSchemaIDCFreeKey(key);
        !          22876:                        return (-1);
        !          22877:                    }
        !          22878:                }
        !          22879:                keySeq[idx] = key;
        !          22880:            }
        !          22881:        } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
        !          22882: 
        !          22883:            xmlSchemaPSVIIDCKeyPtr **keySeq = NULL;
        !          22884:            /* xmlSchemaPSVIIDCBindingPtr bind; */
        !          22885:            xmlSchemaPSVIIDCNodePtr ntItem;
        !          22886:            xmlSchemaIDCMatcherPtr matcher;
        !          22887:            xmlSchemaIDCPtr idc;
        !          22888:            xmlSchemaItemListPtr targets;
        !          22889:            int pos, i, j, nbKeys;
        !          22890:            /*
        !          22891:            * Here we have the following scenario:
        !          22892:            * An IDC 'selector' state object resolved to a target node,
        !          22893:            * during the time this target node was in the
        !          22894:            * ancestor-or-self axis, the 'field' state object(s) looked
        !          22895:            * out for matching nodes to create a key-sequence for this
        !          22896:            * target node. Now we are back to this target node and need
        !          22897:            * to put the key-sequence, together with the target node
        !          22898:            * itself, into the node-table of the corresponding IDC
        !          22899:            * binding.
        !          22900:            */
        !          22901:            matcher = sto->matcher;
        !          22902:            idc = matcher->aidc->def;
        !          22903:            nbKeys = idc->nbFields;
        !          22904:            pos = depth - matcher->depth;
        !          22905:            /*
        !          22906:            * Check if the matcher has any key-sequences at all, plus
        !          22907:            * if it has a key-sequence for the current target node.
        !          22908:            */
        !          22909:            if ((matcher->keySeqs == NULL) ||
        !          22910:                (matcher->sizeKeySeqs <= pos)) {
        !          22911:                if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
        !          22912:                    goto selector_key_error;
        !          22913:                else
        !          22914:                    goto selector_leave;
        !          22915:            }
        !          22916: 
        !          22917:            keySeq = &(matcher->keySeqs[pos]);
        !          22918:            if (*keySeq == NULL) {
        !          22919:                if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
        !          22920:                    goto selector_key_error;
        !          22921:                else
        !          22922:                    goto selector_leave;
        !          22923:            }
        !          22924: 
        !          22925:            for (i = 0; i < nbKeys; i++) {
        !          22926:                if ((*keySeq)[i] == NULL) {
        !          22927:                    /*
        !          22928:                    * Not qualified, if not all fields did resolve.
        !          22929:                    */
        !          22930:                    if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
        !          22931:                        /*
        !          22932:                        * All fields of a "key" IDC must resolve.
        !          22933:                        */
        !          22934:                        goto selector_key_error;
        !          22935:                    }
        !          22936:                    goto selector_leave;
        !          22937:                }
        !          22938:            }
        !          22939:            /*
        !          22940:            * All fields did resolve.
        !          22941:            */
        !          22942: 
        !          22943:            /*
        !          22944:            * 4.1 If the {identity-constraint category} is unique(/key),
        !          22945:            * then no two members of the �qualified node set� have
        !          22946:            * �key-sequences� whose members are pairwise equal, as
        !          22947:            * defined by Equal in [XML Schemas: Datatypes].
        !          22948:            *
        !          22949:            * Get the IDC binding from the matcher and check for
        !          22950:            * duplicate key-sequences.
        !          22951:            */
        !          22952: #if 0
        !          22953:            bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
        !          22954: #endif
        !          22955:            targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
        !          22956:            if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
        !          22957:                (targets->nbItems != 0)) {
        !          22958:                xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
        !          22959: 
        !          22960:                i = 0;
        !          22961:                res = 0;
        !          22962:                /*
        !          22963:                * Compare the key-sequences, key by key.
        !          22964:                */
        !          22965:                do {
        !          22966:                    bkeySeq =
        !          22967:                        ((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys;
        !          22968:                    for (j = 0; j < nbKeys; j++) {
        !          22969:                        ckey = (*keySeq)[j];
        !          22970:                        bkey = bkeySeq[j];
        !          22971:                        res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
        !          22972:                        if (res == -1) {
        !          22973:                            return (-1);
        !          22974:                        } else if (res == 0) {
        !          22975:                            /*
        !          22976:                            * One of the keys differs, so the key-sequence
        !          22977:                            * won't be equal; get out.
        !          22978:                            */
        !          22979:                            break;
        !          22980:                        }
        !          22981:                    }
        !          22982:                    if (res == 1) {
        !          22983:                        /*
        !          22984:                        * Duplicate key-sequence found.
        !          22985:                        */
        !          22986:                        break;
        !          22987:                    }
        !          22988:                    i++;
        !          22989:                } while (i < targets->nbItems);
        !          22990:                if (i != targets->nbItems) {
        !          22991:                    xmlChar *str = NULL, *strB = NULL;
        !          22992:                    /*
        !          22993:                    * TODO: Try to report the key-sequence.
        !          22994:                    */
        !          22995:                    xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          22996:                        XML_SCHEMAV_CVC_IDC, NULL,
        !          22997:                        WXS_BASIC_CAST idc,
        !          22998:                        "Duplicate key-sequence %s in %s",
        !          22999:                        xmlSchemaFormatIDCKeySequence(vctxt, &str,
        !          23000:                            (*keySeq), nbKeys),
        !          23001:                        xmlSchemaGetIDCDesignation(&strB, idc));
        !          23002:                    FREE_AND_NULL(str);
        !          23003:                    FREE_AND_NULL(strB);
        !          23004:                    goto selector_leave;
        !          23005:                }
        !          23006:            }
        !          23007:            /*
        !          23008:            * Add a node-table item to the IDC binding.
        !          23009:            */
        !          23010:            ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc(
        !          23011:                sizeof(xmlSchemaPSVIIDCNode));
        !          23012:            if (ntItem == NULL) {
        !          23013:                xmlSchemaVErrMemory(NULL,
        !          23014:                    "allocating an IDC node-table item", NULL);
        !          23015:                xmlFree(*keySeq);
        !          23016:                *keySeq = NULL;
        !          23017:                return(-1);
        !          23018:            }
        !          23019:            memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode));
        !          23020: 
        !          23021:            /*
        !          23022:            * Store the node-table item in a global list.
        !          23023:            */
        !          23024:            if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          23025:                if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
        !          23026:                    xmlFree(ntItem);
        !          23027:                    xmlFree(*keySeq);
        !          23028:                    *keySeq = NULL;
        !          23029:                    return (-1);
        !          23030:                }
        !          23031:                ntItem->nodeQNameID = -1;
        !          23032:            } else {
        !          23033:                /*
        !          23034:                * Save a cached QName for this node on the IDC node, to be
        !          23035:                * able to report it, even if the node is not saved.
        !          23036:                */
        !          23037:                ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
        !          23038:                    vctxt->inode->localName, vctxt->inode->nsName);
        !          23039:                if (ntItem->nodeQNameID == -1) {
        !          23040:                    xmlFree(ntItem);
        !          23041:                    xmlFree(*keySeq);
        !          23042:                    *keySeq = NULL;
        !          23043:                    return (-1);
        !          23044:                }
        !          23045:            }
        !          23046:            /*
        !          23047:            * Init the node-table item: Save the node, position and
        !          23048:            * consume the key-sequence.
        !          23049:            */
        !          23050:            ntItem->node = vctxt->node;
        !          23051:            ntItem->nodeLine = vctxt->inode->nodeLine;
        !          23052:            ntItem->keys = *keySeq;
        !          23053:            *keySeq = NULL;
        !          23054: #if 0
        !          23055:            if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1)
        !          23056: #endif
        !          23057:            if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
        !          23058:                if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          23059:                    /*
        !          23060:                    * Free the item, since keyref items won't be
        !          23061:                    * put on a global list.
        !          23062:                    */
        !          23063:                    xmlFree(ntItem->keys);
        !          23064:                    xmlFree(ntItem);
        !          23065:                }
        !          23066:                return (-1);
        !          23067:            }
        !          23068: 
        !          23069:            goto selector_leave;
        !          23070: selector_key_error:
        !          23071:            {
        !          23072:                xmlChar *str = NULL;
        !          23073:                /*
        !          23074:                * 4.2.1 (KEY) The �target node set� and the
        !          23075:                * �qualified node set� are equal, that is, every
        !          23076:                * member of the �target node set� is also a member
        !          23077:                * of the �qualified node set� and vice versa.
        !          23078:                */
        !          23079:                xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          23080:                    XML_SCHEMAV_CVC_IDC, NULL,
        !          23081:                    WXS_BASIC_CAST idc,
        !          23082:                    "Not all fields of %s evaluate to a node",
        !          23083:                    xmlSchemaGetIDCDesignation(&str, idc), NULL);
        !          23084:                FREE_AND_NULL(str);
        !          23085:            }
        !          23086: selector_leave:
        !          23087:            /*
        !          23088:            * Free the key-sequence if not added to the IDC table.
        !          23089:            */
        !          23090:            if ((keySeq != NULL) && (*keySeq != NULL)) {
        !          23091:                xmlFree(*keySeq);
        !          23092:                *keySeq = NULL;
        !          23093:            }
        !          23094:        } /* if selector */
        !          23095: 
        !          23096:        sto->nbHistory--;
        !          23097: 
        !          23098: deregister_check:
        !          23099:        /*
        !          23100:        * Deregister state objects if they reach the depth of creation.
        !          23101:        */
        !          23102:        if ((sto->nbHistory == 0) && (sto->depth == depth)) {
        !          23103: #ifdef DEBUG_IDC
        !          23104:            xmlGenericError(xmlGenericErrorContext, "IDC:   STO pop '%s'\n",
        !          23105:                sto->sel->xpath);
        !          23106: #endif
        !          23107:            if (vctxt->xpathStates != sto) {
        !          23108:                VERROR_INT("xmlSchemaXPathProcessHistory",
        !          23109:                    "The state object to be removed is not the first "
        !          23110:                    "in the list");
        !          23111:            }
        !          23112:            nextsto = sto->next;
        !          23113:            /*
        !          23114:            * Unlink from the list of active XPath state objects.
        !          23115:            */
        !          23116:            vctxt->xpathStates = sto->next;
        !          23117:            sto->next = vctxt->xpathStatePool;
        !          23118:            /*
        !          23119:            * Link it to the pool of reusable state objects.
        !          23120:            */
        !          23121:            vctxt->xpathStatePool = sto;
        !          23122:            sto = nextsto;
        !          23123:        } else
        !          23124:            sto = sto->next;
        !          23125:     } /* while (sto != NULL) */
        !          23126:     return (0);
        !          23127: }
        !          23128: 
        !          23129: /**
        !          23130:  * xmlSchemaIDCRegisterMatchers:
        !          23131:  * @vctxt: the WXS validation context
        !          23132:  * @elemDecl: the element declaration
        !          23133:  *
        !          23134:  * Creates helper objects to evaluate IDC selectors/fields
        !          23135:  * successively.
        !          23136:  *
        !          23137:  * Returns 0 if OK and -1 on internal errors.
        !          23138:  */
        !          23139: static int
        !          23140: xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
        !          23141:                             xmlSchemaElementPtr elemDecl)
        !          23142: {
        !          23143:     xmlSchemaIDCMatcherPtr matcher, last = NULL;
        !          23144:     xmlSchemaIDCPtr idc, refIdc;
        !          23145:     xmlSchemaIDCAugPtr aidc;
        !          23146: 
        !          23147:     idc = (xmlSchemaIDCPtr) elemDecl->idcs;
        !          23148:     if (idc == NULL)
        !          23149:        return (0);
        !          23150: 
        !          23151: #ifdef DEBUG_IDC
        !          23152:     {
        !          23153:        xmlChar *str = NULL;
        !          23154:        xmlGenericError(xmlGenericErrorContext,
        !          23155:            "IDC: REGISTER on %s, depth %d\n",
        !          23156:            (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName,
        !          23157:                vctxt->inode->localName), vctxt->depth);
        !          23158:        FREE_AND_NULL(str)
        !          23159:     }
        !          23160: #endif
        !          23161:     if (vctxt->inode->idcMatchers != NULL) {
        !          23162:        VERROR_INT("xmlSchemaIDCRegisterMatchers",
        !          23163:            "The chain of IDC matchers is expected to be empty");
        !          23164:        return (-1);
        !          23165:     }
        !          23166:     do {
        !          23167:        if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
        !          23168:            /*
        !          23169:            * Since IDCs bubbles are expensive we need to know the
        !          23170:            * depth at which the bubbles should stop; this will be
        !          23171:            * the depth of the top-most keyref IDC. If no keyref
        !          23172:            * references a key/unique IDC, the keyrefDepth will
        !          23173:            * be -1, indicating that no bubbles are needed.
        !          23174:            */
        !          23175:            refIdc = (xmlSchemaIDCPtr) idc->ref->item;
        !          23176:            if (refIdc != NULL) {
        !          23177:                /*
        !          23178:                * Remember that we have keyrefs on this node.
        !          23179:                */
        !          23180:                vctxt->inode->hasKeyrefs = 1;
        !          23181:                /*
        !          23182:                * Lookup the referenced augmented IDC info.
        !          23183:                */
        !          23184:                aidc = vctxt->aidcs;
        !          23185:                while (aidc != NULL) {
        !          23186:                    if (aidc->def == refIdc)
        !          23187:                        break;
        !          23188:                    aidc = aidc->next;
        !          23189:                }
        !          23190:                if (aidc == NULL) {
        !          23191:                    VERROR_INT("xmlSchemaIDCRegisterMatchers",
        !          23192:                        "Could not find an augmented IDC item for an IDC "
        !          23193:                        "definition");
        !          23194:                    return (-1);
        !          23195:                }
        !          23196:                if ((aidc->keyrefDepth == -1) ||
        !          23197:                    (vctxt->depth < aidc->keyrefDepth))
        !          23198:                    aidc->keyrefDepth = vctxt->depth;
        !          23199:            }
        !          23200:        }
        !          23201:        /*
        !          23202:        * Lookup the augmented IDC item for the IDC definition.
        !          23203:        */
        !          23204:        aidc = vctxt->aidcs;
        !          23205:        while (aidc != NULL) {
        !          23206:            if (aidc->def == idc)
        !          23207:                break;
        !          23208:            aidc = aidc->next;
        !          23209:        }
        !          23210:        if (aidc == NULL) {
        !          23211:            VERROR_INT("xmlSchemaIDCRegisterMatchers",
        !          23212:                "Could not find an augmented IDC item for an IDC definition");
        !          23213:            return (-1);
        !          23214:        }
        !          23215:        /*
        !          23216:        * Create an IDC matcher for every IDC definition.
        !          23217:        */
        !          23218:        if (vctxt->idcMatcherCache != NULL) {
        !          23219:            /*
        !          23220:            * Reuse a cached matcher.
        !          23221:            */
        !          23222:            matcher = vctxt->idcMatcherCache;
        !          23223:            vctxt->idcMatcherCache = matcher->nextCached;
        !          23224:            matcher->nextCached = NULL;
        !          23225:        } else {
        !          23226:            matcher = (xmlSchemaIDCMatcherPtr)
        !          23227:                xmlMalloc(sizeof(xmlSchemaIDCMatcher));
        !          23228:            if (matcher == NULL) {
        !          23229:                xmlSchemaVErrMemory(vctxt,
        !          23230:                    "allocating an IDC matcher", NULL);
        !          23231:                return (-1);
        !          23232:            }
        !          23233:            memset(matcher, 0, sizeof(xmlSchemaIDCMatcher));
        !          23234:        }
        !          23235:        if (last == NULL)
        !          23236:            vctxt->inode->idcMatchers = matcher;
        !          23237:        else
        !          23238:            last->next = matcher;
        !          23239:        last = matcher;
        !          23240: 
        !          23241:        matcher->type = IDC_MATCHER;
        !          23242:        matcher->depth = vctxt->depth;
        !          23243:        matcher->aidc = aidc;
        !          23244:        matcher->idcType = aidc->def->type;
        !          23245: #ifdef DEBUG_IDC
        !          23246:        xmlGenericError(xmlGenericErrorContext, "IDC:   register matcher\n");
        !          23247: #endif
        !          23248:        /*
        !          23249:        * Init the automaton state object.
        !          23250:        */
        !          23251:        if (xmlSchemaIDCAddStateObject(vctxt, matcher,
        !          23252:            idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
        !          23253:            return (-1);
        !          23254: 
        !          23255:        idc = idc->next;
        !          23256:     } while (idc != NULL);
        !          23257:     return (0);
        !          23258: }
        !          23259: 
        !          23260: static int
        !          23261: xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
        !          23262:                           xmlSchemaNodeInfoPtr ielem)
        !          23263: {
        !          23264:     xmlSchemaPSVIIDCBindingPtr bind;
        !          23265:     int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable;
        !          23266:     xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys;
        !          23267:     xmlSchemaPSVIIDCNodePtr *targets, *dupls;
        !          23268: 
        !          23269:     xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
        !          23270:     /* vctxt->createIDCNodeTables */
        !          23271:     while (matcher != NULL) {
        !          23272:        /*
        !          23273:        * Skip keyref IDCs and empty IDC target-lists.
        !          23274:        */
        !          23275:        if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
        !          23276:            WXS_ILIST_IS_EMPTY(matcher->targets))
        !          23277:        {
        !          23278:            matcher = matcher->next;
        !          23279:            continue;
        !          23280:        }
        !          23281:        /*
        !          23282:        * If we _want_ the IDC node-table to be created in any case
        !          23283:        * then do so. Otherwise create them only if keyrefs need them.
        !          23284:        */
        !          23285:        if ((! vctxt->createIDCNodeTables) &&
        !          23286:            ((matcher->aidc->keyrefDepth == -1) ||
        !          23287:             (matcher->aidc->keyrefDepth > vctxt->depth)))
        !          23288:        {
        !          23289:            matcher = matcher->next;
        !          23290:            continue;
        !          23291:        }
        !          23292:        /*
        !          23293:        * Get/create the IDC binding on this element for the IDC definition.
        !          23294:        */
        !          23295:        bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
        !          23296: 
        !          23297:        if (! WXS_ILIST_IS_EMPTY(bind->dupls)) {
        !          23298:            dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items;
        !          23299:            nbDupls = bind->dupls->nbItems;
        !          23300:        } else {
        !          23301:            dupls = NULL;
        !          23302:            nbDupls = 0;
        !          23303:        }
        !          23304:        if (bind->nodeTable != NULL) {
        !          23305:            nbNodeTable = bind->nbNodes;
        !          23306:        } else {
        !          23307:            nbNodeTable = 0;
        !          23308:        }
        !          23309: 
        !          23310:        if ((nbNodeTable == 0) && (nbDupls == 0)) {
        !          23311:            /*
        !          23312:            * Transfer all IDC target-nodes to the IDC node-table.
        !          23313:            */
        !          23314:            bind->nodeTable =
        !          23315:                (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
        !          23316:            bind->sizeNodes = matcher->targets->sizeItems;
        !          23317:            bind->nbNodes = matcher->targets->nbItems;
        !          23318: 
        !          23319:            matcher->targets->items = NULL;
        !          23320:            matcher->targets->sizeItems = 0;
        !          23321:            matcher->targets->nbItems = 0;
        !          23322:        } else {
        !          23323:            /*
        !          23324:            * Compare the key-sequences and add to the IDC node-table.
        !          23325:            */
        !          23326:            nbTargets = matcher->targets->nbItems;
        !          23327:            targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
        !          23328:            nbFields = matcher->aidc->def->nbFields;
        !          23329:            i = 0;
        !          23330:            do {
        !          23331:                keys = targets[i]->keys;
        !          23332:                if (nbDupls) {
        !          23333:                    /*
        !          23334:                    * Search in already found duplicates first.
        !          23335:                    */
        !          23336:                    j = 0;
        !          23337:                    do {
        !          23338:                        if (nbFields == 1) {
        !          23339:                            res = xmlSchemaAreValuesEqual(keys[0]->val,
        !          23340:                                dupls[j]->keys[0]->val);
        !          23341:                            if (res == -1)
        !          23342:                                goto internal_error;
        !          23343:                            if (res == 1) {
        !          23344:                                /*
        !          23345:                                * Equal key-sequence.
        !          23346:                                */
        !          23347:                                goto next_target;
        !          23348:                            }
        !          23349:                        } else {
        !          23350:                            res = 0;
        !          23351:                            ntkeys = dupls[j]->keys;
        !          23352:                            for (k = 0; k < nbFields; k++) {
        !          23353:                                res = xmlSchemaAreValuesEqual(keys[k]->val,
        !          23354:                                    ntkeys[k]->val);
        !          23355:                                if (res == -1)
        !          23356:                                    goto internal_error;
        !          23357:                                if (res == 0) {
        !          23358:                                    /*
        !          23359:                                    * One of the keys differs.
        !          23360:                                    */
        !          23361:                                    break;
        !          23362:                                }
        !          23363:                            }
        !          23364:                            if (res == 1) {
        !          23365:                                /*
        !          23366:                                * Equal key-sequence found.
        !          23367:                                */
        !          23368:                                goto next_target;
        !          23369:                            }
        !          23370:                        }
        !          23371:                        j++;
        !          23372:                    } while (j < nbDupls);
        !          23373:                }
        !          23374:                if (nbNodeTable) {
        !          23375:                    j = 0;
        !          23376:                    do {
        !          23377:                        if (nbFields == 1) {
        !          23378:                            res = xmlSchemaAreValuesEqual(keys[0]->val,
        !          23379:                                bind->nodeTable[j]->keys[0]->val);
        !          23380:                            if (res == -1)
        !          23381:                                goto internal_error;
        !          23382:                            if (res == 0) {
        !          23383:                                /*
        !          23384:                                * The key-sequence differs.
        !          23385:                                */
        !          23386:                                goto next_node_table_entry;
        !          23387:                            }
        !          23388:                        } else {
        !          23389:                            res = 0;
        !          23390:                            ntkeys = bind->nodeTable[j]->keys;
        !          23391:                            for (k = 0; k < nbFields; k++) {
        !          23392:                                res = xmlSchemaAreValuesEqual(keys[k]->val,
        !          23393:                                    ntkeys[k]->val);
        !          23394:                                if (res == -1)
        !          23395:                                    goto internal_error;
        !          23396:                                if (res == 0) {
        !          23397:                                    /*
        !          23398:                                    * One of the keys differs.
        !          23399:                                    */
        !          23400:                                    goto next_node_table_entry;
        !          23401:                                }
        !          23402:                            }
        !          23403:                        }
        !          23404:                        /*
        !          23405:                        * Add the duplicate to the list of duplicates.
        !          23406:                        */
        !          23407:                        if (bind->dupls == NULL) {
        !          23408:                            bind->dupls = xmlSchemaItemListCreate();
        !          23409:                            if (bind->dupls == NULL)
        !          23410:                                goto internal_error;
        !          23411:                        }
        !          23412:                        if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1)
        !          23413:                            goto internal_error;
        !          23414:                        /*
        !          23415:                        * Remove the duplicate entry from the IDC node-table.
        !          23416:                        */
        !          23417:                        bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1];
        !          23418:                        bind->nbNodes--;
        !          23419: 
        !          23420:                        goto next_target;
        !          23421: 
        !          23422: next_node_table_entry:
        !          23423:                        j++;
        !          23424:                    } while (j < nbNodeTable);
        !          23425:                }
        !          23426:                /*
        !          23427:                * If everything is fine, then add the IDC target-node to
        !          23428:                * the IDC node-table.
        !          23429:                */
        !          23430:                if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1)
        !          23431:                    goto internal_error;
        !          23432: 
        !          23433: next_target:
        !          23434:                i++;
        !          23435:            } while (i < nbTargets);
        !          23436:        }
        !          23437:        matcher = matcher->next;
        !          23438:     }
        !          23439:     return(0);
        !          23440: 
        !          23441: internal_error:
        !          23442:     return(-1);
        !          23443: }
        !          23444: 
        !          23445: /**
        !          23446:  * xmlSchemaBubbleIDCNodeTables:
        !          23447:  * @depth: the current tree depth
        !          23448:  *
        !          23449:  * Merges IDC bindings of an element at @depth into the corresponding IDC
        !          23450:  * bindings of its parent element. If a duplicate note-table entry is found,
        !          23451:  * both, the parent node-table entry and child entry are discarded from the
        !          23452:  * node-table of the parent.
        !          23453:  *
        !          23454:  * Returns 0 if OK and -1 on internal errors.
        !          23455:  */
        !          23456: static int
        !          23457: xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
        !          23458: {
        !          23459:     xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */
        !          23460:     xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */
        !          23461:     xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */
        !          23462:     xmlSchemaIDCAugPtr aidc;
        !          23463:     int i, j, k, ret = 0, nbFields, oldNum, oldDupls;
        !          23464: 
        !          23465:     bind = vctxt->inode->idcTable;
        !          23466:     if (bind == NULL) {
        !          23467:        /* Fine, no table, no bubbles. */
        !          23468:        return (0);
        !          23469:     }
        !          23470: 
        !          23471:     parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
        !          23472:     /*
        !          23473:     * Walk all bindings; create new or add to existing bindings.
        !          23474:     * Remove duplicate key-sequences.
        !          23475:     */
        !          23476:     while (bind != NULL) {
        !          23477: 
        !          23478:        if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls))
        !          23479:            goto next_binding;
        !          23480:        /*
        !          23481:        * Check if the key/unique IDC table needs to be bubbled.
        !          23482:        */
        !          23483:        if (! vctxt->createIDCNodeTables) {
        !          23484:            aidc = vctxt->aidcs;
        !          23485:            do {
        !          23486:                if (aidc->def == bind->definition) {
        !          23487:                    if ((aidc->keyrefDepth == -1) ||
        !          23488:                        (aidc->keyrefDepth >= vctxt->depth)) {
        !          23489:                        goto next_binding;
        !          23490:                    }
        !          23491:                    break;
        !          23492:                }
        !          23493:                aidc = aidc->next;
        !          23494:            } while (aidc != NULL);
        !          23495:        }
        !          23496: 
        !          23497:        if (parTable != NULL)
        !          23498:            parBind = *parTable;
        !          23499:        /*
        !          23500:        * Search a matching parent binding for the
        !          23501:        * IDC definition.
        !          23502:        */
        !          23503:        while (parBind != NULL) {
        !          23504:            if (parBind->definition == bind->definition)
        !          23505:                break;
        !          23506:            parBind = parBind->next;
        !          23507:        }
        !          23508: 
        !          23509:        if (parBind != NULL) {
        !          23510:            /*
        !          23511:            * Compare every node-table entry of the child node,
        !          23512:            * i.e. the key-sequence within, ...
        !          23513:            */
        !          23514:            oldNum = parBind->nbNodes; /* Skip newly added items. */
        !          23515: 
        !          23516:            if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
        !          23517:                oldDupls = parBind->dupls->nbItems;
        !          23518:                dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
        !          23519:            } else {
        !          23520:                dupls = NULL;
        !          23521:                oldDupls = 0;
        !          23522:            }
        !          23523: 
        !          23524:            parNodes = parBind->nodeTable;
        !          23525:            nbFields = bind->definition->nbFields;
        !          23526: 
        !          23527:            for (i = 0; i < bind->nbNodes; i++) {
        !          23528:                node = bind->nodeTable[i];
        !          23529:                if (node == NULL)
        !          23530:                    continue;
        !          23531:                /*
        !          23532:                * ...with every key-sequence of the parent node, already
        !          23533:                * evaluated to be a duplicate key-sequence.
        !          23534:                */
        !          23535:                if (oldDupls) {
        !          23536:                    j = 0;
        !          23537:                    while (j < oldDupls) {
        !          23538:                        if (nbFields == 1) {
        !          23539:                            ret = xmlSchemaAreValuesEqual(
        !          23540:                                node->keys[0]->val,
        !          23541:                                dupls[j]->keys[0]->val);
        !          23542:                            if (ret == -1)
        !          23543:                                goto internal_error;
        !          23544:                            if (ret == 0) {
        !          23545:                                j++;
        !          23546:                                continue;
        !          23547:                            }
        !          23548:                        } else {
        !          23549:                            parNode = dupls[j];
        !          23550:                            for (k = 0; k < nbFields; k++) {
        !          23551:                                ret = xmlSchemaAreValuesEqual(
        !          23552:                                    node->keys[k]->val,
        !          23553:                                    parNode->keys[k]->val);
        !          23554:                                if (ret == -1)
        !          23555:                                    goto internal_error;
        !          23556:                                if (ret == 0)
        !          23557:                                    break;
        !          23558:                            }
        !          23559:                        }
        !          23560:                        if (ret == 1)
        !          23561:                            /* Duplicate found. */
        !          23562:                            break;
        !          23563:                        j++;
        !          23564:                    }
        !          23565:                    if (j != oldDupls) {
        !          23566:                        /* Duplicate found. Skip this entry. */
        !          23567:                        continue;
        !          23568:                    }
        !          23569:                }
        !          23570:                /*
        !          23571:                * ... and with every key-sequence of the parent node.
        !          23572:                */
        !          23573:                if (oldNum) {
        !          23574:                    j = 0;
        !          23575:                    while (j < oldNum) {
        !          23576:                        parNode = parNodes[j];
        !          23577:                        if (nbFields == 1) {
        !          23578:                            ret = xmlSchemaAreValuesEqual(
        !          23579:                                node->keys[0]->val,
        !          23580:                                parNode->keys[0]->val);
        !          23581:                            if (ret == -1)
        !          23582:                                goto internal_error;
        !          23583:                            if (ret == 0) {
        !          23584:                                j++;
        !          23585:                                continue;
        !          23586:                            }
        !          23587:                        } else {
        !          23588:                            for (k = 0; k < nbFields; k++) {
        !          23589:                                ret = xmlSchemaAreValuesEqual(
        !          23590:                                    node->keys[k]->val,
        !          23591:                                    parNode->keys[k]->val);
        !          23592:                                if (ret == -1)
        !          23593:                                    goto internal_error;
        !          23594:                                if (ret == 0)
        !          23595:                                    break;
        !          23596:                            }
        !          23597:                        }
        !          23598:                        if (ret == 1)
        !          23599:                            /* Duplicate found. */
        !          23600:                            break;
        !          23601:                        j++;
        !          23602:                    }
        !          23603:                    if (j != oldNum) {
        !          23604:                        /*
        !          23605:                        * Handle duplicates. Move the duplicate in
        !          23606:                        * the parent's node-table to the list of
        !          23607:                        * duplicates.
        !          23608:                        */
        !          23609:                        oldNum--;
        !          23610:                        parBind->nbNodes--;
        !          23611:                        /*
        !          23612:                        * Move last old item to pos of duplicate.
        !          23613:                        */
        !          23614:                        parNodes[j] = parNodes[oldNum];
        !          23615: 
        !          23616:                        if (parBind->nbNodes != oldNum) {
        !          23617:                            /*
        !          23618:                            * If new items exist, move last new item to
        !          23619:                            * last of old items.
        !          23620:                            */
        !          23621:                            parNodes[oldNum] =
        !          23622:                                parNodes[parBind->nbNodes];
        !          23623:                        }
        !          23624:                        if (parBind->dupls == NULL) {
        !          23625:                            parBind->dupls = xmlSchemaItemListCreate();
        !          23626:                            if (parBind->dupls == NULL)
        !          23627:                                goto internal_error;
        !          23628:                        }
        !          23629:                        xmlSchemaItemListAdd(parBind->dupls, parNode);
        !          23630:                    } else {
        !          23631:                        /*
        !          23632:                        * Add the node-table entry (node and key-sequence) of
        !          23633:                        * the child node to the node table of the parent node.
        !          23634:                        */
        !          23635:                        if (parBind->nodeTable == NULL) {
        !          23636:                            parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
        !          23637:                                xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
        !          23638:                            if (parBind->nodeTable == NULL) {
        !          23639:                                xmlSchemaVErrMemory(NULL,
        !          23640:                                    "allocating IDC list of node-table items", NULL);
        !          23641:                                goto internal_error;
        !          23642:                            }
        !          23643:                            parBind->sizeNodes = 1;
        !          23644:                        } else if (parBind->nbNodes >= parBind->sizeNodes) {
        !          23645:                            parBind->sizeNodes *= 2;
        !          23646:                            parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
        !          23647:                                xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
        !          23648:                                sizeof(xmlSchemaPSVIIDCNodePtr));
        !          23649:                            if (parBind->nodeTable == NULL) {
        !          23650:                                xmlSchemaVErrMemory(NULL,
        !          23651:                                    "re-allocating IDC list of node-table items", NULL);
        !          23652:                                goto internal_error;
        !          23653:                            }
        !          23654:                        }
        !          23655:                        parNodes = parBind->nodeTable;
        !          23656:                        /*
        !          23657:                        * Append the new node-table entry to the 'new node-table
        !          23658:                        * entries' section.
        !          23659:                        */
        !          23660:                        parNodes[parBind->nbNodes++] = node;
        !          23661:                    }
        !          23662: 
        !          23663:                }
        !          23664: 
        !          23665:            }
        !          23666:        } else {
        !          23667:            /*
        !          23668:            * No binding for the IDC was found: create a new one and
        !          23669:            * copy all node-tables.
        !          23670:            */
        !          23671:            parBind = xmlSchemaIDCNewBinding(bind->definition);
        !          23672:            if (parBind == NULL)
        !          23673:                goto internal_error;
        !          23674: 
        !          23675:            /*
        !          23676:            * TODO: Hmm, how to optimize the initial number of
        !          23677:            * allocated entries?
        !          23678:            */
        !          23679:            if (bind->nbNodes != 0) {
        !          23680:                /*
        !          23681:                * Add all IDC node-table entries.
        !          23682:                */
        !          23683:                if (! vctxt->psviExposeIDCNodeTables) {
        !          23684:                    /*
        !          23685:                    * Just move the entries.
        !          23686:                    * NOTE: this is quite save here, since
        !          23687:                    * all the keyref lookups have already been
        !          23688:                    * performed.
        !          23689:                    */
        !          23690:                    parBind->nodeTable = bind->nodeTable;
        !          23691:                    bind->nodeTable = NULL;
        !          23692:                    parBind->sizeNodes = bind->sizeNodes;
        !          23693:                    bind->sizeNodes = 0;
        !          23694:                    parBind->nbNodes = bind->nbNodes;
        !          23695:                    bind->nbNodes = 0;
        !          23696:                } else {
        !          23697:                    /*
        !          23698:                    * Copy the entries.
        !          23699:                    */
        !          23700:                    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
        !          23701:                        xmlMalloc(bind->nbNodes *
        !          23702:                        sizeof(xmlSchemaPSVIIDCNodePtr));
        !          23703:                    if (parBind->nodeTable == NULL) {
        !          23704:                        xmlSchemaVErrMemory(NULL,
        !          23705:                            "allocating an array of IDC node-table "
        !          23706:                            "items", NULL);
        !          23707:                        xmlSchemaIDCFreeBinding(parBind);
        !          23708:                        goto internal_error;
        !          23709:                    }
        !          23710:                    parBind->sizeNodes = bind->nbNodes;
        !          23711:                    parBind->nbNodes = bind->nbNodes;
        !          23712:                    memcpy(parBind->nodeTable, bind->nodeTable,
        !          23713:                        bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr));
        !          23714:                }
        !          23715:            }
        !          23716:            if (bind->dupls) {
        !          23717:                /*
        !          23718:                * Move the duplicates.
        !          23719:                */
        !          23720:                if (parBind->dupls != NULL)
        !          23721:                    xmlSchemaItemListFree(parBind->dupls);
        !          23722:                parBind->dupls = bind->dupls;
        !          23723:                bind->dupls = NULL;
        !          23724:            }
        !          23725:             if (parTable != NULL) {
        !          23726:                 if (*parTable == NULL)
        !          23727:                     *parTable = parBind;
        !          23728:                 else {
        !          23729:                     parBind->next = *parTable;
        !          23730:                     *parTable = parBind;
        !          23731:                 }
        !          23732:             }
        !          23733:        }
        !          23734: 
        !          23735: next_binding:
        !          23736:        bind = bind->next;
        !          23737:     }
        !          23738:     return (0);
        !          23739: 
        !          23740: internal_error:
        !          23741:     return(-1);
        !          23742: }
        !          23743: 
        !          23744: /**
        !          23745:  * xmlSchemaCheckCVCIDCKeyRef:
        !          23746:  * @vctxt: the WXS validation context
        !          23747:  * @elemDecl: the element declaration
        !          23748:  *
        !          23749:  * Check the cvc-idc-keyref constraints.
        !          23750:  */
        !          23751: static int
        !          23752: xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
        !          23753: {
        !          23754:     xmlSchemaIDCMatcherPtr matcher;
        !          23755:     xmlSchemaPSVIIDCBindingPtr bind;
        !          23756: 
        !          23757:     matcher = vctxt->inode->idcMatchers;
        !          23758:     /*
        !          23759:     * Find a keyref.
        !          23760:     */
        !          23761:     while (matcher != NULL) {
        !          23762:        if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
        !          23763:            matcher->targets &&
        !          23764:            matcher->targets->nbItems)
        !          23765:        {
        !          23766:            int i, j, k, res, nbFields, hasDupls;
        !          23767:            xmlSchemaPSVIIDCKeyPtr *refKeys, *keys;
        !          23768:            xmlSchemaPSVIIDCNodePtr refNode = NULL;
        !          23769: 
        !          23770:            nbFields = matcher->aidc->def->nbFields;
        !          23771: 
        !          23772:            /*
        !          23773:            * Find the IDC node-table for the referenced IDC key/unique.
        !          23774:            */
        !          23775:            bind = vctxt->inode->idcTable;
        !          23776:            while (bind != NULL) {
        !          23777:                if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
        !          23778:                    bind->definition)
        !          23779:                    break;
        !          23780:                bind = bind->next;
        !          23781:            }
        !          23782:            hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0;
        !          23783:            /*
        !          23784:            * Search for a matching key-sequences.
        !          23785:            */
        !          23786:            for (i = 0; i < matcher->targets->nbItems; i++) {
        !          23787:                res = 0;
        !          23788:                refNode = matcher->targets->items[i];
        !          23789:                if (bind != NULL) {
        !          23790:                    refKeys = refNode->keys;
        !          23791:                    for (j = 0; j < bind->nbNodes; j++) {
        !          23792:                        keys = bind->nodeTable[j]->keys;
        !          23793:                        for (k = 0; k < nbFields; k++) {
        !          23794:                            res = xmlSchemaAreValuesEqual(keys[k]->val,
        !          23795:                                refKeys[k]->val);
        !          23796:                            if (res == 0)
        !          23797:                                break;
        !          23798:                            else if (res == -1) {
        !          23799:                                return (-1);
        !          23800:                            }
        !          23801:                        }
        !          23802:                        if (res == 1) {
        !          23803:                            /*
        !          23804:                            * Match found.
        !          23805:                            */
        !          23806:                            break;
        !          23807:                        }
        !          23808:                    }
        !          23809:                    if ((res == 0) && hasDupls) {
        !          23810:                        /*
        !          23811:                        * Search in duplicates
        !          23812:                        */
        !          23813:                        for (j = 0; j < bind->dupls->nbItems; j++) {
        !          23814:                            keys = ((xmlSchemaPSVIIDCNodePtr)
        !          23815:                                bind->dupls->items[j])->keys;
        !          23816:                            for (k = 0; k < nbFields; k++) {
        !          23817:                                res = xmlSchemaAreValuesEqual(keys[k]->val,
        !          23818:                                    refKeys[k]->val);
        !          23819:                                if (res == 0)
        !          23820:                                    break;
        !          23821:                                else if (res == -1) {
        !          23822:                                    return (-1);
        !          23823:                                }
        !          23824:                            }
        !          23825:                            if (res == 1) {
        !          23826:                                /*
        !          23827:                                * Match in duplicates found.
        !          23828:                                */
        !          23829:                                xmlChar *str = NULL, *strB = NULL;
        !          23830:                                xmlSchemaKeyrefErr(vctxt,
        !          23831:                                    XML_SCHEMAV_CVC_IDC, refNode,
        !          23832:                                    (xmlSchemaTypePtr) matcher->aidc->def,
        !          23833:                                    "More than one match found for "
        !          23834:                                    "key-sequence %s of keyref '%s'",
        !          23835:                                    xmlSchemaFormatIDCKeySequence(vctxt, &str,
        !          23836:                                        refNode->keys, nbFields),
        !          23837:                                    xmlSchemaGetComponentQName(&strB,
        !          23838:                                        matcher->aidc->def));
        !          23839:                                FREE_AND_NULL(str);
        !          23840:                                FREE_AND_NULL(strB);
        !          23841:                                break;
        !          23842:                            }
        !          23843:                        }
        !          23844:                    }
        !          23845:                }
        !          23846: 
        !          23847:                if (res == 0) {
        !          23848:                    xmlChar *str = NULL, *strB = NULL;
        !          23849:                    xmlSchemaKeyrefErr(vctxt,
        !          23850:                        XML_SCHEMAV_CVC_IDC, refNode,
        !          23851:                        (xmlSchemaTypePtr) matcher->aidc->def,
        !          23852:                        "No match found for key-sequence %s of keyref '%s'",
        !          23853:                        xmlSchemaFormatIDCKeySequence(vctxt, &str,
        !          23854:                            refNode->keys, nbFields),
        !          23855:                        xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
        !          23856:                    FREE_AND_NULL(str);
        !          23857:                    FREE_AND_NULL(strB);
        !          23858:                }
        !          23859:            }
        !          23860:        }
        !          23861:        matcher = matcher->next;
        !          23862:     }
        !          23863:     /* TODO: Return an error if any error encountered. */
        !          23864:     return (0);
        !          23865: }
        !          23866: 
        !          23867: /************************************************************************
        !          23868:  *                                                                     *
        !          23869:  *                     XML Reader validation code                      *
        !          23870:  *                                                                     *
        !          23871:  ************************************************************************/
        !          23872: 
        !          23873: static xmlSchemaAttrInfoPtr
        !          23874: xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
        !          23875: {
        !          23876:     xmlSchemaAttrInfoPtr iattr;
        !          23877:     /*
        !          23878:     * Grow/create list of attribute infos.
        !          23879:     */
        !          23880:     if (vctxt->attrInfos == NULL) {
        !          23881:        vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
        !          23882:            xmlMalloc(sizeof(xmlSchemaAttrInfoPtr));
        !          23883:        vctxt->sizeAttrInfos = 1;
        !          23884:        if (vctxt->attrInfos == NULL) {
        !          23885:            xmlSchemaVErrMemory(vctxt,
        !          23886:                "allocating attribute info list", NULL);
        !          23887:            return (NULL);
        !          23888:        }
        !          23889:     } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
        !          23890:        vctxt->sizeAttrInfos++;
        !          23891:        vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
        !          23892:            xmlRealloc(vctxt->attrInfos,
        !          23893:                vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr));
        !          23894:        if (vctxt->attrInfos == NULL) {
        !          23895:            xmlSchemaVErrMemory(vctxt,
        !          23896:                "re-allocating attribute info list", NULL);
        !          23897:            return (NULL);
        !          23898:        }
        !          23899:     } else {
        !          23900:        iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
        !          23901:        if (iattr->localName != NULL) {
        !          23902:            VERROR_INT("xmlSchemaGetFreshAttrInfo",
        !          23903:                "attr info not cleared");
        !          23904:            return (NULL);
        !          23905:        }
        !          23906:        iattr->nodeType = XML_ATTRIBUTE_NODE;
        !          23907:        return (iattr);
        !          23908:     }
        !          23909:     /*
        !          23910:     * Create an attribute info.
        !          23911:     */
        !          23912:     iattr = (xmlSchemaAttrInfoPtr)
        !          23913:        xmlMalloc(sizeof(xmlSchemaAttrInfo));
        !          23914:     if (iattr == NULL) {
        !          23915:        xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL);
        !          23916:        return (NULL);
        !          23917:     }
        !          23918:     memset(iattr, 0, sizeof(xmlSchemaAttrInfo));
        !          23919:     iattr->nodeType = XML_ATTRIBUTE_NODE;
        !          23920:     vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
        !          23921: 
        !          23922:     return (iattr);
        !          23923: }
        !          23924: 
        !          23925: static int
        !          23926: xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
        !          23927:                        xmlNodePtr attrNode,
        !          23928:                        int nodeLine,
        !          23929:                        const xmlChar *localName,
        !          23930:                        const xmlChar *nsName,
        !          23931:                        int ownedNames,
        !          23932:                        xmlChar *value,
        !          23933:                        int ownedValue)
        !          23934: {
        !          23935:     xmlSchemaAttrInfoPtr attr;
        !          23936: 
        !          23937:     attr = xmlSchemaGetFreshAttrInfo(vctxt);
        !          23938:     if (attr == NULL) {
        !          23939:        VERROR_INT("xmlSchemaPushAttribute",
        !          23940:            "calling xmlSchemaGetFreshAttrInfo()");
        !          23941:        return (-1);
        !          23942:     }
        !          23943:     attr->node = attrNode;
        !          23944:     attr->nodeLine = nodeLine;
        !          23945:     attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
        !          23946:     attr->localName = localName;
        !          23947:     attr->nsName = nsName;
        !          23948:     if (ownedNames)
        !          23949:        attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
        !          23950:     /*
        !          23951:     * Evaluate if it's an XSI attribute.
        !          23952:     */
        !          23953:     if (nsName != NULL) {
        !          23954:        if (xmlStrEqual(localName, BAD_CAST "nil")) {
        !          23955:            if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
        !          23956:                attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
        !          23957:            }
        !          23958:        } else if (xmlStrEqual(localName, BAD_CAST "type")) {
        !          23959:            if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
        !          23960:                attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
        !          23961:            }
        !          23962:        } else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) {
        !          23963:            if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
        !          23964:                attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
        !          23965:            }
        !          23966:        } else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) {
        !          23967:            if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
        !          23968:                attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
        !          23969:            }
        !          23970:        } else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) {
        !          23971:            attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
        !          23972:        }
        !          23973:     }
        !          23974:     attr->value = value;
        !          23975:     if (ownedValue)
        !          23976:        attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
        !          23977:     if (attr->metaType != 0)
        !          23978:        attr->state = XML_SCHEMAS_ATTR_META;
        !          23979:     return (0);
        !          23980: }
        !          23981: 
        !          23982: /**
        !          23983:  * xmlSchemaClearElemInfo:
        !          23984:  * @vctxt: the WXS validation context
        !          23985:  * @ielem: the element information item
        !          23986:  */
        !          23987: static void
        !          23988: xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
        !          23989:                       xmlSchemaNodeInfoPtr ielem)
        !          23990: {
        !          23991:     ielem->hasKeyrefs = 0;
        !          23992:     ielem->appliedXPath = 0;
        !          23993:     if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
        !          23994:        FREE_AND_NULL(ielem->localName);
        !          23995:        FREE_AND_NULL(ielem->nsName);
        !          23996:     } else {
        !          23997:        ielem->localName = NULL;
        !          23998:        ielem->nsName = NULL;
        !          23999:     }
        !          24000:     if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
        !          24001:        FREE_AND_NULL(ielem->value);
        !          24002:     } else {
        !          24003:        ielem->value = NULL;
        !          24004:     }
        !          24005:     if (ielem->val != NULL) {
        !          24006:        /*
        !          24007:        * PSVI TODO: Be careful not to free it when the value is
        !          24008:        * exposed via PSVI.
        !          24009:        */
        !          24010:        xmlSchemaFreeValue(ielem->val);
        !          24011:        ielem->val = NULL;
        !          24012:     }
        !          24013:     if (ielem->idcMatchers != NULL) {
        !          24014:        /*
        !          24015:        * REVISIT OPTIMIZE TODO: Use a pool of IDC matchers.
        !          24016:        *   Does it work?
        !          24017:        */
        !          24018:        xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
        !          24019: #if 0
        !          24020:        xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
        !          24021: #endif
        !          24022:        ielem->idcMatchers = NULL;
        !          24023:     }
        !          24024:     if (ielem->idcTable != NULL) {
        !          24025:        /*
        !          24026:        * OPTIMIZE TODO: Use a pool of IDC tables??.
        !          24027:        */
        !          24028:        xmlSchemaIDCFreeIDCTable(ielem->idcTable);
        !          24029:        ielem->idcTable = NULL;
        !          24030:     }
        !          24031:     if (ielem->regexCtxt != NULL) {
        !          24032:        xmlRegFreeExecCtxt(ielem->regexCtxt);
        !          24033:        ielem->regexCtxt = NULL;
        !          24034:     }
        !          24035:     if (ielem->nsBindings != NULL) {
        !          24036:        xmlFree((xmlChar **)ielem->nsBindings);
        !          24037:        ielem->nsBindings = NULL;
        !          24038:        ielem->nbNsBindings = 0;
        !          24039:        ielem->sizeNsBindings = 0;
        !          24040:     }
        !          24041: }
        !          24042: 
        !          24043: /**
        !          24044:  * xmlSchemaGetFreshElemInfo:
        !          24045:  * @vctxt: the schema validation context
        !          24046:  *
        !          24047:  * Creates/reuses and initializes the element info item for
        !          24048:  * the currect tree depth.
        !          24049:  *
        !          24050:  * Returns the element info item or NULL on API or internal errors.
        !          24051:  */
        !          24052: static xmlSchemaNodeInfoPtr
        !          24053: xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
        !          24054: {
        !          24055:     xmlSchemaNodeInfoPtr info = NULL;
        !          24056: 
        !          24057:     if (vctxt->depth > vctxt->sizeElemInfos) {
        !          24058:        VERROR_INT("xmlSchemaGetFreshElemInfo",
        !          24059:            "inconsistent depth encountered");
        !          24060:        return (NULL);
        !          24061:     }
        !          24062:     if (vctxt->elemInfos == NULL) {
        !          24063:        vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
        !          24064:            xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr));
        !          24065:        if (vctxt->elemInfos == NULL) {
        !          24066:            xmlSchemaVErrMemory(vctxt,
        !          24067:                "allocating the element info array", NULL);
        !          24068:            return (NULL);
        !          24069:        }
        !          24070:        memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr));
        !          24071:        vctxt->sizeElemInfos = 10;
        !          24072:     } else if (vctxt->sizeElemInfos <= vctxt->depth) {
        !          24073:        int i = vctxt->sizeElemInfos;
        !          24074: 
        !          24075:        vctxt->sizeElemInfos *= 2;
        !          24076:        vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
        !          24077:            xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
        !          24078:            sizeof(xmlSchemaNodeInfoPtr));
        !          24079:        if (vctxt->elemInfos == NULL) {
        !          24080:            xmlSchemaVErrMemory(vctxt,
        !          24081:                "re-allocating the element info array", NULL);
        !          24082:            return (NULL);
        !          24083:        }
        !          24084:        /*
        !          24085:        * We need the new memory to be NULLed.
        !          24086:        * TODO: Use memset instead?
        !          24087:        */
        !          24088:        for (; i < vctxt->sizeElemInfos; i++)
        !          24089:            vctxt->elemInfos[i] = NULL;
        !          24090:     } else
        !          24091:        info = vctxt->elemInfos[vctxt->depth];
        !          24092: 
        !          24093:     if (info == NULL) {
        !          24094:        info = (xmlSchemaNodeInfoPtr)
        !          24095:            xmlMalloc(sizeof(xmlSchemaNodeInfo));
        !          24096:        if (info == NULL) {
        !          24097:            xmlSchemaVErrMemory(vctxt,
        !          24098:                "allocating an element info", NULL);
        !          24099:            return (NULL);
        !          24100:        }
        !          24101:        vctxt->elemInfos[vctxt->depth] = info;
        !          24102:     } else {
        !          24103:        if (info->localName != NULL) {
        !          24104:            VERROR_INT("xmlSchemaGetFreshElemInfo",
        !          24105:                "elem info has not been cleared");
        !          24106:            return (NULL);
        !          24107:        }
        !          24108:     }
        !          24109:     memset(info, 0, sizeof(xmlSchemaNodeInfo));
        !          24110:     info->nodeType = XML_ELEMENT_NODE;
        !          24111:     info->depth = vctxt->depth;
        !          24112: 
        !          24113:     return (info);
        !          24114: }
        !          24115: 
        !          24116: #define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
        !          24117: #define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
        !          24118: #define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
        !          24119: 
        !          24120: static int
        !          24121: xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
        !          24122:                        xmlNodePtr node,
        !          24123:                        xmlSchemaTypePtr type,
        !          24124:                        xmlSchemaValType valType,
        !          24125:                        const xmlChar * value,
        !          24126:                        xmlSchemaValPtr val,
        !          24127:                        unsigned long length,
        !          24128:                        int fireErrors)
        !          24129: {
        !          24130:     int ret, error = 0;
        !          24131: 
        !          24132:     xmlSchemaTypePtr tmpType;
        !          24133:     xmlSchemaFacetLinkPtr facetLink;
        !          24134:     xmlSchemaFacetPtr facet;
        !          24135:     unsigned long len = 0;
        !          24136:     xmlSchemaWhitespaceValueType ws;
        !          24137: 
        !          24138:     /*
        !          24139:     * In Libxml2, derived built-in types have currently no explicit facets.
        !          24140:     */
        !          24141:     if (type->type == XML_SCHEMA_TYPE_BASIC)
        !          24142:        return (0);
        !          24143: 
        !          24144:     /*
        !          24145:     * NOTE: Do not jump away, if the facetSet of the given type is
        !          24146:     * empty: until now, "pattern" and "enumeration" facets of the
        !          24147:     * *base types* need to be checked as well.
        !          24148:     */
        !          24149:     if (type->facetSet == NULL)
        !          24150:        goto pattern_and_enum;
        !          24151: 
        !          24152:     if (! WXS_IS_ATOMIC(type)) {
        !          24153:        if (WXS_IS_LIST(type))
        !          24154:            goto WXS_IS_LIST;
        !          24155:        else
        !          24156:            goto pattern_and_enum;
        !          24157:     }
        !          24158:     /*
        !          24159:     * Whitespace handling is only of importance for string-based
        !          24160:     * types.
        !          24161:     */
        !          24162:     tmpType = xmlSchemaGetPrimitiveType(type);
        !          24163:     if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
        !          24164:        WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
        !          24165:        ws = xmlSchemaGetWhiteSpaceFacetValue(type);
        !          24166:     } else
        !          24167:        ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
        !          24168:     /*
        !          24169:     * If the value was not computed (for string or
        !          24170:     * anySimpleType based types), then use the provided
        !          24171:     * type.
        !          24172:     */
        !          24173:     if (val == NULL)
        !          24174:        valType = valType;
        !          24175:     else
        !          24176:        valType = xmlSchemaGetValType(val);
        !          24177: 
        !          24178:     ret = 0;
        !          24179:     for (facetLink = type->facetSet; facetLink != NULL;
        !          24180:        facetLink = facetLink->next) {
        !          24181:        /*
        !          24182:        * Skip the pattern "whiteSpace": it is used to
        !          24183:        * format the character content beforehand.
        !          24184:        */
        !          24185:        switch (facetLink->facet->type) {
        !          24186:            case XML_SCHEMA_FACET_WHITESPACE:
        !          24187:            case XML_SCHEMA_FACET_PATTERN:
        !          24188:            case XML_SCHEMA_FACET_ENUMERATION:
        !          24189:                continue;
        !          24190:            case XML_SCHEMA_FACET_LENGTH:
        !          24191:            case XML_SCHEMA_FACET_MINLENGTH:
        !          24192:            case XML_SCHEMA_FACET_MAXLENGTH:
        !          24193:                ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
        !          24194:                    valType, value, val, &len, ws);
        !          24195:                break;
        !          24196:            default:
        !          24197:                ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
        !          24198:                    valType, value, val, ws);
        !          24199:                break;
        !          24200:        }
        !          24201:        if (ret < 0) {
        !          24202:            AERROR_INT("xmlSchemaValidateFacets",
        !          24203:                "validating against a atomic type facet");
        !          24204:            return (-1);
        !          24205:        } else if (ret > 0) {
        !          24206:            if (fireErrors)
        !          24207:                xmlSchemaFacetErr(actxt, ret, node,
        !          24208:                value, len, type, facetLink->facet, NULL, NULL, NULL);
        !          24209:            else
        !          24210:                return (ret);
        !          24211:            if (error == 0)
        !          24212:                error = ret;
        !          24213:        }
        !          24214:        ret = 0;
        !          24215:     }
        !          24216: 
        !          24217: WXS_IS_LIST:
        !          24218:     if (! WXS_IS_LIST(type))
        !          24219:        goto pattern_and_enum;
        !          24220:     /*
        !          24221:     * "length", "minLength" and "maxLength" of list types.
        !          24222:     */
        !          24223:     ret = 0;
        !          24224:     for (facetLink = type->facetSet; facetLink != NULL;
        !          24225:        facetLink = facetLink->next) {
        !          24226: 
        !          24227:        switch (facetLink->facet->type) {
        !          24228:            case XML_SCHEMA_FACET_LENGTH:
        !          24229:            case XML_SCHEMA_FACET_MINLENGTH:
        !          24230:            case XML_SCHEMA_FACET_MAXLENGTH:
        !          24231:                ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
        !          24232:                    value, length, NULL);
        !          24233:                break;
        !          24234:            default:
        !          24235:                continue;
        !          24236:        }
        !          24237:        if (ret < 0) {
        !          24238:            AERROR_INT("xmlSchemaValidateFacets",
        !          24239:                "validating against a list type facet");
        !          24240:            return (-1);
        !          24241:        } else if (ret > 0) {
        !          24242:            if (fireErrors)
        !          24243:                xmlSchemaFacetErr(actxt, ret, node,
        !          24244:                value, length, type, facetLink->facet, NULL, NULL, NULL);
        !          24245:            else
        !          24246:                return (ret);
        !          24247:            if (error == 0)
        !          24248:                error = ret;
        !          24249:        }
        !          24250:        ret = 0;
        !          24251:     }
        !          24252: 
        !          24253: pattern_and_enum:
        !          24254:     if (error >= 0) {
        !          24255:        int found = 0;
        !          24256:        /*
        !          24257:        * Process enumerations. Facet values are in the value space
        !          24258:        * of the defining type's base type. This seems to be a bug in the
        !          24259:        * XML Schema 1.0 spec. Use the whitespace type of the base type.
        !          24260:        * Only the first set of enumerations in the ancestor-or-self axis
        !          24261:        * is used for validation.
        !          24262:        */
        !          24263:        ret = 0;
        !          24264:        tmpType = type;
        !          24265:        do {
        !          24266:            for (facet = tmpType->facets; facet != NULL; facet = facet->next) {
        !          24267:                if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
        !          24268:                    continue;
        !          24269:                found = 1;
        !          24270:                ret = xmlSchemaAreValuesEqual(facet->val, val);
        !          24271:                if (ret == 1)
        !          24272:                    break;
        !          24273:                else if (ret < 0) {
        !          24274:                    AERROR_INT("xmlSchemaValidateFacets",
        !          24275:                        "validating against an enumeration facet");
        !          24276:                    return (-1);
        !          24277:                }
        !          24278:            }
        !          24279:            if (ret != 0)
        !          24280:                break;
        !          24281:            /*
        !          24282:            * Break on the first set of enumerations. Any additional
        !          24283:            *  enumerations which might be existent on the ancestors
        !          24284:            *  of the current type are restricted by this set; thus
        !          24285:            *  *must* *not* be taken into account.
        !          24286:            */
        !          24287:            if (found)
        !          24288:                break;
        !          24289:            tmpType = tmpType->baseType;
        !          24290:        } while ((tmpType != NULL) &&
        !          24291:            (tmpType->type != XML_SCHEMA_TYPE_BASIC));
        !          24292:        if (found && (ret == 0)) {
        !          24293:            ret = XML_SCHEMAV_CVC_ENUMERATION_VALID;
        !          24294:            if (fireErrors) {
        !          24295:                xmlSchemaFacetErr(actxt, ret, node,
        !          24296:                    value, 0, type, NULL, NULL, NULL, NULL);
        !          24297:            } else
        !          24298:                return (ret);
        !          24299:            if (error == 0)
        !          24300:                error = ret;
        !          24301:        }
        !          24302:     }
        !          24303: 
        !          24304:     if (error >= 0) {
        !          24305:        int found;
        !          24306:        /*
        !          24307:        * Process patters. Pattern facets are ORed at type level
        !          24308:        * and ANDed if derived. Walk the base type axis.
        !          24309:        */
        !          24310:        tmpType = type;
        !          24311:        facet = NULL;
        !          24312:        do {
        !          24313:            found = 0;
        !          24314:            for (facetLink = tmpType->facetSet; facetLink != NULL;
        !          24315:                facetLink = facetLink->next) {
        !          24316:                if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
        !          24317:                    continue;
        !          24318:                found = 1;
        !          24319:                /*
        !          24320:                * NOTE that for patterns, @value needs to be the
        !          24321:                * normalized vaule.
        !          24322:                */
        !          24323:                ret = xmlRegexpExec(facetLink->facet->regexp, value);
        !          24324:                if (ret == 1)
        !          24325:                    break;
        !          24326:                else if (ret < 0) {
        !          24327:                    AERROR_INT("xmlSchemaValidateFacets",
        !          24328:                        "validating against a pattern facet");
        !          24329:                    return (-1);
        !          24330:                } else {
        !          24331:                    /*
        !          24332:                    * Save the last non-validating facet.
        !          24333:                    */
        !          24334:                    facet = facetLink->facet;
        !          24335:                }
        !          24336:            }
        !          24337:            if (found && (ret != 1)) {
        !          24338:                ret = XML_SCHEMAV_CVC_PATTERN_VALID;
        !          24339:                if (fireErrors) {
        !          24340:                    xmlSchemaFacetErr(actxt, ret, node,
        !          24341:                        value, 0, type, facet, NULL, NULL, NULL);
        !          24342:                } else
        !          24343:                    return (ret);
        !          24344:                if (error == 0)
        !          24345:                    error = ret;
        !          24346:                break;
        !          24347:            }
        !          24348:            tmpType = tmpType->baseType;
        !          24349:        } while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
        !          24350:     }
        !          24351: 
        !          24352:     return (error);
        !          24353: }
        !          24354: 
        !          24355: static xmlChar *
        !          24356: xmlSchemaNormalizeValue(xmlSchemaTypePtr type,
        !          24357:                        const xmlChar *value)
        !          24358: {
        !          24359:     switch (xmlSchemaGetWhiteSpaceFacetValue(type)) {
        !          24360:        case XML_SCHEMA_WHITESPACE_COLLAPSE:
        !          24361:            return (xmlSchemaCollapseString(value));
        !          24362:        case XML_SCHEMA_WHITESPACE_REPLACE:
        !          24363:            return (xmlSchemaWhiteSpaceReplace(value));
        !          24364:        default:
        !          24365:            return (NULL);
        !          24366:     }
        !          24367: }
        !          24368: 
        !          24369: static int
        !          24370: xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
        !          24371:                       const xmlChar *value,
        !          24372:                       xmlSchemaValPtr *val,
        !          24373:                       int valNeeded)
        !          24374: {
        !          24375:     int ret;
        !          24376:     const xmlChar *nsName;
        !          24377:     xmlChar *local, *prefix = NULL;
        !          24378: 
        !          24379:     ret = xmlValidateQName(value, 1);
        !          24380:     if (ret != 0) {
        !          24381:        if (ret == -1) {
        !          24382:            VERROR_INT("xmlSchemaValidateQName",
        !          24383:                "calling xmlValidateQName()");
        !          24384:            return (-1);
        !          24385:        }
        !          24386:        return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1);
        !          24387:     }
        !          24388:     /*
        !          24389:     * NOTE: xmlSplitQName2 will always return a duplicated
        !          24390:     * strings.
        !          24391:     */
        !          24392:     local = xmlSplitQName2(value, &prefix);
        !          24393:     if (local == NULL)
        !          24394:        local = xmlStrdup(value);
        !          24395:     /*
        !          24396:     * OPTIMIZE TODO: Use flags for:
        !          24397:     *  - is there any namespace binding?
        !          24398:     *  - is there a default namespace?
        !          24399:     */
        !          24400:     nsName = xmlSchemaLookupNamespace(vctxt, prefix);
        !          24401: 
        !          24402:     if (prefix != NULL) {
        !          24403:        xmlFree(prefix);
        !          24404:        /*
        !          24405:        * A namespace must be found if the prefix is
        !          24406:        * NOT NULL.
        !          24407:        */
        !          24408:        if (nsName == NULL) {
        !          24409:            ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
        !          24410:            xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL,
        !          24411:                WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
        !          24412:                "The QName value '%s' has no "
        !          24413:                "corresponding namespace declaration in "
        !          24414:                "scope", value, NULL);
        !          24415:            if (local != NULL)
        !          24416:                xmlFree(local);
        !          24417:            return (ret);
        !          24418:        }
        !          24419:     }
        !          24420:     if (valNeeded && val) {
        !          24421:        if (nsName != NULL)
        !          24422:            *val = xmlSchemaNewQNameValue(
        !          24423:                BAD_CAST xmlStrdup(nsName), BAD_CAST local);
        !          24424:        else
        !          24425:            *val = xmlSchemaNewQNameValue(NULL,
        !          24426:                BAD_CAST local);
        !          24427:     } else
        !          24428:        xmlFree(local);
        !          24429:     return (0);
        !          24430: }
        !          24431: 
        !          24432: /*
        !          24433: * cvc-simple-type
        !          24434: */
        !          24435: static int
        !          24436: xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
        !          24437:                             xmlNodePtr node,
        !          24438:                             xmlSchemaTypePtr type,
        !          24439:                             const xmlChar *value,
        !          24440:                             xmlSchemaValPtr *retVal,
        !          24441:                             int fireErrors,
        !          24442:                             int normalize,
        !          24443:                             int isNormalized)
        !          24444: {
        !          24445:     int ret = 0, valNeeded = (retVal) ? 1 : 0;
        !          24446:     xmlSchemaValPtr val = NULL;
        !          24447:     /* xmlSchemaWhitespaceValueType ws; */
        !          24448:     xmlChar *normValue = NULL;
        !          24449: 
        !          24450: #define NORMALIZE(atype) \
        !          24451:     if ((! isNormalized) && \
        !          24452:     (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
        !          24453:        normValue = xmlSchemaNormalizeValue(atype, value); \
        !          24454:        if (normValue != NULL) \
        !          24455:            value = normValue; \
        !          24456:        isNormalized = 1; \
        !          24457:     }
        !          24458: 
        !          24459:     if ((retVal != NULL) && (*retVal != NULL)) {
        !          24460:        xmlSchemaFreeValue(*retVal);
        !          24461:        *retVal = NULL;
        !          24462:     }
        !          24463:     /*
        !          24464:     * 3.14.4 Simple Type Definition Validation Rules
        !          24465:     * Validation Rule: String Valid
        !          24466:     */
        !          24467:     /*
        !          24468:     * 1 It is schema-valid with respect to that definition as defined
        !          24469:     * by Datatype Valid in [XML Schemas: Datatypes].
        !          24470:     */
        !          24471:     /*
        !          24472:     * 2.1 If The definition is ENTITY or is validly derived from ENTITY given
        !          24473:     * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then
        !          24474:     * the string must be a �declared entity name�.
        !          24475:     */
        !          24476:     /*
        !          24477:     * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES
        !          24478:     * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6),
        !          24479:     * then every whitespace-delimited substring of the string must be a �declared
        !          24480:     * entity name�.
        !          24481:     */
        !          24482:     /*
        !          24483:     * 2.3 otherwise no further condition applies.
        !          24484:     */
        !          24485:     if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
        !          24486:        valNeeded = 1;
        !          24487:     if (value == NULL)
        !          24488:        value = BAD_CAST "";
        !          24489:     if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) {
        !          24490:        xmlSchemaTypePtr biType; /* The built-in type. */
        !          24491:        /*
        !          24492:        * SPEC (1.2.1) "if {variety} is �atomic� then the string must �match�
        !          24493:        * a literal in the �lexical space� of {base type definition}"
        !          24494:        */
        !          24495:        /*
        !          24496:        * Whitespace-normalize.
        !          24497:        */
        !          24498:        NORMALIZE(type);
        !          24499:        if (type->type != XML_SCHEMA_TYPE_BASIC) {
        !          24500:            /*
        !          24501:            * Get the built-in type.
        !          24502:            */
        !          24503:            biType = type->baseType;
        !          24504:            while ((biType != NULL) &&
        !          24505:                (biType->type != XML_SCHEMA_TYPE_BASIC))
        !          24506:                biType = biType->baseType;
        !          24507: 
        !          24508:            if (biType == NULL) {
        !          24509:                AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24510:                    "could not get the built-in type");
        !          24511:                goto internal_error;
        !          24512:            }
        !          24513:        } else
        !          24514:            biType = type;
        !          24515:        /*
        !          24516:        * NOTATIONs need to be processed here, since they need
        !          24517:        * to lookup in the hashtable of NOTATION declarations of the schema.
        !          24518:        */
        !          24519:        if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
        !          24520:            switch (biType->builtInType) {
        !          24521:                case XML_SCHEMAS_NOTATION:
        !          24522:                    ret = xmlSchemaValidateNotation(
        !          24523:                        (xmlSchemaValidCtxtPtr) actxt,
        !          24524:                        ((xmlSchemaValidCtxtPtr) actxt)->schema,
        !          24525:                        NULL, value, &val, valNeeded);
        !          24526:                    break;
        !          24527:                case XML_SCHEMAS_QNAME:
        !          24528:                    ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
        !          24529:                        value, &val, valNeeded);
        !          24530:                    break;
        !          24531:                default:
        !          24532:                    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
        !          24533:                    if (valNeeded)
        !          24534:                        ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
        !          24535:                            value, &val, node);
        !          24536:                    else
        !          24537:                        ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
        !          24538:                            value, NULL, node);
        !          24539:                    break;
        !          24540:            }
        !          24541:        } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
        !          24542:            switch (biType->builtInType) {
        !          24543:                case XML_SCHEMAS_NOTATION:
        !          24544:                    ret = xmlSchemaValidateNotation(NULL,
        !          24545:                        ((xmlSchemaParserCtxtPtr) actxt)->schema, node,
        !          24546:                        value, &val, valNeeded);
        !          24547:                    break;
        !          24548:                default:
        !          24549:                    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
        !          24550:                    if (valNeeded)
        !          24551:                        ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
        !          24552:                            value, &val, node);
        !          24553:                    else
        !          24554:                        ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
        !          24555:                            value, NULL, node);
        !          24556:                    break;
        !          24557:            }
        !          24558:        } else {
        !          24559:            /*
        !          24560:            * Validation via a public API is not implemented yet.
        !          24561:            */
        !          24562:            TODO
        !          24563:            goto internal_error;
        !          24564:        }
        !          24565:        if (ret != 0) {
        !          24566:            if (ret < 0) {
        !          24567:                AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24568:                    "validating against a built-in type");
        !          24569:                goto internal_error;
        !          24570:            }
        !          24571:            if (WXS_IS_LIST(type))
        !          24572:                ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
        !          24573:            else
        !          24574:                ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
        !          24575:        }
        !          24576:        if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
        !          24577:            /*
        !          24578:            * Check facets.
        !          24579:            */
        !          24580:            ret = xmlSchemaValidateFacets(actxt, node, type,
        !          24581:                (xmlSchemaValType) biType->builtInType, value, val,
        !          24582:                0, fireErrors);
        !          24583:            if (ret != 0) {
        !          24584:                if (ret < 0) {
        !          24585:                    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24586:                        "validating facets of atomic simple type");
        !          24587:                    goto internal_error;
        !          24588:                }
        !          24589:                if (WXS_IS_LIST(type))
        !          24590:                    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
        !          24591:                else
        !          24592:                    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
        !          24593:            }
        !          24594:        }
        !          24595:        if (fireErrors && (ret > 0))
        !          24596:            xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
        !          24597:     } else if (WXS_IS_LIST(type)) {
        !          24598: 
        !          24599:        xmlSchemaTypePtr itemType;
        !          24600:        const xmlChar *cur, *end;
        !          24601:        xmlChar *tmpValue = NULL;
        !          24602:        unsigned long len = 0;
        !          24603:        xmlSchemaValPtr prevVal = NULL, curVal = NULL;
        !          24604:        /* 1.2.2 if {variety} is �list� then the string must be a sequence
        !          24605:        * of white space separated tokens, each of which �match�es a literal
        !          24606:        * in the �lexical space� of {item type definition}
        !          24607:        */
        !          24608:        /*
        !          24609:        * Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if
        !          24610:        * the list type has an enum or pattern facet.
        !          24611:        */
        !          24612:        NORMALIZE(type);
        !          24613:        /*
        !          24614:        * VAL TODO: Optimize validation of empty values.
        !          24615:        * VAL TODO: We do not have computed values for lists.
        !          24616:        */
        !          24617:        itemType = WXS_LIST_ITEMTYPE(type);
        !          24618:        cur = value;
        !          24619:        do {
        !          24620:            while (IS_BLANK_CH(*cur))
        !          24621:                cur++;
        !          24622:            end = cur;
        !          24623:            while ((*end != 0) && (!(IS_BLANK_CH(*end))))
        !          24624:                end++;
        !          24625:            if (end == cur)
        !          24626:                break;
        !          24627:            tmpValue = xmlStrndup(cur, end - cur);
        !          24628:            len++;
        !          24629: 
        !          24630:            if (valNeeded)
        !          24631:                ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
        !          24632:                    tmpValue, &curVal, fireErrors, 0, 1);
        !          24633:            else
        !          24634:                ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
        !          24635:                    tmpValue, NULL, fireErrors, 0, 1);
        !          24636:            FREE_AND_NULL(tmpValue);
        !          24637:            if (curVal != NULL) {
        !          24638:                /*
        !          24639:                * Add to list of computed values.
        !          24640:                */
        !          24641:                if (val == NULL)
        !          24642:                    val = curVal;
        !          24643:                else
        !          24644:                    xmlSchemaValueAppend(prevVal, curVal);
        !          24645:                prevVal = curVal;
        !          24646:                curVal = NULL;
        !          24647:            }
        !          24648:            if (ret != 0) {
        !          24649:                if (ret < 0) {
        !          24650:                    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24651:                        "validating an item of list simple type");
        !          24652:                    goto internal_error;
        !          24653:                }
        !          24654:                ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
        !          24655:                break;
        !          24656:            }
        !          24657:            cur = end;
        !          24658:        } while (*cur != 0);
        !          24659:        FREE_AND_NULL(tmpValue);
        !          24660:        if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
        !          24661:            /*
        !          24662:            * Apply facets (pattern, enumeration).
        !          24663:            */
        !          24664:            ret = xmlSchemaValidateFacets(actxt, node, type,
        !          24665:                XML_SCHEMAS_UNKNOWN, value, val,
        !          24666:                len, fireErrors);
        !          24667:            if (ret != 0) {
        !          24668:                if (ret < 0) {
        !          24669:                    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24670:                        "validating facets of list simple type");
        !          24671:                    goto internal_error;
        !          24672:                }
        !          24673:                ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
        !          24674:            }
        !          24675:        }
        !          24676:        if (fireErrors && (ret > 0)) {
        !          24677:            /*
        !          24678:            * Report the normalized value.
        !          24679:            */
        !          24680:            normalize = 1;
        !          24681:            NORMALIZE(type);
        !          24682:            xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
        !          24683:        }
        !          24684:     } else if (WXS_IS_UNION(type)) {
        !          24685:        xmlSchemaTypeLinkPtr memberLink;
        !          24686:        /*
        !          24687:        * TODO: For all datatypes �derived� by �union�  whiteSpace does
        !          24688:        * not apply directly; however, the normalization behavior of �union�
        !          24689:        * types is controlled by the value of whiteSpace on that one of the
        !          24690:        * �memberTypes� against which the �union� is successfully validated.
        !          24691:        *
        !          24692:        * This means that the value is normalized by the first validating
        !          24693:        * member type, then the facets of the union type are applied. This
        !          24694:        * needs changing of the value!
        !          24695:        */
        !          24696: 
        !          24697:        /*
        !          24698:        * 1.2.3 if {variety} is �union� then the string must �match� a
        !          24699:        * literal in the �lexical space� of at least one member of
        !          24700:        * {member type definitions}
        !          24701:        */
        !          24702:        memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type);
        !          24703:        if (memberLink == NULL) {
        !          24704:            AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24705:                "union simple type has no member types");
        !          24706:            goto internal_error;
        !          24707:        }
        !          24708:        /*
        !          24709:        * Always normalize union type values, since we currently
        !          24710:        * cannot store the whitespace information with the value
        !          24711:        * itself; otherwise a later value-comparison would be
        !          24712:        * not possible.
        !          24713:        */
        !          24714:        while (memberLink != NULL) {
        !          24715:            if (valNeeded)
        !          24716:                ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
        !          24717:                    memberLink->type, value, &val, 0, 1, 0);
        !          24718:            else
        !          24719:                ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
        !          24720:                    memberLink->type, value, NULL, 0, 1, 0);
        !          24721:            if (ret <= 0)
        !          24722:                break;
        !          24723:            memberLink = memberLink->next;
        !          24724:        }
        !          24725:        if (ret != 0) {
        !          24726:            if (ret < 0) {
        !          24727:                AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24728:                    "validating members of union simple type");
        !          24729:                goto internal_error;
        !          24730:            }
        !          24731:            ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
        !          24732:        }
        !          24733:        /*
        !          24734:        * Apply facets (pattern, enumeration).
        !          24735:        */
        !          24736:        if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
        !          24737:            /*
        !          24738:            * The normalization behavior of �union� types is controlled by
        !          24739:            * the value of whiteSpace on that one of the �memberTypes�
        !          24740:            * against which the �union� is successfully validated.
        !          24741:            */
        !          24742:            NORMALIZE(memberLink->type);
        !          24743:            ret = xmlSchemaValidateFacets(actxt, node, type,
        !          24744:                XML_SCHEMAS_UNKNOWN, value, val,
        !          24745:                0, fireErrors);
        !          24746:            if (ret != 0) {
        !          24747:                if (ret < 0) {
        !          24748:                    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
        !          24749:                        "validating facets of union simple type");
        !          24750:                    goto internal_error;
        !          24751:                }
        !          24752:                ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
        !          24753:            }
        !          24754:        }
        !          24755:        if (fireErrors && (ret > 0))
        !          24756:            xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
        !          24757:     }
        !          24758: 
        !          24759:     if (normValue != NULL)
        !          24760:        xmlFree(normValue);
        !          24761:     if (ret == 0) {
        !          24762:        if (retVal != NULL)
        !          24763:            *retVal = val;
        !          24764:        else if (val != NULL)
        !          24765:            xmlSchemaFreeValue(val);
        !          24766:     } else if (val != NULL)
        !          24767:        xmlSchemaFreeValue(val);
        !          24768:     return (ret);
        !          24769: internal_error:
        !          24770:     if (normValue != NULL)
        !          24771:        xmlFree(normValue);
        !          24772:     if (val != NULL)
        !          24773:        xmlSchemaFreeValue(val);
        !          24774:     return (-1);
        !          24775: }
        !          24776: 
        !          24777: static int
        !          24778: xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
        !          24779:                           const xmlChar *value,
        !          24780:                           const xmlChar **nsName,
        !          24781:                           const xmlChar **localName)
        !          24782: {
        !          24783:     int ret = 0;
        !          24784: 
        !          24785:     if ((nsName == NULL) || (localName == NULL))
        !          24786:        return (-1);
        !          24787:     *nsName = NULL;
        !          24788:     *localName = NULL;
        !          24789: 
        !          24790:     ret = xmlValidateQName(value, 1);
        !          24791:     if (ret == -1)
        !          24792:        return (-1);
        !          24793:     if (ret > 0) {
        !          24794:        xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
        !          24795:            XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
        !          24796:            value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
        !          24797:        return (1);
        !          24798:     }
        !          24799:     {
        !          24800:        xmlChar *local = NULL;
        !          24801:        xmlChar *prefix;
        !          24802: 
        !          24803:        /*
        !          24804:        * NOTE: xmlSplitQName2 will return a duplicated
        !          24805:        * string.
        !          24806:        */
        !          24807:        local = xmlSplitQName2(value, &prefix);
        !          24808:        if (local == NULL)
        !          24809:            *localName = xmlDictLookup(vctxt->dict, value, -1);
        !          24810:        else {
        !          24811:            *localName = xmlDictLookup(vctxt->dict, local, -1);
        !          24812:            xmlFree(local);
        !          24813:        }
        !          24814: 
        !          24815:        *nsName = xmlSchemaLookupNamespace(vctxt, prefix);
        !          24816: 
        !          24817:        if (prefix != NULL) {
        !          24818:            xmlFree(prefix);
        !          24819:            /*
        !          24820:            * A namespace must be found if the prefix is NOT NULL.
        !          24821:            */
        !          24822:            if (*nsName == NULL) {
        !          24823:                xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          24824:                    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
        !          24825:                    WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
        !          24826:                    "The QName value '%s' has no "
        !          24827:                    "corresponding namespace declaration in scope",
        !          24828:                    value, NULL);
        !          24829:                return (2);
        !          24830:            }
        !          24831:        }
        !          24832:     }
        !          24833:     return (0);
        !          24834: }
        !          24835: 
        !          24836: static int
        !          24837: xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
        !          24838:                        xmlSchemaAttrInfoPtr iattr,
        !          24839:                        xmlSchemaTypePtr *localType,
        !          24840:                        xmlSchemaElementPtr elemDecl)
        !          24841: {
        !          24842:     int ret = 0;
        !          24843:     /*
        !          24844:     * cvc-elt (3.3.4) : (4)
        !          24845:     * AND
        !          24846:     * Schema-Validity Assessment (Element) (cvc-assess-elt)
        !          24847:     *   (1.2.1.2.1) - (1.2.1.2.4)
        !          24848:     * Handle 'xsi:type'.
        !          24849:     */
        !          24850:     if (localType == NULL)
        !          24851:        return (-1);
        !          24852:     *localType = NULL;
        !          24853:     if (iattr == NULL)
        !          24854:        return (0);
        !          24855:     else {
        !          24856:        const xmlChar *nsName = NULL, *local = NULL;
        !          24857:        /*
        !          24858:        * TODO: We should report a *warning* that the type was overriden
        !          24859:        * by the instance.
        !          24860:        */
        !          24861:        ACTIVATE_ATTRIBUTE(iattr);
        !          24862:        /*
        !          24863:        * (cvc-elt) (3.3.4) : (4.1)
        !          24864:        * (cvc-assess-elt) (1.2.1.2.2)
        !          24865:        */
        !          24866:        ret = xmlSchemaVExpandQName(vctxt, iattr->value,
        !          24867:            &nsName, &local);
        !          24868:        if (ret != 0) {
        !          24869:            if (ret < 0) {
        !          24870:                VERROR_INT("xmlSchemaValidateElementByDeclaration",
        !          24871:                    "calling xmlSchemaQNameExpand() to validate the "
        !          24872:                    "attribute 'xsi:type'");
        !          24873:                goto internal_error;
        !          24874:            }
        !          24875:            goto exit;
        !          24876:        }
        !          24877:        /*
        !          24878:        * (cvc-elt) (3.3.4) : (4.2)
        !          24879:        * (cvc-assess-elt) (1.2.1.2.3)
        !          24880:        */
        !          24881:        *localType = xmlSchemaGetType(vctxt->schema, local, nsName);
        !          24882:        if (*localType == NULL) {
        !          24883:            xmlChar *str = NULL;
        !          24884: 
        !          24885:            xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          24886:                XML_SCHEMAV_CVC_ELT_4_2, NULL,
        !          24887:                WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
        !          24888:                "The QName value '%s' of the xsi:type attribute does not "
        !          24889:                "resolve to a type definition",
        !          24890:                xmlSchemaFormatQName(&str, nsName, local), NULL);
        !          24891:            FREE_AND_NULL(str);
        !          24892:            ret = vctxt->err;
        !          24893:            goto exit;
        !          24894:        }
        !          24895:        if (elemDecl != NULL) {
        !          24896:            int set = 0;
        !          24897: 
        !          24898:            /*
        !          24899:            * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK)
        !          24900:            * "The �local type definition� must be validly
        !          24901:            * derived from the {type definition} given the union of
        !          24902:            * the {disallowed substitutions} and the {type definition}'s
        !          24903:            * {prohibited substitutions}, as defined in
        !          24904:            * Type Derivation OK (Complex) (�3.4.6)
        !          24905:            * (if it is a complex type definition),
        !          24906:            * or given {disallowed substitutions} as defined in Type
        !          24907:            * Derivation OK (Simple) (�3.14.6) (if it is a simple type
        !          24908:            * definition)."
        !          24909:            *
        !          24910:            * {disallowed substitutions}: the "block" on the element decl.
        !          24911:            * {prohibited substitutions}: the "block" on the type def.
        !          24912:            */
        !          24913:            /*
        !          24914:            * OPTIMIZE TODO: We could map types already evaluated
        !          24915:            * to be validly derived from other types to avoid checking
        !          24916:            * this over and over for the same types.
        !          24917:            */
        !          24918:            if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
        !          24919:                (elemDecl->subtypes->flags &
        !          24920:                    XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
        !          24921:                set |= SUBSET_EXTENSION;
        !          24922: 
        !          24923:            if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
        !          24924:                (elemDecl->subtypes->flags &
        !          24925:                    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
        !          24926:                set |= SUBSET_RESTRICTION;
        !          24927: 
        !          24928:            /*
        !          24929:            * REMOVED and CHANGED since this produced a parser context
        !          24930:            * which adds to the string dict of the schema. So this would
        !          24931:            * change the schema and we don't want this. We don't need
        !          24932:            * the parser context anymore.
        !          24933:            *
        !          24934:            * if ((vctxt->pctxt == NULL) &&
        !          24935:            *   (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
        !          24936:            *       return (-1);
        !          24937:            */
        !          24938: 
        !          24939:            if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
        !          24940:                elemDecl->subtypes, set) != 0) {
        !          24941:                xmlChar *str = NULL;
        !          24942: 
        !          24943:                xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          24944:                    XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL,
        !          24945:                    "The type definition '%s', specified by xsi:type, is "
        !          24946:                    "blocked or not validly derived from the type definition "
        !          24947:                    "of the element declaration",
        !          24948:                    xmlSchemaFormatQName(&str,
        !          24949:                        (*localType)->targetNamespace,
        !          24950:                        (*localType)->name),
        !          24951:                    NULL);
        !          24952:                FREE_AND_NULL(str);
        !          24953:                ret = vctxt->err;
        !          24954:                *localType = NULL;
        !          24955:            }
        !          24956:        }
        !          24957:     }
        !          24958: exit:
        !          24959:     ACTIVATE_ELEM;
        !          24960:     return (ret);
        !          24961: internal_error:
        !          24962:     ACTIVATE_ELEM;
        !          24963:     return (-1);
        !          24964: }
        !          24965: 
        !          24966: static int
        !          24967: xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
        !          24968: {
        !          24969:     xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
        !          24970:     xmlSchemaTypePtr actualType;
        !          24971: 
        !          24972:     /*
        !          24973:     * cvc-elt (3.3.4) : 1
        !          24974:     */
        !          24975:     if (elemDecl == NULL) {
        !          24976:        VERROR(XML_SCHEMAV_CVC_ELT_1, NULL,
        !          24977:            "No matching declaration available");
        !          24978:         return (vctxt->err);
        !          24979:     }
        !          24980:     actualType = WXS_ELEM_TYPEDEF(elemDecl);
        !          24981:     /*
        !          24982:     * cvc-elt (3.3.4) : 2
        !          24983:     */
        !          24984:     if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
        !          24985:        VERROR(XML_SCHEMAV_CVC_ELT_2, NULL,
        !          24986:            "The element declaration is abstract");
        !          24987:         return (vctxt->err);
        !          24988:     }
        !          24989:     if (actualType == NULL) {
        !          24990:        VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
        !          24991:            "The type definition is absent");
        !          24992:        return (XML_SCHEMAV_CVC_TYPE_1);
        !          24993:     }
        !          24994:     if (vctxt->nbAttrInfos != 0) {
        !          24995:        int ret;
        !          24996:        xmlSchemaAttrInfoPtr iattr;
        !          24997:        /*
        !          24998:        * cvc-elt (3.3.4) : 3
        !          24999:        * Handle 'xsi:nil'.
        !          25000:        */
        !          25001:        iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          25002:            XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
        !          25003:        if (iattr) {
        !          25004:            ACTIVATE_ATTRIBUTE(iattr);
        !          25005:            /*
        !          25006:            * Validate the value.
        !          25007:            */
        !          25008:            ret = xmlSchemaVCheckCVCSimpleType(
        !          25009:                ACTXT_CAST vctxt, NULL,
        !          25010:                xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
        !          25011:                iattr->value, &(iattr->val), 1, 0, 0);
        !          25012:            ACTIVATE_ELEM;
        !          25013:            if (ret < 0) {
        !          25014:                VERROR_INT("xmlSchemaValidateElemDecl",
        !          25015:                    "calling xmlSchemaVCheckCVCSimpleType() to "
        !          25016:                    "validate the attribute 'xsi:nil'");
        !          25017:                return (-1);
        !          25018:            }
        !          25019:            if (ret == 0) {
        !          25020:                if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
        !          25021:                    /*
        !          25022:                    * cvc-elt (3.3.4) : 3.1
        !          25023:                    */
        !          25024:                    VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL,
        !          25025:                        "The element is not 'nillable'");
        !          25026:                    /* Does not return an error on purpose. */
        !          25027:                } else {
        !          25028:                    if (xmlSchemaValueGetAsBoolean(iattr->val)) {
        !          25029:                        /*
        !          25030:                        * cvc-elt (3.3.4) : 3.2.2
        !          25031:                        */
        !          25032:                        if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
        !          25033:                            (elemDecl->value != NULL)) {
        !          25034:                            VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL,
        !          25035:                                "The element cannot be 'nilled' because "
        !          25036:                                "there is a fixed value constraint defined "
        !          25037:                                "for it");
        !          25038:                             /* Does not return an error on purpose. */
        !          25039:                        } else
        !          25040:                            vctxt->inode->flags |=
        !          25041:                                XML_SCHEMA_ELEM_INFO_NILLED;
        !          25042:                    }
        !          25043:                }
        !          25044:            }
        !          25045:        }
        !          25046:        /*
        !          25047:        * cvc-elt (3.3.4) : 4
        !          25048:        * Handle 'xsi:type'.
        !          25049:        */
        !          25050:        iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          25051:            XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
        !          25052:        if (iattr) {
        !          25053:            xmlSchemaTypePtr localType = NULL;
        !          25054: 
        !          25055:            ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
        !          25056:                elemDecl);
        !          25057:            if (ret != 0) {
        !          25058:                if (ret == -1) {
        !          25059:                    VERROR_INT("xmlSchemaValidateElemDecl",
        !          25060:                        "calling xmlSchemaProcessXSIType() to "
        !          25061:                        "process the attribute 'xsi:type'");
        !          25062:                    return (-1);
        !          25063:                }
        !          25064:                /* Does not return an error on purpose. */
        !          25065:            }
        !          25066:            if (localType != NULL) {
        !          25067:                vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
        !          25068:                actualType = localType;
        !          25069:            }
        !          25070:        }
        !          25071:     }
        !          25072:     /*
        !          25073:     * IDC: Register identity-constraint XPath matchers.
        !          25074:     */
        !          25075:     if ((elemDecl->idcs != NULL) &&
        !          25076:        (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
        !          25077:            return (-1);
        !          25078:     /*
        !          25079:     * No actual type definition.
        !          25080:     */
        !          25081:     if (actualType == NULL) {
        !          25082:        VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
        !          25083:            "The type definition is absent");
        !          25084:        return (XML_SCHEMAV_CVC_TYPE_1);
        !          25085:     }
        !          25086:     /*
        !          25087:     * Remember the actual type definition.
        !          25088:     */
        !          25089:     vctxt->inode->typeDef = actualType;
        !          25090: 
        !          25091:     return (0);
        !          25092: }
        !          25093: 
        !          25094: static int
        !          25095: xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
        !          25096: {
        !          25097:     xmlSchemaAttrInfoPtr iattr;
        !          25098:     int ret = 0, i;
        !          25099: 
        !          25100:     /*
        !          25101:     * SPEC cvc-type (3.1.1)
        !          25102:     * "The attributes of must be empty, excepting those whose namespace
        !          25103:     * name is identical to http://www.w3.org/2001/XMLSchema-instance and
        !          25104:     * whose local name is one of type, nil, schemaLocation or
        !          25105:     * noNamespaceSchemaLocation."
        !          25106:     */
        !          25107:     if (vctxt->nbAttrInfos == 0)
        !          25108:        return (0);
        !          25109:     for (i = 0; i < vctxt->nbAttrInfos; i++) {
        !          25110:        iattr = vctxt->attrInfos[i];
        !          25111:        if (! iattr->metaType) {
        !          25112:            ACTIVATE_ATTRIBUTE(iattr)
        !          25113:            xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
        !          25114:                XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL);
        !          25115:            ret = XML_SCHEMAV_CVC_TYPE_3_1_1;
        !          25116:         }
        !          25117:     }
        !          25118:     ACTIVATE_ELEM
        !          25119:     return (ret);
        !          25120: }
        !          25121: 
        !          25122: /*
        !          25123: * Cleanup currently used attribute infos.
        !          25124: */
        !          25125: static void
        !          25126: xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
        !          25127: {
        !          25128:     int i;
        !          25129:     xmlSchemaAttrInfoPtr attr;
        !          25130: 
        !          25131:     if (vctxt->nbAttrInfos == 0)
        !          25132:        return;
        !          25133:     for (i = 0; i < vctxt->nbAttrInfos; i++) {
        !          25134:        attr = vctxt->attrInfos[i];
        !          25135:        if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
        !          25136:            if (attr->localName != NULL)
        !          25137:                xmlFree((xmlChar *) attr->localName);
        !          25138:            if (attr->nsName != NULL)
        !          25139:                xmlFree((xmlChar *) attr->nsName);
        !          25140:        }
        !          25141:        if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
        !          25142:            if (attr->value != NULL)
        !          25143:                xmlFree((xmlChar *) attr->value);
        !          25144:        }
        !          25145:        if (attr->val != NULL) {
        !          25146:            xmlSchemaFreeValue(attr->val);
        !          25147:            attr->val = NULL;
        !          25148:        }
        !          25149:        memset(attr, 0, sizeof(xmlSchemaAttrInfo));
        !          25150:     }
        !          25151:     vctxt->nbAttrInfos = 0;
        !          25152: }
        !          25153: 
        !          25154: /*
        !          25155: * 3.4.4 Complex Type Definition Validation Rules
        !          25156: *   Element Locally Valid (Complex Type) (cvc-complex-type)
        !          25157: * 3.2.4 Attribute Declaration Validation Rules
        !          25158: *   Validation Rule: Attribute Locally Valid (cvc-attribute)
        !          25159: *   Attribute Locally Valid (Use) (cvc-au)
        !          25160: *
        !          25161: * Only "assessed" attribute information items will be visible to
        !          25162: * IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes.
        !          25163: */
        !          25164: static int
        !          25165: xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
        !          25166: {
        !          25167:     xmlSchemaTypePtr type = vctxt->inode->typeDef;
        !          25168:     xmlSchemaItemListPtr attrUseList;
        !          25169:     xmlSchemaAttributeUsePtr attrUse = NULL;
        !          25170:     xmlSchemaAttributePtr attrDecl = NULL;
        !          25171:     xmlSchemaAttrInfoPtr iattr, tmpiattr;
        !          25172:     int i, j, found, nbAttrs, nbUses;
        !          25173:     int xpathRes = 0, res, wildIDs = 0, fixed;
        !          25174:     xmlNodePtr defAttrOwnerElem = NULL;
        !          25175: 
        !          25176:     /*
        !          25177:     * SPEC (cvc-attribute)
        !          25178:     * (1) "The declaration must not be �absent� (see Missing
        !          25179:     * Sub-components (�5.3) for how this can fail to be
        !          25180:     * the case)."
        !          25181:     * (2) "Its {type definition} must not be absent."
        !          25182:     *
        !          25183:     * NOTE (1) + (2): This is not handled here, since we currently do not
        !          25184:     * allow validation against schemas which have missing sub-components.
        !          25185:     *
        !          25186:     * SPEC (cvc-complex-type)
        !          25187:     * (3) "For each attribute information item in the element information
        !          25188:     * item's [attributes] excepting those whose [namespace name] is
        !          25189:     * identical to http://www.w3.org/2001/XMLSchema-instance and whose
        !          25190:     * [local name] is one of type, nil, schemaLocation or
        !          25191:     * noNamespaceSchemaLocation, the appropriate case among the following
        !          25192:     * must be true:
        !          25193:     *
        !          25194:     */
        !          25195:     attrUseList = (xmlSchemaItemListPtr) type->attrUses;
        !          25196:     /*
        !          25197:     * @nbAttrs is the number of attributes present in the instance.
        !          25198:     */
        !          25199:     nbAttrs = vctxt->nbAttrInfos;
        !          25200:     if (attrUseList != NULL)
        !          25201:        nbUses = attrUseList->nbItems;
        !          25202:     else
        !          25203:        nbUses = 0;
        !          25204:     for (i = 0; i < nbUses; i++) {
        !          25205:         found = 0;
        !          25206:        attrUse = attrUseList->items[i];
        !          25207:        attrDecl = WXS_ATTRUSE_DECL(attrUse);
        !          25208:         for (j = 0; j < nbAttrs; j++) {
        !          25209:            iattr = vctxt->attrInfos[j];
        !          25210:            /*
        !          25211:            * SPEC (cvc-complex-type) (3)
        !          25212:            * Skip meta attributes.
        !          25213:            */
        !          25214:            if (iattr->metaType)
        !          25215:                continue;
        !          25216:            if (iattr->localName[0] != attrDecl->name[0])
        !          25217:                continue;
        !          25218:            if (!xmlStrEqual(iattr->localName, attrDecl->name))
        !          25219:                continue;
        !          25220:            if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
        !          25221:                continue;
        !          25222:            found = 1;
        !          25223:            /*
        !          25224:            * SPEC (cvc-complex-type)
        !          25225:            * (3.1) "If there is among the {attribute uses} an attribute
        !          25226:            * use with an {attribute declaration} whose {name} matches
        !          25227:            * the attribute information item's [local name] and whose
        !          25228:            * {target namespace} is identical to the attribute information
        !          25229:            * item's [namespace name] (where an �absent� {target namespace}
        !          25230:            * is taken to be identical to a [namespace name] with no value),
        !          25231:            * then the attribute information must be �valid� with respect
        !          25232:            * to that attribute use as per Attribute Locally Valid (Use)
        !          25233:            * (�3.5.4). In this case the {attribute declaration} of that
        !          25234:            * attribute use is the �context-determined declaration� for the
        !          25235:            * attribute information item with respect to Schema-Validity
        !          25236:            * Assessment (Attribute) (�3.2.4) and
        !          25237:            * Assessment Outcome (Attribute) (�3.2.5).
        !          25238:            */
        !          25239:            iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
        !          25240:            iattr->use = attrUse;
        !          25241:            /*
        !          25242:            * Context-determined declaration.
        !          25243:            */
        !          25244:            iattr->decl = attrDecl;
        !          25245:            iattr->typeDef = attrDecl->subtypes;
        !          25246:            break;
        !          25247:        }
        !          25248: 
        !          25249:        if (found)
        !          25250:            continue;
        !          25251: 
        !          25252:        if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
        !          25253:            /*
        !          25254:            * Handle non-existent, required attributes.
        !          25255:            *
        !          25256:            * SPEC (cvc-complex-type)
        !          25257:            * (4) "The {attribute declaration} of each attribute use in
        !          25258:            * the {attribute uses} whose {required} is true matches one
        !          25259:            * of the attribute information items in the element information
        !          25260:            * item's [attributes] as per clause 3.1 above."
        !          25261:            */
        !          25262:            tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
        !          25263:            if (tmpiattr == NULL) {
        !          25264:                VERROR_INT(
        !          25265:                    "xmlSchemaVAttributesComplex",
        !          25266:                    "calling xmlSchemaGetFreshAttrInfo()");
        !          25267:                return (-1);
        !          25268:            }
        !          25269:            tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
        !          25270:            tmpiattr->use = attrUse;
        !          25271:            tmpiattr->decl = attrDecl;
        !          25272:        } else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
        !          25273:            ((attrUse->defValue != NULL) ||
        !          25274:             (attrDecl->defValue != NULL))) {
        !          25275:            /*
        !          25276:            * Handle non-existent, optional, default/fixed attributes.
        !          25277:            */
        !          25278:            tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
        !          25279:            if (tmpiattr == NULL) {
        !          25280:                VERROR_INT(
        !          25281:                    "xmlSchemaVAttributesComplex",
        !          25282:                    "calling xmlSchemaGetFreshAttrInfo()");
        !          25283:                return (-1);
        !          25284:            }
        !          25285:            tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
        !          25286:            tmpiattr->use = attrUse;
        !          25287:            tmpiattr->decl = attrDecl;
        !          25288:            tmpiattr->typeDef = attrDecl->subtypes;
        !          25289:            tmpiattr->localName = attrDecl->name;
        !          25290:            tmpiattr->nsName = attrDecl->targetNamespace;
        !          25291:        }
        !          25292:     }
        !          25293: 
        !          25294:     if (vctxt->nbAttrInfos == 0)
        !          25295:        return (0);
        !          25296:     /*
        !          25297:     * Validate against the wildcard.
        !          25298:     */
        !          25299:     if (type->attributeWildcard != NULL) {
        !          25300:        /*
        !          25301:        * SPEC (cvc-complex-type)
        !          25302:        * (3.2.1) "There must be an {attribute wildcard}."
        !          25303:        */
        !          25304:        for (i = 0; i < nbAttrs; i++) {
        !          25305:            iattr = vctxt->attrInfos[i];
        !          25306:            /*
        !          25307:            * SPEC (cvc-complex-type) (3)
        !          25308:            * Skip meta attributes.
        !          25309:            */
        !          25310:            if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
        !          25311:                continue;
        !          25312:            /*
        !          25313:            * SPEC (cvc-complex-type)
        !          25314:            * (3.2.2) "The attribute information item must be �valid� with
        !          25315:            * respect to it as defined in Item Valid (Wildcard) (�3.10.4)."
        !          25316:            *
        !          25317:            * SPEC Item Valid (Wildcard) (cvc-wildcard)
        !          25318:            * "... its [namespace name] must be �valid� with respect to
        !          25319:            * the wildcard constraint, as defined in Wildcard allows
        !          25320:            * Namespace Name (�3.10.4)."
        !          25321:            */
        !          25322:            if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard,
        !          25323:                    iattr->nsName) == 0) {
        !          25324:                /*
        !          25325:                * Handle processContents.
        !          25326:                *
        !          25327:                * SPEC (cvc-wildcard):
        !          25328:                * processContents | context-determined declaration:
        !          25329:                * "strict"          "mustFind"
        !          25330:                * "lax"             "none"
        !          25331:                * "skip"            "skip"
        !          25332:                */
        !          25333:                if (type->attributeWildcard->processContents ==
        !          25334:                    XML_SCHEMAS_ANY_SKIP) {
        !          25335:                     /*
        !          25336:                    * context-determined declaration = "skip"
        !          25337:                    *
        !          25338:                    * SPEC PSVI Assessment Outcome (Attribute)
        !          25339:                    * [validity] = "notKnown"
        !          25340:                    * [validation attempted] = "none"
        !          25341:                    */
        !          25342:                    iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
        !          25343:                    continue;
        !          25344:                }
        !          25345:                /*
        !          25346:                * Find an attribute declaration.
        !          25347:                */
        !          25348:                iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
        !          25349:                    iattr->localName, iattr->nsName);
        !          25350:                if (iattr->decl != NULL) {
        !          25351:                    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
        !          25352:                    /*
        !          25353:                    * SPEC (cvc-complex-type)
        !          25354:                    * (5) "Let [Definition:]  the wild IDs be the set of
        !          25355:                    * all attribute information item to which clause 3.2
        !          25356:                    * applied and whose �validation� resulted in a
        !          25357:                    * �context-determined declaration� of mustFind or no
        !          25358:                    * �context-determined declaration� at all, and whose
        !          25359:                    * [local name] and [namespace name] resolve (as
        !          25360:                    * defined by QName resolution (Instance) (�3.15.4)) to
        !          25361:                    * an attribute declaration whose {type definition} is
        !          25362:                    * or is derived from ID. Then all of the following
        !          25363:                    * must be true:"
        !          25364:                    */
        !          25365:                    iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
        !          25366:                    if (xmlSchemaIsDerivedFromBuiltInType(
        !          25367:                        iattr->typeDef, XML_SCHEMAS_ID)) {
        !          25368:                        /*
        !          25369:                        * SPEC (5.1) "There must be no more than one
        !          25370:                        * item in �wild IDs�."
        !          25371:                        */
        !          25372:                        if (wildIDs != 0) {
        !          25373:                            /* VAL TODO */
        !          25374:                            iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
        !          25375:                            TODO
        !          25376:                            continue;
        !          25377:                        }
        !          25378:                        wildIDs++;
        !          25379:                        /*
        !          25380:                        * SPEC (cvc-complex-type)
        !          25381:                        * (5.2) "If �wild IDs� is non-empty, there must not
        !          25382:                        * be any attribute uses among the {attribute uses}
        !          25383:                        * whose {attribute declaration}'s {type definition}
        !          25384:                        * is or is derived from ID."
        !          25385:                        */
        !          25386:                         if (attrUseList != NULL) {
        !          25387:                             for (j = 0; j < attrUseList->nbItems; j++) {
        !          25388:                                 if (xmlSchemaIsDerivedFromBuiltInType(
        !          25389:                                     WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]),
        !          25390:                                     XML_SCHEMAS_ID)) {
        !          25391:                                     /* URGENT VAL TODO: implement */
        !          25392:                             iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
        !          25393:                                     TODO
        !          25394:                                     break;
        !          25395:                                 }
        !          25396:                             }
        !          25397:                         }
        !          25398:                    }
        !          25399:                } else if (type->attributeWildcard->processContents ==
        !          25400:                    XML_SCHEMAS_ANY_LAX) {
        !          25401:                    iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
        !          25402:                    /*
        !          25403:                    * SPEC PSVI Assessment Outcome (Attribute)
        !          25404:                    * [validity] = "notKnown"
        !          25405:                    * [validation attempted] = "none"
        !          25406:                    */
        !          25407:                } else {
        !          25408:                    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
        !          25409:                }
        !          25410:            }
        !          25411:        }
        !          25412:     }
        !          25413: 
        !          25414:     if (vctxt->nbAttrInfos == 0)
        !          25415:        return (0);
        !          25416: 
        !          25417:     /*
        !          25418:     * Get the owner element; needed for creation of default attributes.
        !          25419:     * This fixes bug #341337, reported by David Grohmann.
        !          25420:     */
        !          25421:     if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
        !          25422:        xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
        !          25423:        if (ielem && ielem->node && ielem->node->doc)
        !          25424:            defAttrOwnerElem = ielem->node;
        !          25425:     }
        !          25426:     /*
        !          25427:     * Validate values, create default attributes, evaluate IDCs.
        !          25428:     */
        !          25429:     for (i = 0; i < vctxt->nbAttrInfos; i++) {
        !          25430:        iattr = vctxt->attrInfos[i];
        !          25431:        /*
        !          25432:        * VAL TODO: Note that we won't try to resolve IDCs to
        !          25433:        * "lax" and "skip" validated attributes. Check what to
        !          25434:        * do in this case.
        !          25435:        */
        !          25436:        if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
        !          25437:            (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
        !          25438:            continue;
        !          25439:        /*
        !          25440:        * VAL TODO: What to do if the type definition is missing?
        !          25441:        */
        !          25442:        if (iattr->typeDef == NULL) {
        !          25443:            iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
        !          25444:            continue;
        !          25445:        }
        !          25446: 
        !          25447:        ACTIVATE_ATTRIBUTE(iattr);
        !          25448:        fixed = 0;
        !          25449:        xpathRes = 0;
        !          25450: 
        !          25451:        if (vctxt->xpathStates != NULL) {
        !          25452:            /*
        !          25453:            * Evaluate IDCs.
        !          25454:            */
        !          25455:            xpathRes = xmlSchemaXPathEvaluate(vctxt,
        !          25456:                XML_ATTRIBUTE_NODE);
        !          25457:            if (xpathRes == -1) {
        !          25458:                VERROR_INT("xmlSchemaVAttributesComplex",
        !          25459:                    "calling xmlSchemaXPathEvaluate()");
        !          25460:                goto internal_error;
        !          25461:            }
        !          25462:        }
        !          25463: 
        !          25464:        if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
        !          25465:            /*
        !          25466:            * Default/fixed attributes.
        !          25467:            * We need the value only if we need to resolve IDCs or
        !          25468:            * will create default attributes.
        !          25469:            */
        !          25470:            if ((xpathRes) || (defAttrOwnerElem)) {
        !          25471:                if (iattr->use->defValue != NULL) {
        !          25472:                    iattr->value = (xmlChar *) iattr->use->defValue;
        !          25473:                    iattr->val = iattr->use->defVal;
        !          25474:                } else {
        !          25475:                    iattr->value = (xmlChar *) iattr->decl->defValue;
        !          25476:                    iattr->val = iattr->decl->defVal;
        !          25477:                }
        !          25478:                /*
        !          25479:                * IDCs will consume the precomputed default value,
        !          25480:                * so we need to clone it.
        !          25481:                */
        !          25482:                if (iattr->val == NULL) {
        !          25483:                    VERROR_INT("xmlSchemaVAttributesComplex",
        !          25484:                        "default/fixed value on an attribute use was "
        !          25485:                        "not precomputed");
        !          25486:                    goto internal_error;
        !          25487:                }
        !          25488:                iattr->val = xmlSchemaCopyValue(iattr->val);
        !          25489:                if (iattr->val == NULL) {
        !          25490:                    VERROR_INT("xmlSchemaVAttributesComplex",
        !          25491:                        "calling xmlSchemaCopyValue()");
        !          25492:                    goto internal_error;
        !          25493:                }
        !          25494:            }
        !          25495:            /*
        !          25496:            * PSVI: Add the default attribute to the current element.
        !          25497:            * VAL TODO: Should we use the *normalized* value? This currently
        !          25498:            *   uses the *initial* value.
        !          25499:            */
        !          25500: 
        !          25501:            if (defAttrOwnerElem) {
        !          25502:                xmlChar *normValue;
        !          25503:                const xmlChar *value;
        !          25504: 
        !          25505:                value = iattr->value;
        !          25506:                /*
        !          25507:                * Normalize the value.
        !          25508:                */
        !          25509:                normValue = xmlSchemaNormalizeValue(iattr->typeDef,
        !          25510:                    iattr->value);
        !          25511:                if (normValue != NULL)
        !          25512:                    value = BAD_CAST normValue;
        !          25513: 
        !          25514:                if (iattr->nsName == NULL) {
        !          25515:                    if (xmlNewProp(defAttrOwnerElem,
        !          25516:                        iattr->localName, value) == NULL) {
        !          25517:                        VERROR_INT("xmlSchemaVAttributesComplex",
        !          25518:                            "callling xmlNewProp()");
        !          25519:                        if (normValue != NULL)
        !          25520:                            xmlFree(normValue);
        !          25521:                        goto internal_error;
        !          25522:                    }
        !          25523:                } else {
        !          25524:                    xmlNsPtr ns;
        !          25525: 
        !          25526:                    ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
        !          25527:                        defAttrOwnerElem, iattr->nsName);
        !          25528:                    if (ns == NULL) {
        !          25529:                        xmlChar prefix[12];
        !          25530:                        int counter = 0;
        !          25531: 
        !          25532:                        /*
        !          25533:                        * Create a namespace declaration on the validation
        !          25534:                        * root node if no namespace declaration is in scope.
        !          25535:                        */
        !          25536:                        do {
        !          25537:                            snprintf((char *) prefix, 12, "p%d", counter++);
        !          25538:                            ns = xmlSearchNs(defAttrOwnerElem->doc,
        !          25539:                                defAttrOwnerElem, BAD_CAST prefix);
        !          25540:                            if (counter > 1000) {
        !          25541:                                VERROR_INT(
        !          25542:                                    "xmlSchemaVAttributesComplex",
        !          25543:                                    "could not compute a ns prefix for a "
        !          25544:                                    "default/fixed attribute");
        !          25545:                                if (normValue != NULL)
        !          25546:                                    xmlFree(normValue);
        !          25547:                                goto internal_error;
        !          25548:                            }
        !          25549:                        } while (ns != NULL);
        !          25550:                        ns = xmlNewNs(vctxt->validationRoot,
        !          25551:                            iattr->nsName, BAD_CAST prefix);
        !          25552:                    }
        !          25553:                    /*
        !          25554:                    * TODO:
        !          25555:                    * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html
        !          25556:                    * If we have QNames: do we need to ensure there's a
        !          25557:                    * prefix defined for the QName?
        !          25558:                    */
        !          25559:                    xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value);
        !          25560:                }
        !          25561:                if (normValue != NULL)
        !          25562:                    xmlFree(normValue);
        !          25563:            }
        !          25564:            /*
        !          25565:            * Go directly to IDC evaluation.
        !          25566:            */
        !          25567:            goto eval_idcs;
        !          25568:        }
        !          25569:        /*
        !          25570:        * Validate the value.
        !          25571:        */
        !          25572:        if (vctxt->value != NULL) {
        !          25573:            /*
        !          25574:            * Free last computed value; just for safety reasons.
        !          25575:            */
        !          25576:            xmlSchemaFreeValue(vctxt->value);
        !          25577:            vctxt->value = NULL;
        !          25578:        }
        !          25579:        /*
        !          25580:        * Note that the attribute *use* can be unavailable, if
        !          25581:        * the attribute was a wild attribute.
        !          25582:        */
        !          25583:        if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
        !          25584:            ((iattr->use != NULL) &&
        !          25585:             (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
        !          25586:            fixed = 1;
        !          25587:        else
        !          25588:            fixed = 0;
        !          25589:        /*
        !          25590:        * SPEC (cvc-attribute)
        !          25591:        * (3) "The item's �normalized value� must be locally �valid�
        !          25592:        * with respect to that {type definition} as per
        !          25593:        * String Valid (�3.14.4)."
        !          25594:        *
        !          25595:        * VAL TODO: Do we already have the
        !          25596:        * "normalized attribute value" here?
        !          25597:        */
        !          25598:        if (xpathRes || fixed) {
        !          25599:            iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
        !          25600:            /*
        !          25601:            * Request a computed value.
        !          25602:            */
        !          25603:            res = xmlSchemaVCheckCVCSimpleType(
        !          25604:                ACTXT_CAST vctxt,
        !          25605:                iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
        !          25606:                1, 1, 0);
        !          25607:        } else {
        !          25608:            res = xmlSchemaVCheckCVCSimpleType(
        !          25609:                ACTXT_CAST vctxt,
        !          25610:                iattr->node, iattr->typeDef, iattr->value, NULL,
        !          25611:                1, 0, 0);
        !          25612:        }
        !          25613: 
        !          25614:        if (res != 0) {
        !          25615:            if (res == -1) {
        !          25616:                VERROR_INT("xmlSchemaVAttributesComplex",
        !          25617:                    "calling xmlSchemaStreamValidateSimpleTypeValue()");
        !          25618:                goto internal_error;
        !          25619:            }
        !          25620:            iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
        !          25621:            /*
        !          25622:            * SPEC PSVI Assessment Outcome (Attribute)
        !          25623:            * [validity] = "invalid"
        !          25624:            */
        !          25625:            goto eval_idcs;
        !          25626:        }
        !          25627: 
        !          25628:        if (fixed) {
        !          25629:            /*
        !          25630:            * SPEC Attribute Locally Valid (Use) (cvc-au)
        !          25631:            * "For an attribute information item to be�valid�
        !          25632:            * with respect to an attribute use its *normalized*
        !          25633:            * value� must match the *canonical* lexical
        !          25634:            * representation of the attribute use's {value
        !          25635:            * constraint}value, if it is present and fixed."
        !          25636:            *
        !          25637:            * VAL TODO: The requirement for the *canonical* value
        !          25638:            * will be removed in XML Schema 1.1.
        !          25639:            */
        !          25640:            /*
        !          25641:            * SPEC Attribute Locally Valid (cvc-attribute)
        !          25642:            * (4) "The item's *actual* value� must match the *value* of
        !          25643:            * the {value constraint}, if it is present and fixed."
        !          25644:            */
        !          25645:            if (iattr->val == NULL) {
        !          25646:                /* VAL TODO: A value was not precomputed. */
        !          25647:                TODO
        !          25648:                goto eval_idcs;
        !          25649:            }
        !          25650:            if ((iattr->use != NULL) &&
        !          25651:                (iattr->use->defValue != NULL)) {
        !          25652:                if (iattr->use->defVal == NULL) {
        !          25653:                    /* VAL TODO: A default value was not precomputed. */
        !          25654:                    TODO
        !          25655:                    goto eval_idcs;
        !          25656:                }
        !          25657:                iattr->vcValue = iattr->use->defValue;
        !          25658:                /*
        !          25659:                if (xmlSchemaCompareValuesWhtsp(attr->val,
        !          25660:                    (xmlSchemaWhitespaceValueType) ws,
        !          25661:                    attr->use->defVal,
        !          25662:                    (xmlSchemaWhitespaceValueType) ws) != 0) {
        !          25663:                */
        !          25664:                if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
        !          25665:                    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
        !          25666:            } else {
        !          25667:                if (iattr->decl->defVal == NULL) {
        !          25668:                    /* VAL TODO: A default value was not precomputed. */
        !          25669:                    TODO
        !          25670:                    goto eval_idcs;
        !          25671:                }
        !          25672:                iattr->vcValue = iattr->decl->defValue;
        !          25673:                /*
        !          25674:                if (xmlSchemaCompareValuesWhtsp(attr->val,
        !          25675:                    (xmlSchemaWhitespaceValueType) ws,
        !          25676:                    attrDecl->defVal,
        !          25677:                    (xmlSchemaWhitespaceValueType) ws) != 0) {
        !          25678:                */
        !          25679:                if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
        !          25680:                    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
        !          25681:            }
        !          25682:            /*
        !          25683:            * [validity] = "valid"
        !          25684:            */
        !          25685:        }
        !          25686: eval_idcs:
        !          25687:        /*
        !          25688:        * Evaluate IDCs.
        !          25689:        */
        !          25690:        if (xpathRes) {
        !          25691:            if (xmlSchemaXPathProcessHistory(vctxt,
        !          25692:                vctxt->depth +1) == -1) {
        !          25693:                VERROR_INT("xmlSchemaVAttributesComplex",
        !          25694:                    "calling xmlSchemaXPathEvaluate()");
        !          25695:                goto internal_error;
        !          25696:            }
        !          25697:        } else if (vctxt->xpathStates != NULL)
        !          25698:            xmlSchemaXPathPop(vctxt);
        !          25699:     }
        !          25700: 
        !          25701:     /*
        !          25702:     * Report errors.
        !          25703:     */
        !          25704:     for (i = 0; i < vctxt->nbAttrInfos; i++) {
        !          25705:        iattr = vctxt->attrInfos[i];
        !          25706:        if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
        !          25707:            (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
        !          25708:            (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
        !          25709:            (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
        !          25710:            continue;
        !          25711:        ACTIVATE_ATTRIBUTE(iattr);
        !          25712:        switch (iattr->state) {
        !          25713:            case XML_SCHEMAS_ATTR_ERR_MISSING: {
        !          25714:                    xmlChar *str = NULL;
        !          25715:                    ACTIVATE_ELEM;
        !          25716:                    xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          25717:                        XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL,
        !          25718:                        "The attribute '%s' is required but missing",
        !          25719:                        xmlSchemaFormatQName(&str,
        !          25720:                            iattr->decl->targetNamespace,
        !          25721:                            iattr->decl->name),
        !          25722:                        NULL);
        !          25723:                    FREE_AND_NULL(str)
        !          25724:                    break;
        !          25725:                }
        !          25726:            case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
        !          25727:                VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL,
        !          25728:                    "The type definition is absent");
        !          25729:                break;
        !          25730:            case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
        !          25731:                xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          25732:                    XML_SCHEMAV_CVC_AU, NULL, NULL,
        !          25733:                    "The value '%s' does not match the fixed "
        !          25734:                    "value constraint '%s'",
        !          25735:                    iattr->value, iattr->vcValue);
        !          25736:                break;
        !          25737:            case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
        !          25738:                VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL,
        !          25739:                    "No matching global attribute declaration available, but "
        !          25740:                    "demanded by the strict wildcard");
        !          25741:                break;
        !          25742:            case XML_SCHEMAS_ATTR_UNKNOWN:
        !          25743:                if (iattr->metaType)
        !          25744:                    break;
        !          25745:                /*
        !          25746:                * MAYBE VAL TODO: One might report different error messages
        !          25747:                * for the following errors.
        !          25748:                */
        !          25749:                if (type->attributeWildcard == NULL) {
        !          25750:                    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
        !          25751:                        XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL);
        !          25752:                } else {
        !          25753:                    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
        !          25754:                        XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL);
        !          25755:                }
        !          25756:                break;
        !          25757:            default:
        !          25758:                break;
        !          25759:        }
        !          25760:     }
        !          25761: 
        !          25762:     ACTIVATE_ELEM;
        !          25763:     return (0);
        !          25764: internal_error:
        !          25765:     ACTIVATE_ELEM;
        !          25766:     return (-1);
        !          25767: }
        !          25768: 
        !          25769: static int
        !          25770: xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
        !          25771:                              int *skip)
        !          25772: {
        !          25773:     xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
        !          25774:     /*
        !          25775:     * The namespace of the element was already identified to be
        !          25776:     * matching the wildcard.
        !          25777:     */
        !          25778:     if ((skip == NULL) || (wild == NULL) ||
        !          25779:        (wild->type != XML_SCHEMA_TYPE_ANY)) {
        !          25780:        VERROR_INT("xmlSchemaValidateElemWildcard",
        !          25781:            "bad arguments");
        !          25782:        return (-1);
        !          25783:     }
        !          25784:     *skip = 0;
        !          25785:     if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
        !          25786:        /*
        !          25787:        * URGENT VAL TODO: Either we need to position the stream to the
        !          25788:        * next sibling, or walk the whole subtree.
        !          25789:        */
        !          25790:        *skip = 1;
        !          25791:        return (0);
        !          25792:     }
        !          25793:     {
        !          25794:        xmlSchemaElementPtr decl = NULL;
        !          25795: 
        !          25796:        decl = xmlSchemaGetElem(vctxt->schema,
        !          25797:            vctxt->inode->localName, vctxt->inode->nsName);
        !          25798:        if (decl != NULL) {
        !          25799:            vctxt->inode->decl = decl;
        !          25800:            return (0);
        !          25801:        }
        !          25802:     }
        !          25803:     if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
        !          25804:        /* VAL TODO: Change to proper error code. */
        !          25805:        VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */
        !          25806:            "No matching global element declaration available, but "
        !          25807:            "demanded by the strict wildcard");
        !          25808:        return (vctxt->err);
        !          25809:     }
        !          25810:     if (vctxt->nbAttrInfos != 0) {
        !          25811:        xmlSchemaAttrInfoPtr iattr;
        !          25812:        /*
        !          25813:        * SPEC Validation Rule: Schema-Validity Assessment (Element)
        !          25814:        * (1.2.1.2.1) - (1.2.1.2.3 )
        !          25815:        *
        !          25816:        * Use the xsi:type attribute for the type definition.
        !          25817:        */
        !          25818:        iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          25819:            XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
        !          25820:        if (iattr != NULL) {
        !          25821:            if (xmlSchemaProcessXSIType(vctxt, iattr,
        !          25822:                &(vctxt->inode->typeDef), NULL) == -1) {
        !          25823:                VERROR_INT("xmlSchemaValidateElemWildcard",
        !          25824:                    "calling xmlSchemaProcessXSIType() to "
        !          25825:                    "process the attribute 'xsi:nil'");
        !          25826:                return (-1);
        !          25827:            }
        !          25828:            /*
        !          25829:            * Don't return an error on purpose.
        !          25830:            */
        !          25831:            return (0);
        !          25832:        }
        !          25833:     }
        !          25834:     /*
        !          25835:     * SPEC Validation Rule: Schema-Validity Assessment (Element)
        !          25836:     *
        !          25837:     * Fallback to "anyType".
        !          25838:     */
        !          25839:     vctxt->inode->typeDef =
        !          25840:        xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
        !          25841:     return (0);
        !          25842: }
        !          25843: 
        !          25844: /*
        !          25845: * xmlSchemaCheckCOSValidDefault:
        !          25846: *
        !          25847: * This will be called if: not nilled, no content and a default/fixed
        !          25848: * value is provided.
        !          25849: */
        !          25850: 
        !          25851: static int
        !          25852: xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
        !          25853:                              const xmlChar *value,
        !          25854:                              xmlSchemaValPtr *val)
        !          25855: {
        !          25856:     int ret = 0;
        !          25857:     xmlSchemaNodeInfoPtr inode = vctxt->inode;
        !          25858: 
        !          25859:     /*
        !          25860:     * cos-valid-default:
        !          25861:     * Schema Component Constraint: Element Default Valid (Immediate)
        !          25862:     * For a string to be a valid default with respect to a type
        !          25863:     * definition the appropriate case among the following must be true:
        !          25864:     */
        !          25865:     if WXS_IS_COMPLEX(inode->typeDef) {
        !          25866:        /*
        !          25867:        * Complex type.
        !          25868:        *
        !          25869:        * SPEC (2.1) "its {content type} must be a simple type definition
        !          25870:        * or mixed."
        !          25871:        * SPEC (2.2.2) "If the {content type} is mixed, then the {content
        !          25872:        * type}'s particle must be �emptiable� as defined by
        !          25873:        * Particle Emptiable (�3.9.6)."
        !          25874:        */
        !          25875:        if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) &&
        !          25876:            ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) ||
        !          25877:             (! WXS_EMPTIABLE(inode->typeDef)))) {
        !          25878:            ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1;
        !          25879:            /* NOTE that this covers (2.2.2) as well. */
        !          25880:            VERROR(ret, NULL,
        !          25881:                "For a string to be a valid default, the type definition "
        !          25882:                "must be a simple type or a complex type with simple content "
        !          25883:                "or mixed content and a particle emptiable");
        !          25884:            return(ret);
        !          25885:        }
        !          25886:     }
        !          25887:     /*
        !          25888:     * 1 If the type definition is a simple type definition, then the string
        !          25889:     * must be �valid� with respect to that definition as defined by String
        !          25890:     * Valid (�3.14.4).
        !          25891:     *
        !          25892:     * AND
        !          25893:     *
        !          25894:     * 2.2.1 If the {content type} is a simple type definition, then the
        !          25895:     * string must be �valid� with respect to that simple type definition
        !          25896:     * as defined by String Valid (�3.14.4).
        !          25897:     */
        !          25898:     if (WXS_IS_SIMPLE(inode->typeDef)) {
        !          25899: 
        !          25900:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
        !          25901:            NULL, inode->typeDef, value, val, 1, 1, 0);
        !          25902: 
        !          25903:     } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
        !          25904: 
        !          25905:        ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
        !          25906:            NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0);
        !          25907:     }
        !          25908:     if (ret < 0) {
        !          25909:        VERROR_INT("xmlSchemaCheckCOSValidDefault",
        !          25910:            "calling xmlSchemaVCheckCVCSimpleType()");
        !          25911:     }
        !          25912:     return (ret);
        !          25913: }
        !          25914: 
        !          25915: static void
        !          25916: xmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
        !          25917:                               const xmlChar * name ATTRIBUTE_UNUSED,
        !          25918:                               xmlSchemaElementPtr item,
        !          25919:                               xmlSchemaNodeInfoPtr inode)
        !          25920: {
        !          25921:     inode->decl = item;
        !          25922: #ifdef DEBUG_CONTENT
        !          25923:     {
        !          25924:        xmlChar *str = NULL;
        !          25925: 
        !          25926:        if (item->type == XML_SCHEMA_TYPE_ELEMENT) {
        !          25927:            xmlGenericError(xmlGenericErrorContext,
        !          25928:                "AUTOMATON callback for '%s' [declaration]\n",
        !          25929:                xmlSchemaFormatQName(&str,
        !          25930:                inode->localName, inode->nsName));
        !          25931:        } else {
        !          25932:            xmlGenericError(xmlGenericErrorContext,
        !          25933:                    "AUTOMATON callback for '%s' [wildcard]\n",
        !          25934:                    xmlSchemaFormatQName(&str,
        !          25935:                    inode->localName, inode->nsName));
        !          25936: 
        !          25937:        }
        !          25938:        FREE_AND_NULL(str)
        !          25939:     }
        !          25940: #endif
        !          25941: }
        !          25942: 
        !          25943: static int
        !          25944: xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
        !          25945: {
        !          25946:     vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
        !          25947:     if (vctxt->inode == NULL) {
        !          25948:        VERROR_INT("xmlSchemaValidatorPushElem",
        !          25949:            "calling xmlSchemaGetFreshElemInfo()");
        !          25950:        return (-1);
        !          25951:     }
        !          25952:     vctxt->nbAttrInfos = 0;
        !          25953:     return (0);
        !          25954: }
        !          25955: 
        !          25956: static int
        !          25957: xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
        !          25958:                             xmlSchemaNodeInfoPtr inode,
        !          25959:                             xmlSchemaTypePtr type,
        !          25960:                             const xmlChar *value)
        !          25961: {
        !          25962:     if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
        !          25963:        return (xmlSchemaVCheckCVCSimpleType(
        !          25964:            ACTXT_CAST vctxt, NULL,
        !          25965:            type, value, &(inode->val), 1, 1, 0));
        !          25966:     else
        !          25967:        return (xmlSchemaVCheckCVCSimpleType(
        !          25968:            ACTXT_CAST vctxt, NULL,
        !          25969:            type, value, NULL, 1, 0, 0));
        !          25970: }
        !          25971: 
        !          25972: 
        !          25973: 
        !          25974: /*
        !          25975: * Process END of element.
        !          25976: */
        !          25977: static int
        !          25978: xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
        !          25979: {
        !          25980:     int ret = 0;
        !          25981:     xmlSchemaNodeInfoPtr inode = vctxt->inode;
        !          25982: 
        !          25983:     if (vctxt->nbAttrInfos != 0)
        !          25984:        xmlSchemaClearAttrInfos(vctxt);
        !          25985:     if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
        !          25986:        /*
        !          25987:        * This element was not expected;
        !          25988:        * we will not validate child elements of broken parents.
        !          25989:        * Skip validation of all content of the parent.
        !          25990:        */
        !          25991:        vctxt->skipDepth = vctxt->depth -1;
        !          25992:        goto end_elem;
        !          25993:     }
        !          25994:     if ((inode->typeDef == NULL) ||
        !          25995:        (inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
        !          25996:        /*
        !          25997:        * 1. the type definition might be missing if the element was
        !          25998:        *    error prone
        !          25999:        * 2. it might be abstract.
        !          26000:        */
        !          26001:        goto end_elem;
        !          26002:     }
        !          26003:     /*
        !          26004:     * Check the content model.
        !          26005:     */
        !          26006:     if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
        !          26007:        (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
        !          26008: 
        !          26009:        /*
        !          26010:        * Workaround for "anyType".
        !          26011:        */
        !          26012:        if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
        !          26013:            goto character_content;
        !          26014: 
        !          26015:        if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
        !          26016:            xmlChar *values[10];
        !          26017:            int terminal, nbval = 10, nbneg;
        !          26018: 
        !          26019:            if (inode->regexCtxt == NULL) {
        !          26020:                /*
        !          26021:                * Create the regex context.
        !          26022:                */
        !          26023:                inode->regexCtxt =
        !          26024:                    xmlRegNewExecCtxt(inode->typeDef->contModel,
        !          26025:                    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
        !          26026:                    vctxt);
        !          26027:                if (inode->regexCtxt == NULL) {
        !          26028:                    VERROR_INT("xmlSchemaValidatorPopElem",
        !          26029:                        "failed to create a regex context");
        !          26030:                    goto internal_error;
        !          26031:                }
        !          26032: #ifdef DEBUG_AUTOMATA
        !          26033:                xmlGenericError(xmlGenericErrorContext,
        !          26034:                    "AUTOMATON create on '%s'\n", inode->localName);
        !          26035: #endif
        !          26036:            }
        !          26037:            /*
        !          26038:            * Get hold of the still expected content, since a further
        !          26039:            * call to xmlRegExecPushString() will loose this information.
        !          26040:            */
        !          26041:            xmlRegExecNextValues(inode->regexCtxt,
        !          26042:                &nbval, &nbneg, &values[0], &terminal);
        !          26043:            ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL);
        !          26044:            if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) {
        !          26045:                /*
        !          26046:                * Still missing something.
        !          26047:                */
        !          26048:                ret = 1;
        !          26049:                inode->flags |=
        !          26050:                    XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
        !          26051:                xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
        !          26052:                    XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL,
        !          26053:                    "Missing child element(s)",
        !          26054:                    nbval, nbneg, values);
        !          26055: #ifdef DEBUG_AUTOMATA
        !          26056:                xmlGenericError(xmlGenericErrorContext,
        !          26057:                    "AUTOMATON missing ERROR on '%s'\n",
        !          26058:                    inode->localName);
        !          26059: #endif
        !          26060:            } else {
        !          26061:                /*
        !          26062:                * Content model is satisfied.
        !          26063:                */
        !          26064:                ret = 0;
        !          26065: #ifdef DEBUG_AUTOMATA
        !          26066:                xmlGenericError(xmlGenericErrorContext,
        !          26067:                    "AUTOMATON succeeded on '%s'\n",
        !          26068:                    inode->localName);
        !          26069: #endif
        !          26070:            }
        !          26071: 
        !          26072:        }
        !          26073:     }
        !          26074:     if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
        !          26075:        goto end_elem;
        !          26076: 
        !          26077: character_content:
        !          26078: 
        !          26079:     if (vctxt->value != NULL) {
        !          26080:        xmlSchemaFreeValue(vctxt->value);
        !          26081:        vctxt->value = NULL;
        !          26082:     }
        !          26083:     /*
        !          26084:     * Check character content.
        !          26085:     */
        !          26086:     if (inode->decl == NULL) {
        !          26087:        /*
        !          26088:        * Speedup if no declaration exists.
        !          26089:        */
        !          26090:        if (WXS_IS_SIMPLE(inode->typeDef)) {
        !          26091:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26092:                inode, inode->typeDef, inode->value);
        !          26093:        } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
        !          26094:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26095:                inode, inode->typeDef->contentTypeDef,
        !          26096:                inode->value);
        !          26097:        }
        !          26098:        if (ret < 0) {
        !          26099:            VERROR_INT("xmlSchemaValidatorPopElem",
        !          26100:                "calling xmlSchemaVCheckCVCSimpleType()");
        !          26101:            goto internal_error;
        !          26102:        }
        !          26103:        goto end_elem;
        !          26104:     }
        !          26105:     /*
        !          26106:     * cvc-elt (3.3.4) : 5
        !          26107:     * The appropriate case among the following must be true:
        !          26108:     */
        !          26109:     /*
        !          26110:     * cvc-elt (3.3.4) : 5.1
        !          26111:     * If the declaration has a {value constraint},
        !          26112:     * the item has neither element nor character [children] and
        !          26113:     * clause 3.2 has not applied, then all of the following must be true:
        !          26114:     */
        !          26115:     if ((inode->decl->value != NULL) &&
        !          26116:        (inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
        !          26117:        (! INODE_NILLED(inode))) {
        !          26118:        /*
        !          26119:        * cvc-elt (3.3.4) : 5.1.1
        !          26120:        * If the �actual type definition� is a �local type definition�
        !          26121:        * then the canonical lexical representation of the {value constraint}
        !          26122:        * value must be a valid default for the �actual type definition� as
        !          26123:        * defined in Element Default Valid (Immediate) (�3.3.6).
        !          26124:        */
        !          26125:        /*
        !          26126:        * NOTE: 'local' above means types acquired by xsi:type.
        !          26127:        * NOTE: Although the *canonical* value is stated, it is not
        !          26128:        * relevant if canonical or not. Additionally XML Schema 1.1
        !          26129:        * will removed this requirement as well.
        !          26130:        */
        !          26131:        if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
        !          26132: 
        !          26133:            ret = xmlSchemaCheckCOSValidDefault(vctxt,
        !          26134:                inode->decl->value, &(inode->val));
        !          26135:            if (ret != 0) {
        !          26136:                if (ret < 0) {
        !          26137:                    VERROR_INT("xmlSchemaValidatorPopElem",
        !          26138:                        "calling xmlSchemaCheckCOSValidDefault()");
        !          26139:                    goto internal_error;
        !          26140:                }
        !          26141:                goto end_elem;
        !          26142:            }
        !          26143:            /*
        !          26144:            * Stop here, to avoid redundant validation of the value
        !          26145:            * (see following).
        !          26146:            */
        !          26147:            goto default_psvi;
        !          26148:        }
        !          26149:        /*
        !          26150:        * cvc-elt (3.3.4) : 5.1.2
        !          26151:        * The element information item with the canonical lexical
        !          26152:        * representation of the {value constraint} value used as its
        !          26153:        * �normalized value� must be �valid� with respect to the
        !          26154:        * �actual type definition� as defined by Element Locally Valid (Type)
        !          26155:        * (�3.3.4).
        !          26156:        */
        !          26157:        if (WXS_IS_SIMPLE(inode->typeDef)) {
        !          26158:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26159:                inode, inode->typeDef, inode->decl->value);
        !          26160:        } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
        !          26161:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26162:                inode, inode->typeDef->contentTypeDef,
        !          26163:                inode->decl->value);
        !          26164:        }
        !          26165:        if (ret != 0) {
        !          26166:            if (ret < 0) {
        !          26167:                VERROR_INT("xmlSchemaValidatorPopElem",
        !          26168:                    "calling xmlSchemaVCheckCVCSimpleType()");
        !          26169:                goto internal_error;
        !          26170:            }
        !          26171:            goto end_elem;
        !          26172:        }
        !          26173: 
        !          26174: default_psvi:
        !          26175:        /*
        !          26176:        * PSVI: Create a text node on the instance element.
        !          26177:        */
        !          26178:        if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
        !          26179:            (inode->node != NULL)) {
        !          26180:            xmlNodePtr textChild;
        !          26181:            xmlChar *normValue;
        !          26182:            /*
        !          26183:            * VAL TODO: Normalize the value.
        !          26184:            */
        !          26185:            normValue = xmlSchemaNormalizeValue(inode->typeDef,
        !          26186:                inode->decl->value);
        !          26187:            if (normValue != NULL) {
        !          26188:                textChild = xmlNewText(BAD_CAST normValue);
        !          26189:                xmlFree(normValue);
        !          26190:            } else
        !          26191:                textChild = xmlNewText(inode->decl->value);
        !          26192:            if (textChild == NULL) {
        !          26193:                VERROR_INT("xmlSchemaValidatorPopElem",
        !          26194:                    "calling xmlNewText()");
        !          26195:                goto internal_error;
        !          26196:            } else
        !          26197:                xmlAddChild(inode->node, textChild);
        !          26198:        }
        !          26199: 
        !          26200:     } else if (! INODE_NILLED(inode)) {
        !          26201:        /*
        !          26202:        * 5.2.1 The element information item must be �valid� with respect
        !          26203:        * to the �actual type definition� as defined by Element Locally
        !          26204:        * Valid (Type) (�3.3.4).
        !          26205:        */
        !          26206:        if (WXS_IS_SIMPLE(inode->typeDef)) {
        !          26207:             /*
        !          26208:            * SPEC (cvc-type) (3.1)
        !          26209:            * "If the type definition is a simple type definition, ..."
        !          26210:            * (3.1.3) "If clause 3.2 of Element Locally Valid
        !          26211:            * (Element) (�3.3.4) did not apply, then the �normalized value�
        !          26212:            * must be �valid� with respect to the type definition as defined
        !          26213:            * by String Valid (�3.14.4).
        !          26214:            */
        !          26215:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26216:                    inode, inode->typeDef, inode->value);
        !          26217:        } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
        !          26218:            /*
        !          26219:            * SPEC (cvc-type) (3.2) "If the type definition is a complex type
        !          26220:            * definition, then the element information item must be
        !          26221:            * �valid� with respect to the type definition as per
        !          26222:            * Element Locally Valid (Complex Type) (�3.4.4);"
        !          26223:            *
        !          26224:            * SPEC (cvc-complex-type) (2.2)
        !          26225:            * "If the {content type} is a simple type definition, ...
        !          26226:            * the �normalized value� of the element information item is
        !          26227:            * �valid� with respect to that simple type definition as
        !          26228:            * defined by String Valid (�3.14.4)."
        !          26229:            */
        !          26230:            ret = xmlSchemaVCheckINodeDataType(vctxt,
        !          26231:                inode, inode->typeDef->contentTypeDef, inode->value);
        !          26232:        }
        !          26233:        if (ret != 0) {
        !          26234:            if (ret < 0) {
        !          26235:                VERROR_INT("xmlSchemaValidatorPopElem",
        !          26236:                    "calling xmlSchemaVCheckCVCSimpleType()");
        !          26237:                goto internal_error;
        !          26238:            }
        !          26239:            goto end_elem;
        !          26240:        }
        !          26241:        /*
        !          26242:        * 5.2.2 If there is a fixed {value constraint} and clause 3.2 has
        !          26243:        * not applied, all of the following must be true:
        !          26244:        */
        !          26245:        if ((inode->decl->value != NULL) &&
        !          26246:            (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
        !          26247: 
        !          26248:            /*
        !          26249:            * TODO: We will need a computed value, when comparison is
        !          26250:            * done on computed values.
        !          26251:            */
        !          26252:            /*
        !          26253:            * 5.2.2.1 The element information item must have no element
        !          26254:            * information item [children].
        !          26255:            */
        !          26256:            if (inode->flags &
        !          26257:                    XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
        !          26258:                ret = XML_SCHEMAV_CVC_ELT_5_2_2_1;
        !          26259:                VERROR(ret, NULL,
        !          26260:                    "The content must not containt element nodes since "
        !          26261:                    "there is a fixed value constraint");
        !          26262:                goto end_elem;
        !          26263:            } else {
        !          26264:                /*
        !          26265:                * 5.2.2.2 The appropriate case among the following must
        !          26266:                * be true:
        !          26267:                */
        !          26268:                if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) {
        !          26269:                    /*
        !          26270:                    * 5.2.2.2.1 If the {content type} of the �actual type
        !          26271:                    * definition� is mixed, then the *initial value* of the
        !          26272:                    * item must match the canonical lexical representation
        !          26273:                    * of the {value constraint} value.
        !          26274:                    *
        !          26275:                    * ... the *initial value* of an element information
        !          26276:                    * item is the string composed of, in order, the
        !          26277:                    * [character code] of each character information item in
        !          26278:                    * the [children] of that element information item.
        !          26279:                    */
        !          26280:                    if (! xmlStrEqual(inode->value, inode->decl->value)){
        !          26281:                        /*
        !          26282:                        * VAL TODO: Report invalid & expected values as well.
        !          26283:                        * VAL TODO: Implement the canonical stuff.
        !          26284:                        */
        !          26285:                        ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1;
        !          26286:                        xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          26287:                            ret, NULL, NULL,
        !          26288:                            "The initial value '%s' does not match the fixed "
        !          26289:                            "value constraint '%s'",
        !          26290:                            inode->value, inode->decl->value);
        !          26291:                        goto end_elem;
        !          26292:                    }
        !          26293:                } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
        !          26294:                    /*
        !          26295:                    * 5.2.2.2.2 If the {content type} of the �actual type
        !          26296:                    * definition� is a simple type definition, then the
        !          26297:                    * *actual value* of the item must match the canonical
        !          26298:                    * lexical representation of the {value constraint} value.
        !          26299:                    */
        !          26300:                    /*
        !          26301:                    * VAL TODO: *actual value* is the normalized value, impl.
        !          26302:                    *           this.
        !          26303:                    * VAL TODO: Report invalid & expected values as well.
        !          26304:                    * VAL TODO: Implement a comparison with the computed values.
        !          26305:                    */
        !          26306:                    if (! xmlStrEqual(inode->value,
        !          26307:                            inode->decl->value)) {
        !          26308:                        ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2;
        !          26309:                        xmlSchemaCustomErr(ACTXT_CAST vctxt,
        !          26310:                            ret, NULL, NULL,
        !          26311:                            "The actual value '%s' does not match the fixed "
        !          26312:                            "value constraint '%s'",
        !          26313:                            inode->value,
        !          26314:                            inode->decl->value);
        !          26315:                        goto end_elem;
        !          26316:                    }
        !          26317:                }
        !          26318:            }
        !          26319:        }
        !          26320:     }
        !          26321: 
        !          26322: end_elem:
        !          26323:     if (vctxt->depth < 0) {
        !          26324:        /* TODO: raise error? */
        !          26325:        return (0);
        !          26326:     }
        !          26327:     if (vctxt->depth == vctxt->skipDepth)
        !          26328:        vctxt->skipDepth = -1;
        !          26329:     /*
        !          26330:     * Evaluate the history of XPath state objects.
        !          26331:     */
        !          26332:     if (inode->appliedXPath &&
        !          26333:        (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
        !          26334:        goto internal_error;
        !          26335:     /*
        !          26336:     * MAYBE TODO:
        !          26337:     * SPEC (6) "The element information item must be �valid� with
        !          26338:     * respect to each of the {identity-constraint definitions} as per
        !          26339:     * Identity-constraint Satisfied (�3.11.4)."
        !          26340:     */
        !          26341:     /*
        !          26342:     * PSVI TODO: If we expose IDC node-tables via PSVI then the tables
        !          26343:     *   need to be built in any case.
        !          26344:     *   We will currently build IDC node-tables and bubble them only if
        !          26345:     *   keyrefs do exist.
        !          26346:     */
        !          26347: 
        !          26348:     /*
        !          26349:     * Add the current IDC target-nodes to the IDC node-tables.
        !          26350:     */
        !          26351:     if ((inode->idcMatchers != NULL) &&
        !          26352:        (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
        !          26353:     {
        !          26354:        if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1)
        !          26355:            goto internal_error;
        !          26356:     }
        !          26357:     /*
        !          26358:     * Validate IDC keyrefs.
        !          26359:     */
        !          26360:     if (vctxt->inode->hasKeyrefs)
        !          26361:        if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
        !          26362:            goto internal_error;
        !          26363:     /*
        !          26364:     * Merge/free the IDC table.
        !          26365:     */
        !          26366:     if (inode->idcTable != NULL) {
        !          26367: #ifdef DEBUG_IDC_NODE_TABLE
        !          26368:        xmlSchemaDebugDumpIDCTable(stdout,
        !          26369:            inode->nsName,
        !          26370:            inode->localName,
        !          26371:            inode->idcTable);
        !          26372: #endif
        !          26373:        if ((vctxt->depth > 0) &&
        !          26374:            (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
        !          26375:        {
        !          26376:            /*
        !          26377:            * Merge the IDC node table with the table of the parent node.
        !          26378:            */
        !          26379:            if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
        !          26380:                goto internal_error;
        !          26381:        }
        !          26382:     }
        !          26383:     /*
        !          26384:     * Clear the current ielem.
        !          26385:     * VAL TODO: Don't free the PSVI IDC tables if they are
        !          26386:     * requested for the PSVI.
        !          26387:     */
        !          26388:     xmlSchemaClearElemInfo(vctxt, inode);
        !          26389:     /*
        !          26390:     * Skip further processing if we are on the validation root.
        !          26391:     */
        !          26392:     if (vctxt->depth == 0) {
        !          26393:        vctxt->depth--;
        !          26394:        vctxt->inode = NULL;
        !          26395:        return (0);
        !          26396:     }
        !          26397:     /*
        !          26398:     * Reset the keyrefDepth if needed.
        !          26399:     */
        !          26400:     if (vctxt->aidcs != NULL) {
        !          26401:        xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
        !          26402:        do {
        !          26403:            if (aidc->keyrefDepth == vctxt->depth) {
        !          26404:                /*
        !          26405:                * A 'keyrefDepth' of a key/unique IDC matches the current
        !          26406:                * depth, this means that we are leaving the scope of the
        !          26407:                * top-most keyref IDC which refers to this IDC.
        !          26408:                */
        !          26409:                aidc->keyrefDepth = -1;
        !          26410:            }
        !          26411:            aidc = aidc->next;
        !          26412:        } while (aidc != NULL);
        !          26413:     }
        !          26414:     vctxt->depth--;
        !          26415:     vctxt->inode = vctxt->elemInfos[vctxt->depth];
        !          26416:     /*
        !          26417:     * VAL TODO: 7 If the element information item is the �validation root�, it must be
        !          26418:     * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4).
        !          26419:     */
        !          26420:     return (ret);
        !          26421: 
        !          26422: internal_error:
        !          26423:     vctxt->err = -1;
        !          26424:     return (-1);
        !          26425: }
        !          26426: 
        !          26427: /*
        !          26428: * 3.4.4 Complex Type Definition Validation Rules
        !          26429: * Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type)
        !          26430: */
        !          26431: static int
        !          26432: xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
        !          26433: {
        !          26434:     xmlSchemaNodeInfoPtr pielem;
        !          26435:     xmlSchemaTypePtr ptype;
        !          26436:     int ret = 0;
        !          26437: 
        !          26438:     if (vctxt->depth <= 0) {
        !          26439:        VERROR_INT("xmlSchemaValidateChildElem",
        !          26440:            "not intended for the validation root");
        !          26441:        return (-1);
        !          26442:     }
        !          26443:     pielem = vctxt->elemInfos[vctxt->depth -1];
        !          26444:     if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
        !          26445:        pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          26446:     /*
        !          26447:     * Handle 'nilled' elements.
        !          26448:     */
        !          26449:     if (INODE_NILLED(pielem)) {
        !          26450:        /*
        !          26451:        * SPEC (cvc-elt) (3.3.4) : (3.2.1)
        !          26452:        */
        !          26453:        ACTIVATE_PARENT_ELEM;
        !          26454:        ret = XML_SCHEMAV_CVC_ELT_3_2_1;
        !          26455:        VERROR(ret, NULL,
        !          26456:            "Neither character nor element content is allowed, "
        !          26457:            "because the element was 'nilled'");
        !          26458:        ACTIVATE_ELEM;
        !          26459:        goto unexpected_elem;
        !          26460:     }
        !          26461: 
        !          26462:     ptype = pielem->typeDef;
        !          26463: 
        !          26464:     if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
        !          26465:        /*
        !          26466:        * Workaround for "anyType": we have currently no content model
        !          26467:        * assigned for "anyType", so handle it explicitely.
        !          26468:        * "anyType" has an unbounded, lax "any" wildcard.
        !          26469:        */
        !          26470:        vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
        !          26471:            vctxt->inode->localName,
        !          26472:            vctxt->inode->nsName);
        !          26473: 
        !          26474:        if (vctxt->inode->decl == NULL) {
        !          26475:            xmlSchemaAttrInfoPtr iattr;
        !          26476:            /*
        !          26477:            * Process "xsi:type".
        !          26478:            * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3)
        !          26479:            */
        !          26480:            iattr = xmlSchemaGetMetaAttrInfo(vctxt,
        !          26481:                XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
        !          26482:            if (iattr != NULL) {
        !          26483:                ret = xmlSchemaProcessXSIType(vctxt, iattr,
        !          26484:                    &(vctxt->inode->typeDef), NULL);
        !          26485:                if (ret != 0) {
        !          26486:                    if (ret == -1) {
        !          26487:                        VERROR_INT("xmlSchemaValidateChildElem",
        !          26488:                            "calling xmlSchemaProcessXSIType() to "
        !          26489:                            "process the attribute 'xsi:nil'");
        !          26490:                        return (-1);
        !          26491:                    }
        !          26492:                    return (ret);
        !          26493:                }
        !          26494:            } else {
        !          26495:                 /*
        !          26496:                 * Fallback to "anyType".
        !          26497:                 *
        !          26498:                 * SPEC (cvc-assess-elt)
        !          26499:                 * "If the item cannot be �strictly assessed�, [...]
        !          26500:                 * an element information item's schema validity may be laxly
        !          26501:                 * assessed if its �context-determined declaration� is not
        !          26502:                 * skip by �validating� with respect to the �ur-type
        !          26503:                 * definition� as per Element Locally Valid (Type) (�3.3.4)."
        !          26504:                */
        !          26505:                vctxt->inode->typeDef =
        !          26506:                    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
        !          26507:            }
        !          26508:        }
        !          26509:        return (0);
        !          26510:     }
        !          26511: 
        !          26512:     switch (ptype->contentType) {
        !          26513:        case XML_SCHEMA_CONTENT_EMPTY:
        !          26514:            /*
        !          26515:            * SPEC (2.1) "If the {content type} is empty, then the
        !          26516:            * element information item has no character or element
        !          26517:            * information item [children]."
        !          26518:            */
        !          26519:            ACTIVATE_PARENT_ELEM
        !          26520:            ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1;
        !          26521:            VERROR(ret, NULL,
        !          26522:                "Element content is not allowed, "
        !          26523:                "because the content type is empty");
        !          26524:            ACTIVATE_ELEM
        !          26525:            goto unexpected_elem;
        !          26526:            break;
        !          26527: 
        !          26528:        case XML_SCHEMA_CONTENT_MIXED:
        !          26529:         case XML_SCHEMA_CONTENT_ELEMENTS: {
        !          26530:            xmlRegExecCtxtPtr regexCtxt;
        !          26531:            xmlChar *values[10];
        !          26532:            int terminal, nbval = 10, nbneg;
        !          26533: 
        !          26534:            /* VAL TODO: Optimized "anyType" validation.*/
        !          26535: 
        !          26536:            if (ptype->contModel == NULL) {
        !          26537:                VERROR_INT("xmlSchemaValidateChildElem",
        !          26538:                    "type has elem content but no content model");
        !          26539:                return (-1);
        !          26540:            }
        !          26541:            /*
        !          26542:            * Safety belf for evaluation if the cont. model was already
        !          26543:            * examined to be invalid.
        !          26544:            */
        !          26545:            if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
        !          26546:                VERROR_INT("xmlSchemaValidateChildElem",
        !          26547:                    "validating elem, but elem content is already invalid");
        !          26548:                return (-1);
        !          26549:            }
        !          26550: 
        !          26551:            regexCtxt = pielem->regexCtxt;
        !          26552:            if (regexCtxt == NULL) {
        !          26553:                /*
        !          26554:                * Create the regex context.
        !          26555:                */
        !          26556:                regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
        !          26557:                    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
        !          26558:                    vctxt);
        !          26559:                if (regexCtxt == NULL) {
        !          26560:                    VERROR_INT("xmlSchemaValidateChildElem",
        !          26561:                        "failed to create a regex context");
        !          26562:                    return (-1);
        !          26563:                }
        !          26564:                pielem->regexCtxt = regexCtxt;
        !          26565: #ifdef DEBUG_AUTOMATA
        !          26566:                xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n",
        !          26567:                    pielem->localName);
        !          26568: #endif
        !          26569:            }
        !          26570: 
        !          26571:            /*
        !          26572:            * SPEC (2.4) "If the {content type} is element-only or mixed,
        !          26573:            * then the sequence of the element information item's
        !          26574:            * element information item [children], if any, taken in
        !          26575:            * order, is �valid� with respect to the {content type}'s
        !          26576:            * particle, as defined in Element Sequence Locally Valid
        !          26577:            * (Particle) (�3.9.4)."
        !          26578:            */
        !          26579:            ret = xmlRegExecPushString2(regexCtxt,
        !          26580:                vctxt->inode->localName,
        !          26581:                vctxt->inode->nsName,
        !          26582:                vctxt->inode);
        !          26583: #ifdef DEBUG_AUTOMATA
        !          26584:            if (ret < 0)
        !          26585:                xmlGenericError(xmlGenericErrorContext,
        !          26586:                "AUTOMATON push ERROR for '%s' on '%s'\n",
        !          26587:                vctxt->inode->localName, pielem->localName);
        !          26588:            else
        !          26589:                xmlGenericError(xmlGenericErrorContext,
        !          26590:                "AUTOMATON push OK for '%s' on '%s'\n",
        !          26591:                vctxt->inode->localName, pielem->localName);
        !          26592: #endif
        !          26593:            if (vctxt->err == XML_SCHEMAV_INTERNAL) {
        !          26594:                VERROR_INT("xmlSchemaValidateChildElem",
        !          26595:                    "calling xmlRegExecPushString2()");
        !          26596:                return (-1);
        !          26597:            }
        !          26598:            if (ret < 0) {
        !          26599:                xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg,
        !          26600:                    &values[0], &terminal);
        !          26601:                xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
        !          26602:                    XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL,
        !          26603:                    "This element is not expected",
        !          26604:                    nbval, nbneg, values);
        !          26605:                ret = vctxt->err;
        !          26606:                goto unexpected_elem;
        !          26607:            } else
        !          26608:                ret = 0;
        !          26609:        }
        !          26610:            break;
        !          26611:        case XML_SCHEMA_CONTENT_SIMPLE:
        !          26612:        case XML_SCHEMA_CONTENT_BASIC:
        !          26613:            ACTIVATE_PARENT_ELEM
        !          26614:            if (WXS_IS_COMPLEX(ptype)) {
        !          26615:                /*
        !          26616:                * SPEC (cvc-complex-type) (2.2)
        !          26617:                * "If the {content type} is a simple type definition, then
        !          26618:                * the element information item has no element information
        !          26619:                * item [children], ..."
        !          26620:                */
        !          26621:                ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2;
        !          26622:                VERROR(ret, NULL, "Element content is not allowed, "
        !          26623:                    "because the content type is a simple type definition");
        !          26624:            } else {
        !          26625:                /*
        !          26626:                * SPEC (cvc-type) (3.1.2) "The element information item must
        !          26627:                * have no element information item [children]."
        !          26628:                */
        !          26629:                ret = XML_SCHEMAV_CVC_TYPE_3_1_2;
        !          26630:                VERROR(ret, NULL, "Element content is not allowed, "
        !          26631:                    "because the type definition is simple");
        !          26632:            }
        !          26633:            ACTIVATE_ELEM
        !          26634:            ret = vctxt->err;
        !          26635:            goto unexpected_elem;
        !          26636:            break;
        !          26637: 
        !          26638:        default:
        !          26639:            break;
        !          26640:     }
        !          26641:     return (ret);
        !          26642: unexpected_elem:
        !          26643:     /*
        !          26644:     * Pop this element and set the skipDepth to skip
        !          26645:     * all further content of the parent element.
        !          26646:     */
        !          26647:     vctxt->skipDepth = vctxt->depth;
        !          26648:     vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
        !          26649:     pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
        !          26650:     return (ret);
        !          26651: }
        !          26652: 
        !          26653: #define XML_SCHEMA_PUSH_TEXT_PERSIST 1
        !          26654: #define XML_SCHEMA_PUSH_TEXT_CREATED 2
        !          26655: #define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
        !          26656: 
        !          26657: static int
        !          26658: xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
        !          26659:                  int nodeType, const xmlChar *value, int len,
        !          26660:                  int mode, int *consumed)
        !          26661: {
        !          26662:     /*
        !          26663:     * Unfortunately we have to duplicate the text sometimes.
        !          26664:     * OPTIMIZE: Maybe we could skip it, if:
        !          26665:     *   1. content type is simple
        !          26666:     *   2. whitespace is "collapse"
        !          26667:     *   3. it consists of whitespace only
        !          26668:     *
        !          26669:     * Process character content.
        !          26670:     */
        !          26671:     if (consumed != NULL)
        !          26672:        *consumed = 0;
        !          26673:     if (INODE_NILLED(vctxt->inode)) {
        !          26674:        /*
        !          26675:        * SPEC cvc-elt (3.3.4 - 3.2.1)
        !          26676:        * "The element information item must have no character or
        !          26677:        * element information item [children]."
        !          26678:        */
        !          26679:        VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL,
        !          26680:            "Neither character nor element content is allowed "
        !          26681:            "because the element is 'nilled'");
        !          26682:        return (vctxt->err);
        !          26683:     }
        !          26684:     /*
        !          26685:     * SPEC (2.1) "If the {content type} is empty, then the
        !          26686:     * element information item has no character or element
        !          26687:     * information item [children]."
        !          26688:     */
        !          26689:     if (vctxt->inode->typeDef->contentType ==
        !          26690:            XML_SCHEMA_CONTENT_EMPTY) {
        !          26691:        VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL,
        !          26692:            "Character content is not allowed, "
        !          26693:            "because the content type is empty");
        !          26694:        return (vctxt->err);
        !          26695:     }
        !          26696: 
        !          26697:     if (vctxt->inode->typeDef->contentType ==
        !          26698:            XML_SCHEMA_CONTENT_ELEMENTS) {
        !          26699:        if ((nodeType != XML_TEXT_NODE) ||
        !          26700:            (! xmlSchemaIsBlank((xmlChar *) value, len))) {
        !          26701:            /*
        !          26702:            * SPEC cvc-complex-type (2.3)
        !          26703:            * "If the {content type} is element-only, then the
        !          26704:            * element information item has no character information
        !          26705:            * item [children] other than those whose [character
        !          26706:            * code] is defined as a white space in [XML 1.0 (Second
        !          26707:            * Edition)]."
        !          26708:            */
        !          26709:            VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL,
        !          26710:                "Character content other than whitespace is not allowed "
        !          26711:                "because the content type is 'element-only'");
        !          26712:            return (vctxt->err);
        !          26713:        }
        !          26714:        return (0);
        !          26715:     }
        !          26716: 
        !          26717:     if ((value == NULL) || (value[0] == 0))
        !          26718:        return (0);
        !          26719:     /*
        !          26720:     * Save the value.
        !          26721:     * NOTE that even if the content type is *mixed*, we need the
        !          26722:     * *initial value* for default/fixed value constraints.
        !          26723:     */
        !          26724:     if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
        !          26725:        ((vctxt->inode->decl == NULL) ||
        !          26726:        (vctxt->inode->decl->value == NULL)))
        !          26727:        return (0);
        !          26728: 
        !          26729:     if (vctxt->inode->value == NULL) {
        !          26730:        /*
        !          26731:        * Set the value.
        !          26732:        */
        !          26733:        switch (mode) {
        !          26734:            case XML_SCHEMA_PUSH_TEXT_PERSIST:
        !          26735:                /*
        !          26736:                * When working on a tree.
        !          26737:                */
        !          26738:                vctxt->inode->value = value;
        !          26739:                break;
        !          26740:            case XML_SCHEMA_PUSH_TEXT_CREATED:
        !          26741:                /*
        !          26742:                * When working with the reader.
        !          26743:                * The value will be freed by the element info.
        !          26744:                */
        !          26745:                vctxt->inode->value = value;
        !          26746:                if (consumed != NULL)
        !          26747:                    *consumed = 1;
        !          26748:                vctxt->inode->flags |=
        !          26749:                    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
        !          26750:                break;
        !          26751:            case XML_SCHEMA_PUSH_TEXT_VOLATILE:
        !          26752:                /*
        !          26753:                * When working with SAX.
        !          26754:                * The value will be freed by the element info.
        !          26755:                */
        !          26756:                if (len != -1)
        !          26757:                    vctxt->inode->value = BAD_CAST xmlStrndup(value, len);
        !          26758:                else
        !          26759:                    vctxt->inode->value = BAD_CAST xmlStrdup(value);
        !          26760:                vctxt->inode->flags |=
        !          26761:                    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
        !          26762:                break;
        !          26763:            default:
        !          26764:                break;
        !          26765:        }
        !          26766:     } else {
        !          26767:        if (len < 0)
        !          26768:            len = xmlStrlen(value);
        !          26769:        /*
        !          26770:        * Concat the value.
        !          26771:        */
        !          26772:        if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
        !          26773:            vctxt->inode->value = BAD_CAST xmlStrncat(
        !          26774:                (xmlChar *) vctxt->inode->value, value, len);
        !          26775:        } else {
        !          26776:            vctxt->inode->value =
        !          26777:                BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len);
        !          26778:            vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
        !          26779:        }
        !          26780:     }
        !          26781: 
        !          26782:     return (0);
        !          26783: }
        !          26784: 
        !          26785: static int
        !          26786: xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
        !          26787: {
        !          26788:     int ret = 0;
        !          26789: 
        !          26790:     if ((vctxt->skipDepth != -1) &&
        !          26791:        (vctxt->depth >= vctxt->skipDepth)) {
        !          26792:        VERROR_INT("xmlSchemaValidateElem",
        !          26793:            "in skip-state");
        !          26794:        goto internal_error;
        !          26795:     }
        !          26796:     if (vctxt->xsiAssemble) {
        !          26797:        /*
        !          26798:        * We will stop validation if there was an error during
        !          26799:        * dynamic schema construction.
        !          26800:        * Note that we simply set @skipDepth to 0, this could
        !          26801:        * mean that a streaming document via SAX would be
        !          26802:        * still read to the end but it won't be validated any more.
        !          26803:        * TODO: If we are sure how to stop the validation at once
        !          26804:        *   for all input scenarios, then this should be changed to
        !          26805:        *   instantly stop the validation.
        !          26806:        */
        !          26807:        ret = xmlSchemaAssembleByXSI(vctxt);
        !          26808:        if (ret != 0) {
        !          26809:            if (ret == -1)
        !          26810:                goto internal_error;
        !          26811:            vctxt->skipDepth = 0;
        !          26812:            return(ret);
        !          26813:        }
        !          26814:         /*
        !          26815:          * Augment the IDC definitions for the main schema and all imported ones
        !          26816:          * NOTE: main schema is the first in the imported list
        !          26817:          */
        !          26818:         xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
        !          26819:     }
        !          26820:     if (vctxt->depth > 0) {
        !          26821:        /*
        !          26822:        * Validate this element against the content model
        !          26823:        * of the parent.
        !          26824:        */
        !          26825:        ret = xmlSchemaValidateChildElem(vctxt);
        !          26826:        if (ret != 0) {
        !          26827:            if (ret < 0) {
        !          26828:                VERROR_INT("xmlSchemaValidateElem",
        !          26829:                    "calling xmlSchemaStreamValidateChildElement()");
        !          26830:                goto internal_error;
        !          26831:            }
        !          26832:            goto exit;
        !          26833:        }
        !          26834:        if (vctxt->depth == vctxt->skipDepth)
        !          26835:            goto exit;
        !          26836:        if ((vctxt->inode->decl == NULL) &&
        !          26837:            (vctxt->inode->typeDef == NULL)) {
        !          26838:            VERROR_INT("xmlSchemaValidateElem",
        !          26839:                "the child element was valid but neither the "
        !          26840:                "declaration nor the type was set");
        !          26841:            goto internal_error;
        !          26842:        }
        !          26843:     } else {
        !          26844:        /*
        !          26845:        * Get the declaration of the validation root.
        !          26846:        */
        !          26847:        vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
        !          26848:            vctxt->inode->localName,
        !          26849:            vctxt->inode->nsName);
        !          26850:        if (vctxt->inode->decl == NULL) {
        !          26851:            ret = XML_SCHEMAV_CVC_ELT_1;
        !          26852:            VERROR(ret, NULL,
        !          26853:                "No matching global declaration available "
        !          26854:                "for the validation root");
        !          26855:            goto exit;
        !          26856:        }
        !          26857:     }
        !          26858: 
        !          26859:     if (vctxt->inode->decl == NULL)
        !          26860:        goto type_validation;
        !          26861: 
        !          26862:     if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
        !          26863:        int skip;
        !          26864:        /*
        !          26865:        * Wildcards.
        !          26866:        */
        !          26867:        ret = xmlSchemaValidateElemWildcard(vctxt, &skip);
        !          26868:        if (ret != 0) {
        !          26869:            if (ret < 0) {
        !          26870:                VERROR_INT("xmlSchemaValidateElem",
        !          26871:                    "calling xmlSchemaValidateElemWildcard()");
        !          26872:                goto internal_error;
        !          26873:            }
        !          26874:            goto exit;
        !          26875:        }
        !          26876:        if (skip) {
        !          26877:            vctxt->skipDepth = vctxt->depth;
        !          26878:            goto exit;
        !          26879:        }
        !          26880:        /*
        !          26881:        * The declaration might be set by the wildcard validation,
        !          26882:        * when the processContents is "lax" or "strict".
        !          26883:        */
        !          26884:        if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
        !          26885:            /*
        !          26886:            * Clear the "decl" field to not confuse further processing.
        !          26887:            */
        !          26888:            vctxt->inode->decl = NULL;
        !          26889:            goto type_validation;
        !          26890:        }
        !          26891:     }
        !          26892:     /*
        !          26893:     * Validate against the declaration.
        !          26894:     */
        !          26895:     ret = xmlSchemaValidateElemDecl(vctxt);
        !          26896:     if (ret != 0) {
        !          26897:        if (ret < 0) {
        !          26898:            VERROR_INT("xmlSchemaValidateElem",
        !          26899:                "calling xmlSchemaValidateElemDecl()");
        !          26900:            goto internal_error;
        !          26901:        }
        !          26902:        goto exit;
        !          26903:     }
        !          26904:     /*
        !          26905:     * Validate against the type definition.
        !          26906:     */
        !          26907: type_validation:
        !          26908: 
        !          26909:     if (vctxt->inode->typeDef == NULL) {
        !          26910:        vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
        !          26911:        ret = XML_SCHEMAV_CVC_TYPE_1;
        !          26912:        VERROR(ret, NULL,
        !          26913:            "The type definition is absent");
        !          26914:        goto exit;
        !          26915:     }
        !          26916:     if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
        !          26917:        vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
        !          26918:        ret = XML_SCHEMAV_CVC_TYPE_2;
        !          26919:            VERROR(ret, NULL,
        !          26920:            "The type definition is abstract");
        !          26921:        goto exit;
        !          26922:     }
        !          26923:     /*
        !          26924:     * Evaluate IDCs. Do it here, since new IDC matchers are registered
        !          26925:     * during validation against the declaration. This must be done
        !          26926:     * _before_ attribute validation.
        !          26927:     */
        !          26928:     if (vctxt->xpathStates != NULL) {
        !          26929:        ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
        !          26930:        vctxt->inode->appliedXPath = 1;
        !          26931:        if (ret == -1) {
        !          26932:            VERROR_INT("xmlSchemaValidateElem",
        !          26933:                "calling xmlSchemaXPathEvaluate()");
        !          26934:            goto internal_error;
        !          26935:        }
        !          26936:     }
        !          26937:     /*
        !          26938:     * Validate attributes.
        !          26939:     */
        !          26940:     if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
        !          26941:        if ((vctxt->nbAttrInfos != 0) ||
        !          26942:            (vctxt->inode->typeDef->attrUses != NULL)) {
        !          26943: 
        !          26944:            ret = xmlSchemaVAttributesComplex(vctxt);
        !          26945:        }
        !          26946:     } else if (vctxt->nbAttrInfos != 0) {
        !          26947: 
        !          26948:        ret = xmlSchemaVAttributesSimple(vctxt);
        !          26949:     }
        !          26950:     /*
        !          26951:     * Clear registered attributes.
        !          26952:     */
        !          26953:     if (vctxt->nbAttrInfos != 0)
        !          26954:        xmlSchemaClearAttrInfos(vctxt);
        !          26955:     if (ret == -1) {
        !          26956:        VERROR_INT("xmlSchemaValidateElem",
        !          26957:            "calling attributes validation");
        !          26958:        goto internal_error;
        !          26959:     }
        !          26960:     /*
        !          26961:     * Don't return an error if attributes are invalid on purpose.
        !          26962:     */
        !          26963:     ret = 0;
        !          26964: 
        !          26965: exit:
        !          26966:     if (ret != 0)
        !          26967:        vctxt->skipDepth = vctxt->depth;
        !          26968:     return (ret);
        !          26969: internal_error:
        !          26970:     return (-1);
        !          26971: }
        !          26972: 
        !          26973: #ifdef XML_SCHEMA_READER_ENABLED
        !          26974: static int
        !          26975: xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
        !          26976: {
        !          26977:     const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
        !          26978:     int depth, nodeType, ret = 0, consumed;
        !          26979:     xmlSchemaNodeInfoPtr ielem;
        !          26980: 
        !          26981:     vctxt->depth = -1;
        !          26982:     ret = xmlTextReaderRead(vctxt->reader);
        !          26983:     /*
        !          26984:     * Move to the document element.
        !          26985:     */
        !          26986:     while (ret == 1) {
        !          26987:        nodeType = xmlTextReaderNodeType(vctxt->reader);
        !          26988:        if (nodeType == XML_ELEMENT_NODE)
        !          26989:            goto root_found;
        !          26990:        ret = xmlTextReaderRead(vctxt->reader);
        !          26991:     }
        !          26992:     goto exit;
        !          26993: 
        !          26994: root_found:
        !          26995: 
        !          26996:     do {
        !          26997:        depth = xmlTextReaderDepth(vctxt->reader);
        !          26998:        nodeType = xmlTextReaderNodeType(vctxt->reader);
        !          26999: 
        !          27000:        if (nodeType == XML_ELEMENT_NODE) {
        !          27001: 
        !          27002:            vctxt->depth++;
        !          27003:            if (xmlSchemaValidatorPushElem(vctxt) == -1) {
        !          27004:                VERROR_INT("xmlSchemaVReaderWalk",
        !          27005:                    "calling xmlSchemaValidatorPushElem()");
        !          27006:                goto internal_error;
        !          27007:            }
        !          27008:            ielem = vctxt->inode;
        !          27009:            ielem->localName = xmlTextReaderLocalName(vctxt->reader);
        !          27010:            ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
        !          27011:            ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
        !          27012:            /*
        !          27013:            * Is the element empty?
        !          27014:            */
        !          27015:            ret = xmlTextReaderIsEmptyElement(vctxt->reader);
        !          27016:            if (ret == -1) {
        !          27017:                VERROR_INT("xmlSchemaVReaderWalk",
        !          27018:                    "calling xmlTextReaderIsEmptyElement()");
        !          27019:                goto internal_error;
        !          27020:            }
        !          27021:            if (ret) {
        !          27022:                ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27023:            }
        !          27024:            /*
        !          27025:            * Register attributes.
        !          27026:            */
        !          27027:            vctxt->nbAttrInfos = 0;
        !          27028:            ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
        !          27029:            if (ret == -1) {
        !          27030:                VERROR_INT("xmlSchemaVReaderWalk",
        !          27031:                    "calling xmlTextReaderMoveToFirstAttribute()");
        !          27032:                goto internal_error;
        !          27033:            }
        !          27034:            if (ret == 1) {
        !          27035:                do {
        !          27036:                    /*
        !          27037:                    * VAL TODO: How do we know that the reader works on a
        !          27038:                    * node tree, to be able to pass a node here?
        !          27039:                    */
        !          27040:                    if (xmlSchemaValidatorPushAttribute(vctxt, NULL,
        !          27041:                        (const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
        !          27042:                        xmlTextReaderNamespaceUri(vctxt->reader), 1,
        !          27043:                        xmlTextReaderValue(vctxt->reader), 1) == -1) {
        !          27044: 
        !          27045:                        VERROR_INT("xmlSchemaVReaderWalk",
        !          27046:                            "calling xmlSchemaValidatorPushAttribute()");
        !          27047:                        goto internal_error;
        !          27048:                    }
        !          27049:                    ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
        !          27050:                    if (ret == -1) {
        !          27051:                        VERROR_INT("xmlSchemaVReaderWalk",
        !          27052:                            "calling xmlTextReaderMoveToFirstAttribute()");
        !          27053:                        goto internal_error;
        !          27054:                    }
        !          27055:                } while (ret == 1);
        !          27056:                /*
        !          27057:                * Back to element position.
        !          27058:                */
        !          27059:                ret = xmlTextReaderMoveToElement(vctxt->reader);
        !          27060:                if (ret == -1) {
        !          27061:                    VERROR_INT("xmlSchemaVReaderWalk",
        !          27062:                        "calling xmlTextReaderMoveToElement()");
        !          27063:                    goto internal_error;
        !          27064:                }
        !          27065:            }
        !          27066:            /*
        !          27067:            * Validate the element.
        !          27068:            */
        !          27069:            ret= xmlSchemaValidateElem(vctxt);
        !          27070:            if (ret != 0) {
        !          27071:                if (ret == -1) {
        !          27072:                    VERROR_INT("xmlSchemaVReaderWalk",
        !          27073:                        "calling xmlSchemaValidateElem()");
        !          27074:                    goto internal_error;
        !          27075:                }
        !          27076:                goto exit;
        !          27077:            }
        !          27078:            if (vctxt->depth == vctxt->skipDepth) {
        !          27079:                int curDepth;
        !          27080:                /*
        !          27081:                * Skip all content.
        !          27082:                */
        !          27083:                if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
        !          27084:                    ret = xmlTextReaderRead(vctxt->reader);
        !          27085:                    curDepth = xmlTextReaderDepth(vctxt->reader);
        !          27086:                    while ((ret == 1) && (curDepth != depth)) {
        !          27087:                        ret = xmlTextReaderRead(vctxt->reader);
        !          27088:                        curDepth = xmlTextReaderDepth(vctxt->reader);
        !          27089:                    }
        !          27090:                    if (ret < 0) {
        !          27091:                        /*
        !          27092:                        * VAL TODO: A reader error occured; what to do here?
        !          27093:                        */
        !          27094:                        ret = 1;
        !          27095:                        goto exit;
        !          27096:                    }
        !          27097:                }
        !          27098:                goto leave_elem;
        !          27099:            }
        !          27100:            /*
        !          27101:            * READER VAL TODO: Is an END_ELEM really never called
        !          27102:            * if the elem is empty?
        !          27103:            */
        !          27104:            if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
        !          27105:                goto leave_elem;
        !          27106:        } else if (nodeType == END_ELEM) {
        !          27107:            /*
        !          27108:            * Process END of element.
        !          27109:            */
        !          27110: leave_elem:
        !          27111:            ret = xmlSchemaValidatorPopElem(vctxt);
        !          27112:            if (ret != 0) {
        !          27113:                if (ret < 0) {
        !          27114:                    VERROR_INT("xmlSchemaVReaderWalk",
        !          27115:                        "calling xmlSchemaValidatorPopElem()");
        !          27116:                    goto internal_error;
        !          27117:                }
        !          27118:                goto exit;
        !          27119:            }
        !          27120:            if (vctxt->depth >= 0)
        !          27121:                ielem = vctxt->inode;
        !          27122:            else
        !          27123:                ielem = NULL;
        !          27124:        } else if ((nodeType == XML_TEXT_NODE) ||
        !          27125:            (nodeType == XML_CDATA_SECTION_NODE) ||
        !          27126:            (nodeType == WHTSP) ||
        !          27127:            (nodeType == SIGN_WHTSP)) {
        !          27128:            /*
        !          27129:            * Process character content.
        !          27130:            */
        !          27131:            xmlChar *value;
        !          27132: 
        !          27133:            if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
        !          27134:                nodeType = XML_TEXT_NODE;
        !          27135: 
        !          27136:            value = xmlTextReaderValue(vctxt->reader);
        !          27137:            ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value,
        !          27138:                -1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed);
        !          27139:            if (! consumed)
        !          27140:                xmlFree(value);
        !          27141:            if (ret == -1) {
        !          27142:                VERROR_INT("xmlSchemaVReaderWalk",
        !          27143:                    "calling xmlSchemaVPushText()");
        !          27144:                goto internal_error;
        !          27145:            }
        !          27146:        } else if ((nodeType == XML_ENTITY_NODE) ||
        !          27147:            (nodeType == XML_ENTITY_REF_NODE)) {
        !          27148:            /*
        !          27149:            * VAL TODO: What to do with entities?
        !          27150:            */
        !          27151:            TODO
        !          27152:        }
        !          27153:        /*
        !          27154:        * Read next node.
        !          27155:        */
        !          27156:        ret = xmlTextReaderRead(vctxt->reader);
        !          27157:     } while (ret == 1);
        !          27158: 
        !          27159: exit:
        !          27160:     return (ret);
        !          27161: internal_error:
        !          27162:     return (-1);
        !          27163: }
        !          27164: #endif
        !          27165: 
        !          27166: /************************************************************************
        !          27167:  *                                                                     *
        !          27168:  *                     SAX validation handlers                         *
        !          27169:  *                                                                     *
        !          27170:  ************************************************************************/
        !          27171: 
        !          27172: /*
        !          27173: * Process text content.
        !          27174: */
        !          27175: static void
        !          27176: xmlSchemaSAXHandleText(void *ctx,
        !          27177:                       const xmlChar * ch,
        !          27178:                       int len)
        !          27179: {
        !          27180:     xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
        !          27181: 
        !          27182:     if (vctxt->depth < 0)
        !          27183:        return;
        !          27184:     if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
        !          27185:        return;
        !          27186:     if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
        !          27187:        vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27188:     if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len,
        !          27189:        XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
        !          27190:        VERROR_INT("xmlSchemaSAXHandleCDataSection",
        !          27191:            "calling xmlSchemaVPushText()");
        !          27192:        vctxt->err = -1;
        !          27193:        xmlStopParser(vctxt->parserCtxt);
        !          27194:     }
        !          27195: }
        !          27196: 
        !          27197: /*
        !          27198: * Process CDATA content.
        !          27199: */
        !          27200: static void
        !          27201: xmlSchemaSAXHandleCDataSection(void *ctx,
        !          27202:                             const xmlChar * ch,
        !          27203:                             int len)
        !          27204: {
        !          27205:     xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
        !          27206: 
        !          27207:     if (vctxt->depth < 0)
        !          27208:        return;
        !          27209:     if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
        !          27210:        return;
        !          27211:     if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
        !          27212:        vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27213:     if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len,
        !          27214:        XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
        !          27215:        VERROR_INT("xmlSchemaSAXHandleCDataSection",
        !          27216:            "calling xmlSchemaVPushText()");
        !          27217:        vctxt->err = -1;
        !          27218:        xmlStopParser(vctxt->parserCtxt);
        !          27219:     }
        !          27220: }
        !          27221: 
        !          27222: static void
        !          27223: xmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED,
        !          27224:                            const xmlChar * name ATTRIBUTE_UNUSED)
        !          27225: {
        !          27226:     xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
        !          27227: 
        !          27228:     if (vctxt->depth < 0)
        !          27229:        return;
        !          27230:     if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
        !          27231:        return;
        !          27232:     /* SAX VAL TODO: What to do here? */
        !          27233:     TODO
        !          27234: }
        !          27235: 
        !          27236: static void
        !          27237: xmlSchemaSAXHandleStartElementNs(void *ctx,
        !          27238:                                 const xmlChar * localname,
        !          27239:                                 const xmlChar * prefix ATTRIBUTE_UNUSED,
        !          27240:                                 const xmlChar * URI,
        !          27241:                                 int nb_namespaces,
        !          27242:                                 const xmlChar ** namespaces,
        !          27243:                                 int nb_attributes,
        !          27244:                                 int nb_defaulted ATTRIBUTE_UNUSED,
        !          27245:                                 const xmlChar ** attributes)
        !          27246: {
        !          27247:     xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
        !          27248:     int ret;
        !          27249:     xmlSchemaNodeInfoPtr ielem;
        !          27250:     int i, j;
        !          27251: 
        !          27252:     /*
        !          27253:     * SAX VAL TODO: What to do with nb_defaulted?
        !          27254:     */
        !          27255:     /*
        !          27256:     * Skip elements if inside a "skip" wildcard or invalid.
        !          27257:     */
        !          27258:     vctxt->depth++;
        !          27259:     if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
        !          27260:        return;
        !          27261:     /*
        !          27262:     * Push the element.
        !          27263:     */
        !          27264:     if (xmlSchemaValidatorPushElem(vctxt) == -1) {
        !          27265:        VERROR_INT("xmlSchemaSAXHandleStartElementNs",
        !          27266:            "calling xmlSchemaValidatorPushElem()");
        !          27267:        goto internal_error;
        !          27268:     }
        !          27269:     ielem = vctxt->inode;
        !          27270:     /*
        !          27271:     * TODO: Is this OK?
        !          27272:     */
        !          27273:     ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt);
        !          27274:     ielem->localName = localname;
        !          27275:     ielem->nsName = URI;
        !          27276:     ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27277:     /*
        !          27278:     * Register namespaces on the elem info.
        !          27279:     */
        !          27280:     if (nb_namespaces != 0) {
        !          27281:        /*
        !          27282:        * Although the parser builds its own namespace list,
        !          27283:        * we have no access to it, so we'll use an own one.
        !          27284:        */
        !          27285:         for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
        !          27286:            /*
        !          27287:            * Store prefix and namespace name.
        !          27288:            */
        !          27289:            if (ielem->nsBindings == NULL) {
        !          27290:                ielem->nsBindings =
        !          27291:                    (const xmlChar **) xmlMalloc(10 *
        !          27292:                        sizeof(const xmlChar *));
        !          27293:                if (ielem->nsBindings == NULL) {
        !          27294:                    xmlSchemaVErrMemory(vctxt,
        !          27295:                        "allocating namespace bindings for SAX validation",
        !          27296:                        NULL);
        !          27297:                    goto internal_error;
        !          27298:                }
        !          27299:                ielem->nbNsBindings = 0;
        !          27300:                ielem->sizeNsBindings = 5;
        !          27301:            } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
        !          27302:                ielem->sizeNsBindings *= 2;
        !          27303:                ielem->nsBindings =
        !          27304:                    (const xmlChar **) xmlRealloc(
        !          27305:                        (void *) ielem->nsBindings,
        !          27306:                        ielem->sizeNsBindings * 2 * sizeof(const xmlChar *));
        !          27307:                if (ielem->nsBindings == NULL) {
        !          27308:                    xmlSchemaVErrMemory(vctxt,
        !          27309:                        "re-allocating namespace bindings for SAX validation",
        !          27310:                        NULL);
        !          27311:                    goto internal_error;
        !          27312:                }
        !          27313:            }
        !          27314: 
        !          27315:            ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j];
        !          27316:            if (namespaces[j+1][0] == 0) {
        !          27317:                /*
        !          27318:                * Handle xmlns="".
        !          27319:                */
        !          27320:                ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL;
        !          27321:            } else
        !          27322:                ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
        !          27323:                    namespaces[j+1];
        !          27324:            ielem->nbNsBindings++;
        !          27325:        }
        !          27326:     }
        !          27327:     /*
        !          27328:     * Register attributes.
        !          27329:     * SAX VAL TODO: We are not adding namespace declaration
        !          27330:     * attributes yet.
        !          27331:     */
        !          27332:     if (nb_attributes != 0) {
        !          27333:        xmlChar *value;
        !          27334: 
        !          27335:         for (j = 0, i = 0; i < nb_attributes; i++, j += 5) {
        !          27336:            /*
        !          27337:            * Duplicate the value.
        !          27338:            */
        !          27339:            value = xmlStrndup(attributes[j+3],
        !          27340:                attributes[j+4] - attributes[j+3]);
        !          27341:            /*
        !          27342:            * TODO: Set the node line.
        !          27343:            */
        !          27344:            ret = xmlSchemaValidatorPushAttribute(vctxt,
        !          27345:                NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0,
        !          27346:                value, 1);
        !          27347:            if (ret == -1) {
        !          27348:                VERROR_INT("xmlSchemaSAXHandleStartElementNs",
        !          27349:                    "calling xmlSchemaValidatorPushAttribute()");
        !          27350:                goto internal_error;
        !          27351:            }
        !          27352:        }
        !          27353:     }
        !          27354:     /*
        !          27355:     * Validate the element.
        !          27356:     */
        !          27357:     ret = xmlSchemaValidateElem(vctxt);
        !          27358:     if (ret != 0) {
        !          27359:        if (ret == -1) {
        !          27360:            VERROR_INT("xmlSchemaSAXHandleStartElementNs",
        !          27361:                "calling xmlSchemaValidateElem()");
        !          27362:            goto internal_error;
        !          27363:        }
        !          27364:        goto exit;
        !          27365:     }
        !          27366: 
        !          27367: exit:
        !          27368:     return;
        !          27369: internal_error:
        !          27370:     vctxt->err = -1;
        !          27371:     xmlStopParser(vctxt->parserCtxt);
        !          27372:     return;
        !          27373: }
        !          27374: 
        !          27375: static void
        !          27376: xmlSchemaSAXHandleEndElementNs(void *ctx,
        !          27377:                               const xmlChar * localname ATTRIBUTE_UNUSED,
        !          27378:                               const xmlChar * prefix ATTRIBUTE_UNUSED,
        !          27379:                               const xmlChar * URI ATTRIBUTE_UNUSED)
        !          27380: {
        !          27381:     xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
        !          27382:     int res;
        !          27383: 
        !          27384:     /*
        !          27385:     * Skip elements if inside a "skip" wildcard or if invalid.
        !          27386:     */
        !          27387:     if (vctxt->skipDepth != -1) {
        !          27388:        if (vctxt->depth > vctxt->skipDepth) {
        !          27389:            vctxt->depth--;
        !          27390:            return;
        !          27391:        } else
        !          27392:            vctxt->skipDepth = -1;
        !          27393:     }
        !          27394:     /*
        !          27395:     * SAX VAL TODO: Just a temporary check.
        !          27396:     */
        !          27397:     if ((!xmlStrEqual(vctxt->inode->localName, localname)) ||
        !          27398:        (!xmlStrEqual(vctxt->inode->nsName, URI))) {
        !          27399:        VERROR_INT("xmlSchemaSAXHandleEndElementNs",
        !          27400:            "elem pop mismatch");
        !          27401:     }
        !          27402:     res = xmlSchemaValidatorPopElem(vctxt);
        !          27403:     if (res != 0) {
        !          27404:        if (res < 0) {
        !          27405:            VERROR_INT("xmlSchemaSAXHandleEndElementNs",
        !          27406:                "calling xmlSchemaValidatorPopElem()");
        !          27407:            goto internal_error;
        !          27408:        }
        !          27409:        goto exit;
        !          27410:     }
        !          27411: exit:
        !          27412:     return;
        !          27413: internal_error:
        !          27414:     vctxt->err = -1;
        !          27415:     xmlStopParser(vctxt->parserCtxt);
        !          27416:     return;
        !          27417: }
        !          27418: 
        !          27419: /************************************************************************
        !          27420:  *                                                                     *
        !          27421:  *                     Validation interfaces                           *
        !          27422:  *                                                                     *
        !          27423:  ************************************************************************/
        !          27424: 
        !          27425: /**
        !          27426:  * xmlSchemaNewValidCtxt:
        !          27427:  * @schema:  a precompiled XML Schemas
        !          27428:  *
        !          27429:  * Create an XML Schemas validation context based on the given schema.
        !          27430:  *
        !          27431:  * Returns the validation context or NULL in case of error
        !          27432:  */
        !          27433: xmlSchemaValidCtxtPtr
        !          27434: xmlSchemaNewValidCtxt(xmlSchemaPtr schema)
        !          27435: {
        !          27436:     xmlSchemaValidCtxtPtr ret;
        !          27437: 
        !          27438:     ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt));
        !          27439:     if (ret == NULL) {
        !          27440:         xmlSchemaVErrMemory(NULL, "allocating validation context", NULL);
        !          27441:         return (NULL);
        !          27442:     }
        !          27443:     memset(ret, 0, sizeof(xmlSchemaValidCtxt));
        !          27444:     ret->type = XML_SCHEMA_CTXT_VALIDATOR;
        !          27445:     ret->dict = xmlDictCreate();
        !          27446:     ret->nodeQNames = xmlSchemaItemListCreate();
        !          27447:     ret->schema = schema;
        !          27448:     return (ret);
        !          27449: }
        !          27450: 
        !          27451: /**
        !          27452:  * xmlSchemaClearValidCtxt:
        !          27453:  * @ctxt: the schema validation context
        !          27454:  *
        !          27455:  * Free the resources associated to the schema validation context;
        !          27456:  * leaves some fields alive intended for reuse of the context.
        !          27457:  */
        !          27458: static void
        !          27459: xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
        !          27460: {
        !          27461:     if (vctxt == NULL)
        !          27462:         return;
        !          27463: 
        !          27464:     /*
        !          27465:     * TODO: Should we clear the flags?
        !          27466:     *   Might be problematic if one reuses the context
        !          27467:     *   and assumes that the options remain the same.
        !          27468:     */
        !          27469:     vctxt->flags = 0;
        !          27470:     vctxt->validationRoot = NULL;
        !          27471:     vctxt->doc = NULL;
        !          27472: #ifdef LIBXML_READER_ENABLED
        !          27473:     vctxt->reader = NULL;
        !          27474: #endif
        !          27475:     vctxt->hasKeyrefs = 0;
        !          27476: 
        !          27477:     if (vctxt->value != NULL) {
        !          27478:         xmlSchemaFreeValue(vctxt->value);
        !          27479:        vctxt->value = NULL;
        !          27480:     }
        !          27481:     /*
        !          27482:     * Augmented IDC information.
        !          27483:     */
        !          27484:     if (vctxt->aidcs != NULL) {
        !          27485:        xmlSchemaIDCAugPtr cur = vctxt->aidcs, next;
        !          27486:        do {
        !          27487:            next = cur->next;
        !          27488:            xmlFree(cur);
        !          27489:            cur = next;
        !          27490:        } while (cur != NULL);
        !          27491:        vctxt->aidcs = NULL;
        !          27492:     }
        !          27493:     if (vctxt->idcMatcherCache != NULL) {
        !          27494:        xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
        !          27495: 
        !          27496:        while (matcher) {
        !          27497:            tmp = matcher;
        !          27498:            matcher = matcher->nextCached;
        !          27499:            xmlSchemaIDCFreeMatcherList(tmp);
        !          27500:        }
        !          27501:        vctxt->idcMatcherCache = NULL;
        !          27502:     }
        !          27503: 
        !          27504: 
        !          27505:     if (vctxt->idcNodes != NULL) {
        !          27506:        int i;
        !          27507:        xmlSchemaPSVIIDCNodePtr item;
        !          27508: 
        !          27509:        for (i = 0; i < vctxt->nbIdcNodes; i++) {
        !          27510:            item = vctxt->idcNodes[i];
        !          27511:            xmlFree(item->keys);
        !          27512:            xmlFree(item);
        !          27513:        }
        !          27514:        xmlFree(vctxt->idcNodes);
        !          27515:        vctxt->idcNodes = NULL;
        !          27516:        vctxt->nbIdcNodes = 0;
        !          27517:        vctxt->sizeIdcNodes = 0;
        !          27518:     }
        !          27519:     /*
        !          27520:     * Note that we won't delete the XPath state pool here.
        !          27521:     */
        !          27522:     if (vctxt->xpathStates != NULL) {
        !          27523:        xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
        !          27524:        vctxt->xpathStates = NULL;
        !          27525:     }
        !          27526:     /*
        !          27527:     * Attribute info.
        !          27528:     */
        !          27529:     if (vctxt->nbAttrInfos != 0) {
        !          27530:        xmlSchemaClearAttrInfos(vctxt);
        !          27531:     }
        !          27532:     /*
        !          27533:     * Element info.
        !          27534:     */
        !          27535:     if (vctxt->elemInfos != NULL) {
        !          27536:        int i;
        !          27537:        xmlSchemaNodeInfoPtr ei;
        !          27538: 
        !          27539:        for (i = 0; i < vctxt->sizeElemInfos; i++) {
        !          27540:            ei = vctxt->elemInfos[i];
        !          27541:            if (ei == NULL)
        !          27542:                break;
        !          27543:            xmlSchemaClearElemInfo(vctxt, ei);
        !          27544:        }
        !          27545:     }
        !          27546:     xmlSchemaItemListClear(vctxt->nodeQNames);
        !          27547:     /* Recreate the dict. */
        !          27548:     xmlDictFree(vctxt->dict);
        !          27549:     /*
        !          27550:     * TODO: Is is save to recreate it? Do we have a scenario
        !          27551:     * where the user provides the dict?
        !          27552:     */
        !          27553:     vctxt->dict = xmlDictCreate();
        !          27554: }
        !          27555: 
        !          27556: /**
        !          27557:  * xmlSchemaFreeValidCtxt:
        !          27558:  * @ctxt:  the schema validation context
        !          27559:  *
        !          27560:  * Free the resources associated to the schema validation context
        !          27561:  */
        !          27562: void
        !          27563: xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
        !          27564: {
        !          27565:     if (ctxt == NULL)
        !          27566:         return;
        !          27567:     if (ctxt->value != NULL)
        !          27568:         xmlSchemaFreeValue(ctxt->value);
        !          27569:     if (ctxt->pctxt != NULL)
        !          27570:        xmlSchemaFreeParserCtxt(ctxt->pctxt);
        !          27571:     if (ctxt->idcNodes != NULL) {
        !          27572:        int i;
        !          27573:        xmlSchemaPSVIIDCNodePtr item;
        !          27574: 
        !          27575:        for (i = 0; i < ctxt->nbIdcNodes; i++) {
        !          27576:            item = ctxt->idcNodes[i];
        !          27577:            xmlFree(item->keys);
        !          27578:            xmlFree(item);
        !          27579:        }
        !          27580:        xmlFree(ctxt->idcNodes);
        !          27581:     }
        !          27582:     if (ctxt->idcKeys != NULL) {
        !          27583:        int i;
        !          27584:        for (i = 0; i < ctxt->nbIdcKeys; i++)
        !          27585:            xmlSchemaIDCFreeKey(ctxt->idcKeys[i]);
        !          27586:        xmlFree(ctxt->idcKeys);
        !          27587:     }
        !          27588: 
        !          27589:     if (ctxt->xpathStates != NULL) {
        !          27590:        xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
        !          27591:        ctxt->xpathStates = NULL;
        !          27592:     }
        !          27593:     if (ctxt->xpathStatePool != NULL) {
        !          27594:        xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
        !          27595:        ctxt->xpathStatePool = NULL;
        !          27596:     }
        !          27597: 
        !          27598:     /*
        !          27599:     * Augmented IDC information.
        !          27600:     */
        !          27601:     if (ctxt->aidcs != NULL) {
        !          27602:        xmlSchemaIDCAugPtr cur = ctxt->aidcs, next;
        !          27603:        do {
        !          27604:            next = cur->next;
        !          27605:            xmlFree(cur);
        !          27606:            cur = next;
        !          27607:        } while (cur != NULL);
        !          27608:     }
        !          27609:     if (ctxt->attrInfos != NULL) {
        !          27610:        int i;
        !          27611:        xmlSchemaAttrInfoPtr attr;
        !          27612: 
        !          27613:        /* Just a paranoid call to the cleanup. */
        !          27614:        if (ctxt->nbAttrInfos != 0)
        !          27615:            xmlSchemaClearAttrInfos(ctxt);
        !          27616:        for (i = 0; i < ctxt->sizeAttrInfos; i++) {
        !          27617:            attr = ctxt->attrInfos[i];
        !          27618:            xmlFree(attr);
        !          27619:        }
        !          27620:        xmlFree(ctxt->attrInfos);
        !          27621:     }
        !          27622:     if (ctxt->elemInfos != NULL) {
        !          27623:        int i;
        !          27624:        xmlSchemaNodeInfoPtr ei;
        !          27625: 
        !          27626:        for (i = 0; i < ctxt->sizeElemInfos; i++) {
        !          27627:            ei = ctxt->elemInfos[i];
        !          27628:            if (ei == NULL)
        !          27629:                break;
        !          27630:            xmlSchemaClearElemInfo(ctxt, ei);
        !          27631:            xmlFree(ei);
        !          27632:        }
        !          27633:        xmlFree(ctxt->elemInfos);
        !          27634:     }
        !          27635:     if (ctxt->nodeQNames != NULL)
        !          27636:        xmlSchemaItemListFree(ctxt->nodeQNames);
        !          27637:     if (ctxt->dict != NULL)
        !          27638:        xmlDictFree(ctxt->dict);
        !          27639:     xmlFree(ctxt);
        !          27640: }
        !          27641: 
        !          27642: /**
        !          27643:  * xmlSchemaIsValid:
        !          27644:  * @ctxt: the schema validation context
        !          27645:  *
        !          27646:  * Check if any error was detected during validation.
        !          27647:  *
        !          27648:  * Returns 1 if valid so far, 0 if errors were detected, and -1 in case
        !          27649:  *         of internal error.
        !          27650:  */
        !          27651: int
        !          27652: xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
        !          27653: {
        !          27654:     if (ctxt == NULL)
        !          27655:         return(-1);
        !          27656:     return(ctxt->err == 0);
        !          27657: }
        !          27658: 
        !          27659: /**
        !          27660:  * xmlSchemaSetValidErrors:
        !          27661:  * @ctxt:  a schema validation context
        !          27662:  * @err:  the error function
        !          27663:  * @warn: the warning function
        !          27664:  * @ctx: the functions context
        !          27665:  *
        !          27666:  * Set the error and warning callback informations
        !          27667:  */
        !          27668: void
        !          27669: xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
        !          27670:                         xmlSchemaValidityErrorFunc err,
        !          27671:                         xmlSchemaValidityWarningFunc warn, void *ctx)
        !          27672: {
        !          27673:     if (ctxt == NULL)
        !          27674:         return;
        !          27675:     ctxt->error = err;
        !          27676:     ctxt->warning = warn;
        !          27677:     ctxt->errCtxt = ctx;
        !          27678:     if (ctxt->pctxt != NULL)
        !          27679:        xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx);
        !          27680: }
        !          27681: 
        !          27682: /**
        !          27683:  * xmlSchemaSetValidStructuredErrors:
        !          27684:  * @ctxt:  a schema validation context
        !          27685:  * @serror:  the structured error function
        !          27686:  * @ctx: the functions context
        !          27687:  *
        !          27688:  * Set the structured error callback
        !          27689:  */
        !          27690: void
        !          27691: xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
        !          27692:                                  xmlStructuredErrorFunc serror, void *ctx)
        !          27693: {
        !          27694:     if (ctxt == NULL)
        !          27695:         return;
        !          27696:        ctxt->serror = serror;
        !          27697:     ctxt->error = NULL;
        !          27698:     ctxt->warning = NULL;
        !          27699:     ctxt->errCtxt = ctx;
        !          27700:     if (ctxt->pctxt != NULL)
        !          27701:        xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx);
        !          27702: }
        !          27703: 
        !          27704: /**
        !          27705:  * xmlSchemaGetValidErrors:
        !          27706:  * @ctxt: a XML-Schema validation context
        !          27707:  * @err: the error function result
        !          27708:  * @warn: the warning function result
        !          27709:  * @ctx: the functions context result
        !          27710:  *
        !          27711:  * Get the error and warning callback informations
        !          27712:  *
        !          27713:  * Returns -1 in case of error and 0 otherwise
        !          27714:  */
        !          27715: int
        !          27716: xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
        !          27717:                        xmlSchemaValidityErrorFunc * err,
        !          27718:                        xmlSchemaValidityWarningFunc * warn, void **ctx)
        !          27719: {
        !          27720:        if (ctxt == NULL)
        !          27721:                return (-1);
        !          27722:        if (err != NULL)
        !          27723:                *err = ctxt->error;
        !          27724:        if (warn != NULL)
        !          27725:                *warn = ctxt->warning;
        !          27726:        if (ctx != NULL)
        !          27727:                *ctx = ctxt->errCtxt;
        !          27728:        return (0);
        !          27729: }
        !          27730: 
        !          27731: 
        !          27732: /**
        !          27733:  * xmlSchemaSetValidOptions:
        !          27734:  * @ctxt:      a schema validation context
        !          27735:  * @options: a combination of xmlSchemaValidOption
        !          27736:  *
        !          27737:  * Sets the options to be used during the validation.
        !          27738:  *
        !          27739:  * Returns 0 in case of success, -1 in case of an
        !          27740:  * API error.
        !          27741:  */
        !          27742: int
        !          27743: xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
        !          27744:                         int options)
        !          27745: 
        !          27746: {
        !          27747:     int i;
        !          27748: 
        !          27749:     if (ctxt == NULL)
        !          27750:        return (-1);
        !          27751:     /*
        !          27752:     * WARNING: Change the start value if adding to the
        !          27753:     * xmlSchemaValidOption.
        !          27754:     * TODO: Is there an other, more easy to maintain,
        !          27755:     * way?
        !          27756:     */
        !          27757:     for (i = 1; i < (int) sizeof(int) * 8; i++) {
        !          27758:         if (options & 1<<i)
        !          27759:            return (-1);
        !          27760:     }
        !          27761:     ctxt->options = options;
        !          27762:     return (0);
        !          27763: }
        !          27764: 
        !          27765: /**
        !          27766:  * xmlSchemaValidCtxtGetOptions:
        !          27767:  * @ctxt: a schema validation context
        !          27768:  *
        !          27769:  * Get the validation context options.
        !          27770:  *
        !          27771:  * Returns the option combination or -1 on error.
        !          27772:  */
        !          27773: int
        !          27774: xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
        !          27775: 
        !          27776: {
        !          27777:     if (ctxt == NULL)
        !          27778:        return (-1);
        !          27779:     else
        !          27780:        return (ctxt->options);
        !          27781: }
        !          27782: 
        !          27783: static int
        !          27784: xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
        !          27785: {
        !          27786:     xmlAttrPtr attr;
        !          27787:     int ret = 0;
        !          27788:     xmlSchemaNodeInfoPtr ielem = NULL;
        !          27789:     xmlNodePtr node, valRoot;
        !          27790:     const xmlChar *nsName;
        !          27791: 
        !          27792:     /* DOC VAL TODO: Move this to the start function. */
        !          27793:     valRoot = xmlDocGetRootElement(vctxt->doc);
        !          27794:     if (valRoot == NULL) {
        !          27795:        /* VAL TODO: Error code? */
        !          27796:        VERROR(1, NULL, "The document has no document element");
        !          27797:        return (1);
        !          27798:     }
        !          27799:     vctxt->depth = -1;
        !          27800:     vctxt->validationRoot = valRoot;
        !          27801:     node = valRoot;
        !          27802:     while (node != NULL) {
        !          27803:        if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
        !          27804:            goto next_sibling;
        !          27805:        if (node->type == XML_ELEMENT_NODE) {
        !          27806: 
        !          27807:            /*
        !          27808:            * Init the node-info.
        !          27809:            */
        !          27810:            vctxt->depth++;
        !          27811:            if (xmlSchemaValidatorPushElem(vctxt) == -1)
        !          27812:                goto internal_error;
        !          27813:            ielem = vctxt->inode;
        !          27814:            ielem->node = node;
        !          27815:            ielem->nodeLine = node->line;
        !          27816:            ielem->localName = node->name;
        !          27817:            if (node->ns != NULL)
        !          27818:                ielem->nsName = node->ns->href;
        !          27819:            ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27820:            /*
        !          27821:            * Register attributes.
        !          27822:            * DOC VAL TODO: We do not register namespace declaration
        !          27823:            * attributes yet.
        !          27824:            */
        !          27825:            vctxt->nbAttrInfos = 0;
        !          27826:            if (node->properties != NULL) {
        !          27827:                attr = node->properties;
        !          27828:                do {
        !          27829:                    if (attr->ns != NULL)
        !          27830:                        nsName = attr->ns->href;
        !          27831:                    else
        !          27832:                        nsName = NULL;
        !          27833:                    ret = xmlSchemaValidatorPushAttribute(vctxt,
        !          27834:                        (xmlNodePtr) attr,
        !          27835:                        /*
        !          27836:                        * Note that we give it the line number of the
        !          27837:                        * parent element.
        !          27838:                        */
        !          27839:                        ielem->nodeLine,
        !          27840:                        attr->name, nsName, 0,
        !          27841:                        xmlNodeListGetString(attr->doc, attr->children, 1), 1);
        !          27842:                    if (ret == -1) {
        !          27843:                        VERROR_INT("xmlSchemaDocWalk",
        !          27844:                            "calling xmlSchemaValidatorPushAttribute()");
        !          27845:                        goto internal_error;
        !          27846:                    }
        !          27847:                    attr = attr->next;
        !          27848:                } while (attr);
        !          27849:            }
        !          27850:            /*
        !          27851:            * Validate the element.
        !          27852:            */
        !          27853:            ret = xmlSchemaValidateElem(vctxt);
        !          27854:            if (ret != 0) {
        !          27855:                if (ret == -1) {
        !          27856:                    VERROR_INT("xmlSchemaDocWalk",
        !          27857:                        "calling xmlSchemaValidateElem()");
        !          27858:                    goto internal_error;
        !          27859:                }
        !          27860:                /*
        !          27861:                * Don't stop validation; just skip the content
        !          27862:                * of this element.
        !          27863:                */
        !          27864:                goto leave_node;
        !          27865:            }
        !          27866:            if ((vctxt->skipDepth != -1) &&
        !          27867:                (vctxt->depth >= vctxt->skipDepth))
        !          27868:                goto leave_node;
        !          27869:        } else if ((node->type == XML_TEXT_NODE) ||
        !          27870:            (node->type == XML_CDATA_SECTION_NODE)) {
        !          27871:            /*
        !          27872:            * Process character content.
        !          27873:            */
        !          27874:            if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
        !          27875:                ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
        !          27876:            ret = xmlSchemaVPushText(vctxt, node->type, node->content,
        !          27877:                -1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL);
        !          27878:            if (ret < 0) {
        !          27879:                VERROR_INT("xmlSchemaVDocWalk",
        !          27880:                    "calling xmlSchemaVPushText()");
        !          27881:                goto internal_error;
        !          27882:            }
        !          27883:            /*
        !          27884:            * DOC VAL TODO: Should we skip further validation of the
        !          27885:            * element content here?
        !          27886:            */
        !          27887:        } else if ((node->type == XML_ENTITY_NODE) ||
        !          27888:            (node->type == XML_ENTITY_REF_NODE)) {
        !          27889:            /*
        !          27890:            * DOC VAL TODO: What to do with entities?
        !          27891:            */
        !          27892:            VERROR_INT("xmlSchemaVDocWalk",
        !          27893:                "there is at least one entity reference in the node-tree "
        !          27894:                "currently being validated. Processing of entities with "
        !          27895:                "this XML Schema processor is not supported (yet). Please "
        !          27896:                "substitute entities before validation.");
        !          27897:            goto internal_error;
        !          27898:        } else {
        !          27899:            goto leave_node;
        !          27900:            /*
        !          27901:            * DOC VAL TODO: XInclude nodes, etc.
        !          27902:            */
        !          27903:        }
        !          27904:        /*
        !          27905:        * Walk the doc.
        !          27906:        */
        !          27907:        if (node->children != NULL) {
        !          27908:            node = node->children;
        !          27909:            continue;
        !          27910:        }
        !          27911: leave_node:
        !          27912:        if (node->type == XML_ELEMENT_NODE) {
        !          27913:            /*
        !          27914:            * Leaving the scope of an element.
        !          27915:            */
        !          27916:            if (node != vctxt->inode->node) {
        !          27917:                VERROR_INT("xmlSchemaVDocWalk",
        !          27918:                    "element position mismatch");
        !          27919:                goto internal_error;
        !          27920:            }
        !          27921:            ret = xmlSchemaValidatorPopElem(vctxt);
        !          27922:            if (ret != 0) {
        !          27923:                if (ret < 0) {
        !          27924:                    VERROR_INT("xmlSchemaVDocWalk",
        !          27925:                        "calling xmlSchemaValidatorPopElem()");
        !          27926:                    goto internal_error;
        !          27927:                }
        !          27928:            }
        !          27929:            if (node == valRoot)
        !          27930:                goto exit;
        !          27931:        }
        !          27932: next_sibling:
        !          27933:        if (node->next != NULL)
        !          27934:            node = node->next;
        !          27935:        else {
        !          27936:            node = node->parent;
        !          27937:            goto leave_node;
        !          27938:        }
        !          27939:     }
        !          27940: 
        !          27941: exit:
        !          27942:     return (ret);
        !          27943: internal_error:
        !          27944:     return (-1);
        !          27945: }
        !          27946: 
        !          27947: static int
        !          27948: xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
        !          27949:     /*
        !          27950:     * Some initialization.
        !          27951:     */
        !          27952:     vctxt->err = 0;
        !          27953:     vctxt->nberrors = 0;
        !          27954:     vctxt->depth = -1;
        !          27955:     vctxt->skipDepth = -1;
        !          27956:     vctxt->xsiAssemble = 0;
        !          27957:     vctxt->hasKeyrefs = 0;
        !          27958: #ifdef ENABLE_IDC_NODE_TABLES_TEST
        !          27959:     vctxt->createIDCNodeTables = 1;
        !          27960: #else
        !          27961:     vctxt->createIDCNodeTables = 0;
        !          27962: #endif
        !          27963:     /*
        !          27964:     * Create a schema + parser if necessary.
        !          27965:     */
        !          27966:     if (vctxt->schema == NULL) {
        !          27967:        xmlSchemaParserCtxtPtr pctxt;
        !          27968: 
        !          27969:        vctxt->xsiAssemble = 1;
        !          27970:        /*
        !          27971:        * If not schema was given then we will create a schema
        !          27972:        * dynamically using XSI schema locations.
        !          27973:        *
        !          27974:        * Create the schema parser context.
        !          27975:        */
        !          27976:        if ((vctxt->pctxt == NULL) &&
        !          27977:           (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
        !          27978:           return (-1);
        !          27979:        pctxt = vctxt->pctxt;
        !          27980:        pctxt->xsiAssemble = 1;
        !          27981:        /*
        !          27982:        * Create the schema.
        !          27983:        */
        !          27984:        vctxt->schema = xmlSchemaNewSchema(pctxt);
        !          27985:        if (vctxt->schema == NULL)
        !          27986:            return (-1);
        !          27987:        /*
        !          27988:        * Create the schema construction context.
        !          27989:        */
        !          27990:        pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
        !          27991:        if (pctxt->constructor == NULL)
        !          27992:            return(-1);
        !          27993:        pctxt->constructor->mainSchema = vctxt->schema;
        !          27994:        /*
        !          27995:        * Take ownership of the constructor to be able to free it.
        !          27996:        */
        !          27997:        pctxt->ownsConstructor = 1;
        !          27998:     }
        !          27999:     /*
        !          28000:     * Augment the IDC definitions for the main schema and all imported ones
        !          28001:     * NOTE: main schema if the first in the imported list
        !          28002:     */
        !          28003:     xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
        !          28004: 
        !          28005:     return(0);
        !          28006: }
        !          28007: 
        !          28008: static void
        !          28009: xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
        !          28010:     if (vctxt->xsiAssemble) {
        !          28011:        if (vctxt->schema != NULL) {
        !          28012:            xmlSchemaFree(vctxt->schema);
        !          28013:            vctxt->schema = NULL;
        !          28014:        }
        !          28015:     }
        !          28016:     xmlSchemaClearValidCtxt(vctxt);
        !          28017: }
        !          28018: 
        !          28019: static int
        !          28020: xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
        !          28021: {
        !          28022:     int ret = 0;
        !          28023: 
        !          28024:     if (xmlSchemaPreRun(vctxt) < 0)
        !          28025:         return(-1);
        !          28026: 
        !          28027:     if (vctxt->doc != NULL) {
        !          28028:        /*
        !          28029:         * Tree validation.
        !          28030:         */
        !          28031:        ret = xmlSchemaVDocWalk(vctxt);
        !          28032: #ifdef LIBXML_READER_ENABLED
        !          28033:     } else if (vctxt->reader != NULL) {
        !          28034:        /*
        !          28035:         * XML Reader validation.
        !          28036:         */
        !          28037: #ifdef XML_SCHEMA_READER_ENABLED
        !          28038:        ret = xmlSchemaVReaderWalk(vctxt);
        !          28039: #endif
        !          28040: #endif
        !          28041:     } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) {
        !          28042:        /*
        !          28043:         * SAX validation.
        !          28044:         */
        !          28045:        ret = xmlParseDocument(vctxt->parserCtxt);
        !          28046:     } else {
        !          28047:        VERROR_INT("xmlSchemaVStart",
        !          28048:            "no instance to validate");
        !          28049:        ret = -1;
        !          28050:     }
        !          28051: 
        !          28052:     xmlSchemaPostRun(vctxt);
        !          28053:     if (ret == 0)
        !          28054:        ret = vctxt->err;
        !          28055:     return (ret);
        !          28056: }
        !          28057: 
        !          28058: /**
        !          28059:  * xmlSchemaValidateOneElement:
        !          28060:  * @ctxt:  a schema validation context
        !          28061:  * @elem:  an element node
        !          28062:  *
        !          28063:  * Validate a branch of a tree, starting with the given @elem.
        !          28064:  *
        !          28065:  * Returns 0 if the element and its subtree is valid, a positive error
        !          28066:  * code number otherwise and -1 in case of an internal or API error.
        !          28067:  */
        !          28068: int
        !          28069: xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem)
        !          28070: {
        !          28071:     if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE))
        !          28072:        return (-1);
        !          28073: 
        !          28074:     if (ctxt->schema == NULL)
        !          28075:        return (-1);
        !          28076: 
        !          28077:     ctxt->doc = elem->doc;
        !          28078:     ctxt->node = elem;
        !          28079:     ctxt->validationRoot = elem;
        !          28080:     return(xmlSchemaVStart(ctxt));
        !          28081: }
        !          28082: 
        !          28083: /**
        !          28084:  * xmlSchemaValidateDoc:
        !          28085:  * @ctxt:  a schema validation context
        !          28086:  * @doc:  a parsed document tree
        !          28087:  *
        !          28088:  * Validate a document tree in memory.
        !          28089:  *
        !          28090:  * Returns 0 if the document is schemas valid, a positive error code
        !          28091:  *     number otherwise and -1 in case of internal or API error.
        !          28092:  */
        !          28093: int
        !          28094: xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
        !          28095: {
        !          28096:     if ((ctxt == NULL) || (doc == NULL))
        !          28097:         return (-1);
        !          28098: 
        !          28099:     ctxt->doc = doc;
        !          28100:     ctxt->node = xmlDocGetRootElement(doc);
        !          28101:     if (ctxt->node == NULL) {
        !          28102:         xmlSchemaCustomErr(ACTXT_CAST ctxt,
        !          28103:            XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING,
        !          28104:            (xmlNodePtr) doc, NULL,
        !          28105:            "The document has no document element", NULL, NULL);
        !          28106:         return (ctxt->err);
        !          28107:     }
        !          28108:     ctxt->validationRoot = ctxt->node;
        !          28109:     return (xmlSchemaVStart(ctxt));
        !          28110: }
        !          28111: 
        !          28112: 
        !          28113: /************************************************************************
        !          28114:  *                                                                     *
        !          28115:  *             Function and data for SAX streaming API                 *
        !          28116:  *                                                                     *
        !          28117:  ************************************************************************/
        !          28118: typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
        !          28119: typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
        !          28120: 
        !          28121: struct _xmlSchemaSplitSAXData {
        !          28122:     xmlSAXHandlerPtr      user_sax;
        !          28123:     void                 *user_data;
        !          28124:     xmlSchemaValidCtxtPtr ctxt;
        !          28125:     xmlSAXHandlerPtr      schemas_sax;
        !          28126: };
        !          28127: 
        !          28128: #define XML_SAX_PLUG_MAGIC 0xdc43ba21
        !          28129: 
        !          28130: struct _xmlSchemaSAXPlug {
        !          28131:     unsigned int magic;
        !          28132: 
        !          28133:     /* the original callbacks informations */
        !          28134:     xmlSAXHandlerPtr     *user_sax_ptr;
        !          28135:     xmlSAXHandlerPtr      user_sax;
        !          28136:     void                **user_data_ptr;
        !          28137:     void                 *user_data;
        !          28138: 
        !          28139:     /* the block plugged back and validation informations */
        !          28140:     xmlSAXHandler         schemas_sax;
        !          28141:     xmlSchemaValidCtxtPtr ctxt;
        !          28142: };
        !          28143: 
        !          28144: /* All those functions just bounces to the user provided SAX handlers */
        !          28145: static void
        !          28146: internalSubsetSplit(void *ctx, const xmlChar *name,
        !          28147:               const xmlChar *ExternalID, const xmlChar *SystemID)
        !          28148: {
        !          28149:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28150:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28151:         (ctxt->user_sax->internalSubset != NULL))
        !          28152:        ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID,
        !          28153:                                       SystemID);
        !          28154: }
        !          28155: 
        !          28156: static int
        !          28157: isStandaloneSplit(void *ctx)
        !          28158: {
        !          28159:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28160:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28161:         (ctxt->user_sax->isStandalone != NULL))
        !          28162:        return(ctxt->user_sax->isStandalone(ctxt->user_data));
        !          28163:     return(0);
        !          28164: }
        !          28165: 
        !          28166: static int
        !          28167: hasInternalSubsetSplit(void *ctx)
        !          28168: {
        !          28169:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28170:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28171:         (ctxt->user_sax->hasInternalSubset != NULL))
        !          28172:        return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
        !          28173:     return(0);
        !          28174: }
        !          28175: 
        !          28176: static int
        !          28177: hasExternalSubsetSplit(void *ctx)
        !          28178: {
        !          28179:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28180:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28181:         (ctxt->user_sax->hasExternalSubset != NULL))
        !          28182:        return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
        !          28183:     return(0);
        !          28184: }
        !          28185: 
        !          28186: static void
        !          28187: externalSubsetSplit(void *ctx, const xmlChar *name,
        !          28188:               const xmlChar *ExternalID, const xmlChar *SystemID)
        !          28189: {
        !          28190:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28191:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28192:         (ctxt->user_sax->externalSubset != NULL))
        !          28193:        ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID,
        !          28194:                                       SystemID);
        !          28195: }
        !          28196: 
        !          28197: static xmlParserInputPtr
        !          28198: resolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
        !          28199: {
        !          28200:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28201:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28202:         (ctxt->user_sax->resolveEntity != NULL))
        !          28203:        return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
        !          28204:                                             systemId));
        !          28205:     return(NULL);
        !          28206: }
        !          28207: 
        !          28208: static xmlEntityPtr
        !          28209: getEntitySplit(void *ctx, const xmlChar *name)
        !          28210: {
        !          28211:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28212:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28213:         (ctxt->user_sax->getEntity != NULL))
        !          28214:        return(ctxt->user_sax->getEntity(ctxt->user_data, name));
        !          28215:     return(NULL);
        !          28216: }
        !          28217: 
        !          28218: static xmlEntityPtr
        !          28219: getParameterEntitySplit(void *ctx, const xmlChar *name)
        !          28220: {
        !          28221:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28222:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28223:         (ctxt->user_sax->getParameterEntity != NULL))
        !          28224:        return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name));
        !          28225:     return(NULL);
        !          28226: }
        !          28227: 
        !          28228: 
        !          28229: static void
        !          28230: entityDeclSplit(void *ctx, const xmlChar *name, int type,
        !          28231:           const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
        !          28232: {
        !          28233:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28234:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28235:         (ctxt->user_sax->entityDecl != NULL))
        !          28236:        ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId,
        !          28237:                                   systemId, content);
        !          28238: }
        !          28239: 
        !          28240: static void
        !          28241: attributeDeclSplit(void *ctx, const xmlChar * elem,
        !          28242:                    const xmlChar * name, int type, int def,
        !          28243:                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
        !          28244: {
        !          28245:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28246:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28247:         (ctxt->user_sax->attributeDecl != NULL)) {
        !          28248:        ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type,
        !          28249:                                      def, defaultValue, tree);
        !          28250:     } else {
        !          28251:        xmlFreeEnumeration(tree);
        !          28252:     }
        !          28253: }
        !          28254: 
        !          28255: static void
        !          28256: elementDeclSplit(void *ctx, const xmlChar *name, int type,
        !          28257:            xmlElementContentPtr content)
        !          28258: {
        !          28259:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28260:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28261:         (ctxt->user_sax->elementDecl != NULL))
        !          28262:        ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content);
        !          28263: }
        !          28264: 
        !          28265: static void
        !          28266: notationDeclSplit(void *ctx, const xmlChar *name,
        !          28267:             const xmlChar *publicId, const xmlChar *systemId)
        !          28268: {
        !          28269:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28270:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28271:         (ctxt->user_sax->notationDecl != NULL))
        !          28272:        ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId,
        !          28273:                                     systemId);
        !          28274: }
        !          28275: 
        !          28276: static void
        !          28277: unparsedEntityDeclSplit(void *ctx, const xmlChar *name,
        !          28278:                   const xmlChar *publicId, const xmlChar *systemId,
        !          28279:                   const xmlChar *notationName)
        !          28280: {
        !          28281:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28282:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28283:         (ctxt->user_sax->unparsedEntityDecl != NULL))
        !          28284:        ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId,
        !          28285:                                           systemId, notationName);
        !          28286: }
        !          28287: 
        !          28288: static void
        !          28289: setDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc)
        !          28290: {
        !          28291:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28292:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28293:         (ctxt->user_sax->setDocumentLocator != NULL))
        !          28294:        ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
        !          28295: }
        !          28296: 
        !          28297: static void
        !          28298: startDocumentSplit(void *ctx)
        !          28299: {
        !          28300:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28301:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28302:         (ctxt->user_sax->startDocument != NULL))
        !          28303:        ctxt->user_sax->startDocument(ctxt->user_data);
        !          28304: }
        !          28305: 
        !          28306: static void
        !          28307: endDocumentSplit(void *ctx)
        !          28308: {
        !          28309:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28310:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28311:         (ctxt->user_sax->endDocument != NULL))
        !          28312:        ctxt->user_sax->endDocument(ctxt->user_data);
        !          28313: }
        !          28314: 
        !          28315: static void
        !          28316: processingInstructionSplit(void *ctx, const xmlChar *target,
        !          28317:                       const xmlChar *data)
        !          28318: {
        !          28319:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28320:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28321:         (ctxt->user_sax->processingInstruction != NULL))
        !          28322:        ctxt->user_sax->processingInstruction(ctxt->user_data, target, data);
        !          28323: }
        !          28324: 
        !          28325: static void
        !          28326: commentSplit(void *ctx, const xmlChar *value)
        !          28327: {
        !          28328:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28329:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28330:         (ctxt->user_sax->comment != NULL))
        !          28331:        ctxt->user_sax->comment(ctxt->user_data, value);
        !          28332: }
        !          28333: 
        !          28334: /*
        !          28335:  * Varargs error callbacks to the user application, harder ...
        !          28336:  */
        !          28337: 
        !          28338: static void XMLCDECL
        !          28339: warningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
        !          28340:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28341:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28342:         (ctxt->user_sax->warning != NULL)) {
        !          28343:        TODO
        !          28344:     }
        !          28345: }
        !          28346: static void XMLCDECL
        !          28347: errorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
        !          28348:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28349:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28350:         (ctxt->user_sax->error != NULL)) {
        !          28351:        TODO
        !          28352:     }
        !          28353: }
        !          28354: static void XMLCDECL
        !          28355: fatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
        !          28356:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28357:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28358:         (ctxt->user_sax->fatalError != NULL)) {
        !          28359:        TODO
        !          28360:     }
        !          28361: }
        !          28362: 
        !          28363: /*
        !          28364:  * Those are function where both the user handler and the schemas handler
        !          28365:  * need to be called.
        !          28366:  */
        !          28367: static void
        !          28368: charactersSplit(void *ctx, const xmlChar *ch, int len)
        !          28369: {
        !          28370:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28371:     if (ctxt == NULL)
        !          28372:         return;
        !          28373:     if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL))
        !          28374:        ctxt->user_sax->characters(ctxt->user_data, ch, len);
        !          28375:     if (ctxt->ctxt != NULL)
        !          28376:        xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
        !          28377: }
        !          28378: 
        !          28379: static void
        !          28380: ignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len)
        !          28381: {
        !          28382:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28383:     if (ctxt == NULL)
        !          28384:         return;
        !          28385:     if ((ctxt->user_sax != NULL) &&
        !          28386:         (ctxt->user_sax->ignorableWhitespace != NULL))
        !          28387:        ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len);
        !          28388:     if (ctxt->ctxt != NULL)
        !          28389:        xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
        !          28390: }
        !          28391: 
        !          28392: static void
        !          28393: cdataBlockSplit(void *ctx, const xmlChar *value, int len)
        !          28394: {
        !          28395:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28396:     if (ctxt == NULL)
        !          28397:         return;
        !          28398:     if ((ctxt->user_sax != NULL) &&
        !          28399:         (ctxt->user_sax->cdataBlock != NULL))
        !          28400:        ctxt->user_sax->cdataBlock(ctxt->user_data, value, len);
        !          28401:     if (ctxt->ctxt != NULL)
        !          28402:        xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len);
        !          28403: }
        !          28404: 
        !          28405: static void
        !          28406: referenceSplit(void *ctx, const xmlChar *name)
        !          28407: {
        !          28408:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28409:     if (ctxt == NULL)
        !          28410:         return;
        !          28411:     if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
        !          28412:         (ctxt->user_sax->reference != NULL))
        !          28413:        ctxt->user_sax->reference(ctxt->user_data, name);
        !          28414:     if (ctxt->ctxt != NULL)
        !          28415:         xmlSchemaSAXHandleReference(ctxt->user_data, name);
        !          28416: }
        !          28417: 
        !          28418: static void
        !          28419: startElementNsSplit(void *ctx, const xmlChar * localname,
        !          28420:                    const xmlChar * prefix, const xmlChar * URI,
        !          28421:                    int nb_namespaces, const xmlChar ** namespaces,
        !          28422:                    int nb_attributes, int nb_defaulted,
        !          28423:                    const xmlChar ** attributes) {
        !          28424:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28425:     if (ctxt == NULL)
        !          28426:         return;
        !          28427:     if ((ctxt->user_sax != NULL) &&
        !          28428:         (ctxt->user_sax->startElementNs != NULL))
        !          28429:        ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix,
        !          28430:                                       URI, nb_namespaces, namespaces,
        !          28431:                                       nb_attributes, nb_defaulted,
        !          28432:                                       attributes);
        !          28433:     if (ctxt->ctxt != NULL)
        !          28434:        xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix,
        !          28435:                                         URI, nb_namespaces, namespaces,
        !          28436:                                         nb_attributes, nb_defaulted,
        !          28437:                                         attributes);
        !          28438: }
        !          28439: 
        !          28440: static void
        !          28441: endElementNsSplit(void *ctx, const xmlChar * localname,
        !          28442:                    const xmlChar * prefix, const xmlChar * URI) {
        !          28443:     xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
        !          28444:     if (ctxt == NULL)
        !          28445:         return;
        !          28446:     if ((ctxt->user_sax != NULL) &&
        !          28447:         (ctxt->user_sax->endElementNs != NULL))
        !          28448:        ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI);
        !          28449:     if (ctxt->ctxt != NULL)
        !          28450:        xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI);
        !          28451: }
        !          28452: 
        !          28453: /**
        !          28454:  * xmlSchemaSAXPlug:
        !          28455:  * @ctxt:  a schema validation context
        !          28456:  * @sax:  a pointer to the original xmlSAXHandlerPtr
        !          28457:  * @user_data:  a pointer to the original SAX user data pointer
        !          28458:  *
        !          28459:  * Plug a SAX based validation layer in a SAX parsing event flow.
        !          28460:  * The original @saxptr and @dataptr data are replaced by new pointers
        !          28461:  * but the calls to the original will be maintained.
        !          28462:  *
        !          28463:  * Returns a pointer to a data structure needed to unplug the validation layer
        !          28464:  *         or NULL in case of errors.
        !          28465:  */
        !          28466: xmlSchemaSAXPlugPtr
        !          28467: xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
        !          28468:                 xmlSAXHandlerPtr *sax, void **user_data)
        !          28469: {
        !          28470:     xmlSchemaSAXPlugPtr ret;
        !          28471:     xmlSAXHandlerPtr old_sax;
        !          28472: 
        !          28473:     if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL))
        !          28474:         return(NULL);
        !          28475: 
        !          28476:     /*
        !          28477:      * We only allow to plug into SAX2 event streams
        !          28478:      */
        !          28479:     old_sax = *sax;
        !          28480:     if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC))
        !          28481:         return(NULL);
        !          28482:     if ((old_sax != NULL) &&
        !          28483:         (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) &&
        !          28484:         ((old_sax->startElement != NULL) || (old_sax->endElement != NULL)))
        !          28485:         return(NULL);
        !          28486: 
        !          28487:     /*
        !          28488:      * everything seems right allocate the local data needed for that layer
        !          28489:      */
        !          28490:     ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct));
        !          28491:     if (ret == NULL) {
        !          28492:         return(NULL);
        !          28493:     }
        !          28494:     memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct));
        !          28495:     ret->magic = XML_SAX_PLUG_MAGIC;
        !          28496:     ret->schemas_sax.initialized = XML_SAX2_MAGIC;
        !          28497:     ret->ctxt = ctxt;
        !          28498:     ret->user_sax_ptr = sax;
        !          28499:     ret->user_sax = old_sax;
        !          28500:     if (old_sax == NULL) {
        !          28501:         /*
        !          28502:         * go direct, no need for the split block and functions.
        !          28503:         */
        !          28504:        ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
        !          28505:        ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
        !          28506:        /*
        !          28507:         * Note that we use the same text-function for both, to prevent
        !          28508:         * the parser from testing for ignorable whitespace.
        !          28509:         */
        !          28510:        ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
        !          28511:        ret->schemas_sax.characters = xmlSchemaSAXHandleText;
        !          28512: 
        !          28513:        ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
        !          28514:        ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
        !          28515: 
        !          28516:        ret->user_data = ctxt;
        !          28517:        *user_data = ctxt;
        !          28518:     } else {
        !          28519:        /*
        !          28520:         * for each callback unused by Schemas initialize it to the Split
        !          28521:        * routine only if non NULL in the user block, this can speed up
        !          28522:        * things at the SAX level.
        !          28523:        */
        !          28524:         if (old_sax->internalSubset != NULL)
        !          28525:             ret->schemas_sax.internalSubset = internalSubsetSplit;
        !          28526:         if (old_sax->isStandalone != NULL)
        !          28527:             ret->schemas_sax.isStandalone = isStandaloneSplit;
        !          28528:         if (old_sax->hasInternalSubset != NULL)
        !          28529:             ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
        !          28530:         if (old_sax->hasExternalSubset != NULL)
        !          28531:             ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
        !          28532:         if (old_sax->resolveEntity != NULL)
        !          28533:             ret->schemas_sax.resolveEntity = resolveEntitySplit;
        !          28534:         if (old_sax->getEntity != NULL)
        !          28535:             ret->schemas_sax.getEntity = getEntitySplit;
        !          28536:         if (old_sax->entityDecl != NULL)
        !          28537:             ret->schemas_sax.entityDecl = entityDeclSplit;
        !          28538:         if (old_sax->notationDecl != NULL)
        !          28539:             ret->schemas_sax.notationDecl = notationDeclSplit;
        !          28540:         if (old_sax->attributeDecl != NULL)
        !          28541:             ret->schemas_sax.attributeDecl = attributeDeclSplit;
        !          28542:         if (old_sax->elementDecl != NULL)
        !          28543:             ret->schemas_sax.elementDecl = elementDeclSplit;
        !          28544:         if (old_sax->unparsedEntityDecl != NULL)
        !          28545:             ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
        !          28546:         if (old_sax->setDocumentLocator != NULL)
        !          28547:             ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
        !          28548:         if (old_sax->startDocument != NULL)
        !          28549:             ret->schemas_sax.startDocument = startDocumentSplit;
        !          28550:         if (old_sax->endDocument != NULL)
        !          28551:             ret->schemas_sax.endDocument = endDocumentSplit;
        !          28552:         if (old_sax->processingInstruction != NULL)
        !          28553:             ret->schemas_sax.processingInstruction = processingInstructionSplit;
        !          28554:         if (old_sax->comment != NULL)
        !          28555:             ret->schemas_sax.comment = commentSplit;
        !          28556:         if (old_sax->warning != NULL)
        !          28557:             ret->schemas_sax.warning = warningSplit;
        !          28558:         if (old_sax->error != NULL)
        !          28559:             ret->schemas_sax.error = errorSplit;
        !          28560:         if (old_sax->fatalError != NULL)
        !          28561:             ret->schemas_sax.fatalError = fatalErrorSplit;
        !          28562:         if (old_sax->getParameterEntity != NULL)
        !          28563:             ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
        !          28564:         if (old_sax->externalSubset != NULL)
        !          28565:             ret->schemas_sax.externalSubset = externalSubsetSplit;
        !          28566: 
        !          28567:        /*
        !          28568:         * the 6 schemas callback have to go to the splitter functions
        !          28569:         * Note that we use the same text-function for ignorableWhitespace
        !          28570:         * if possible, to prevent the parser from testing for ignorable
        !          28571:         * whitespace.
        !          28572:         */
        !          28573:         ret->schemas_sax.characters = charactersSplit;
        !          28574:        if ((old_sax->ignorableWhitespace != NULL) &&
        !          28575:            (old_sax->ignorableWhitespace != old_sax->characters))
        !          28576:            ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
        !          28577:        else
        !          28578:            ret->schemas_sax.ignorableWhitespace = charactersSplit;
        !          28579:         ret->schemas_sax.cdataBlock = cdataBlockSplit;
        !          28580:         ret->schemas_sax.reference = referenceSplit;
        !          28581:         ret->schemas_sax.startElementNs = startElementNsSplit;
        !          28582:         ret->schemas_sax.endElementNs = endElementNsSplit;
        !          28583: 
        !          28584:        ret->user_data_ptr = user_data;
        !          28585:        ret->user_data = *user_data;
        !          28586:        *user_data = ret;
        !          28587:     }
        !          28588: 
        !          28589:     /*
        !          28590:      * plug the pointers back.
        !          28591:      */
        !          28592:     *sax = &(ret->schemas_sax);
        !          28593:     ctxt->sax = *sax;
        !          28594:     ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
        !          28595:     xmlSchemaPreRun(ctxt);
        !          28596:     return(ret);
        !          28597: }
        !          28598: 
        !          28599: /**
        !          28600:  * xmlSchemaSAXUnplug:
        !          28601:  * @plug:  a data structure returned by xmlSchemaSAXPlug
        !          28602:  *
        !          28603:  * Unplug a SAX based validation layer in a SAX parsing event flow.
        !          28604:  * The original pointers used in the call are restored.
        !          28605:  *
        !          28606:  * Returns 0 in case of success and -1 in case of failure.
        !          28607:  */
        !          28608: int
        !          28609: xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
        !          28610: {
        !          28611:     xmlSAXHandlerPtr *sax;
        !          28612:     void **user_data;
        !          28613: 
        !          28614:     if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
        !          28615:         return(-1);
        !          28616:     plug->magic = 0;
        !          28617: 
        !          28618:     xmlSchemaPostRun(plug->ctxt);
        !          28619:     /* restore the data */
        !          28620:     sax = plug->user_sax_ptr;
        !          28621:     *sax = plug->user_sax;
        !          28622:     if (plug->user_sax != NULL) {
        !          28623:        user_data = plug->user_data_ptr;
        !          28624:        *user_data = plug->user_data;
        !          28625:     }
        !          28626: 
        !          28627:     /* free and return */
        !          28628:     xmlFree(plug);
        !          28629:     return(0);
        !          28630: }
        !          28631: 
        !          28632: /**
        !          28633:  * xmlSchemaValidateStream:
        !          28634:  * @ctxt:  a schema validation context
        !          28635:  * @input:  the input to use for reading the data
        !          28636:  * @enc:  an optional encoding information
        !          28637:  * @sax:  a SAX handler for the resulting events
        !          28638:  * @user_data:  the context to provide to the SAX handler.
        !          28639:  *
        !          28640:  * Validate an input based on a flow of SAX event from the parser
        !          28641:  * and forward the events to the @sax handler with the provided @user_data
        !          28642:  * the user provided @sax handler must be a SAX2 one.
        !          28643:  *
        !          28644:  * Returns 0 if the document is schemas valid, a positive error code
        !          28645:  *     number otherwise and -1 in case of internal or API error.
        !          28646:  */
        !          28647: int
        !          28648: xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
        !          28649:                         xmlParserInputBufferPtr input, xmlCharEncoding enc,
        !          28650:                         xmlSAXHandlerPtr sax, void *user_data)
        !          28651: {
        !          28652:     xmlSchemaSAXPlugPtr plug = NULL;
        !          28653:     xmlSAXHandlerPtr old_sax = NULL;
        !          28654:     xmlParserCtxtPtr pctxt = NULL;
        !          28655:     xmlParserInputPtr inputStream = NULL;
        !          28656:     int ret;
        !          28657: 
        !          28658:     if ((ctxt == NULL) || (input == NULL))
        !          28659:         return (-1);
        !          28660: 
        !          28661:     /*
        !          28662:      * prepare the parser
        !          28663:      */
        !          28664:     pctxt = xmlNewParserCtxt();
        !          28665:     if (pctxt == NULL)
        !          28666:         return (-1);
        !          28667:     old_sax = pctxt->sax;
        !          28668:     pctxt->sax = sax;
        !          28669:     pctxt->userData = user_data;
        !          28670: #if 0
        !          28671:     if (options)
        !          28672:         xmlCtxtUseOptions(pctxt, options);
        !          28673: #endif
        !          28674:     pctxt->linenumbers = 1;
        !          28675: 
        !          28676:     inputStream = xmlNewIOInputStream(pctxt, input, enc);;
        !          28677:     if (inputStream == NULL) {
        !          28678:         ret = -1;
        !          28679:        goto done;
        !          28680:     }
        !          28681:     inputPush(pctxt, inputStream);
        !          28682:     ctxt->parserCtxt = pctxt;
        !          28683:     ctxt->input = input;
        !          28684: 
        !          28685:     /*
        !          28686:      * Plug the validation and launch the parsing
        !          28687:      */
        !          28688:     plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData));
        !          28689:     if (plug == NULL) {
        !          28690:         ret = -1;
        !          28691:        goto done;
        !          28692:     }
        !          28693:     ctxt->input = input;
        !          28694:     ctxt->enc = enc;
        !          28695:     ctxt->sax = pctxt->sax;
        !          28696:     ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
        !          28697:     ret = xmlSchemaVStart(ctxt);
        !          28698: 
        !          28699:     if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
        !          28700:        ret = ctxt->parserCtxt->errNo;
        !          28701:        if (ret == 0)
        !          28702:            ret = 1;
        !          28703:     }
        !          28704: 
        !          28705: done:
        !          28706:     ctxt->parserCtxt = NULL;
        !          28707:     ctxt->sax = NULL;
        !          28708:     ctxt->input = NULL;
        !          28709:     if (plug != NULL) {
        !          28710:         xmlSchemaSAXUnplug(plug);
        !          28711:     }
        !          28712:     /* cleanup */
        !          28713:     if (pctxt != NULL) {
        !          28714:        pctxt->sax = old_sax;
        !          28715:        xmlFreeParserCtxt(pctxt);
        !          28716:     }
        !          28717:     return (ret);
        !          28718: }
        !          28719: 
        !          28720: /**
        !          28721:  * xmlSchemaValidateFile:
        !          28722:  * @ctxt: a schema validation context
        !          28723:  * @filename: the URI of the instance
        !          28724:  * @options: a future set of options, currently unused
        !          28725:  *
        !          28726:  * Do a schemas validation of the given resource, it will use the
        !          28727:  * SAX streamable validation internally.
        !          28728:  *
        !          28729:  * Returns 0 if the document is valid, a positive error code
        !          28730:  *     number otherwise and -1 in case of an internal or API error.
        !          28731:  */
        !          28732: int
        !          28733: xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
        !          28734:                       const char * filename,
        !          28735:                      int options ATTRIBUTE_UNUSED)
        !          28736: {
        !          28737:     int ret;
        !          28738:     xmlParserInputBufferPtr input;
        !          28739: 
        !          28740:     if ((ctxt == NULL) || (filename == NULL))
        !          28741:         return (-1);
        !          28742: 
        !          28743:     input = xmlParserInputBufferCreateFilename(filename,
        !          28744:        XML_CHAR_ENCODING_NONE);
        !          28745:     if (input == NULL)
        !          28746:        return (-1);
        !          28747:     ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE,
        !          28748:        NULL, NULL);
        !          28749:     return (ret);
        !          28750: }
        !          28751: 
        !          28752: /**
        !          28753:  * xmlSchemaValidCtxtGetParserCtxt:
        !          28754:  * @ctxt: a schema validation context
        !          28755:  *
        !          28756:  * allow access to the parser context of the schema validation context
        !          28757:  *
        !          28758:  * Returns the parser context of the schema validation context or NULL
        !          28759:  *         in case of error.
        !          28760:  */
        !          28761: xmlParserCtxtPtr
        !          28762: xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
        !          28763: {
        !          28764:     if (ctxt == NULL)
        !          28765:         return(NULL);
        !          28766:     return (ctxt->parserCtxt);
        !          28767: }
        !          28768: 
        !          28769: #define bottom_xmlschemas
        !          28770: #include "elfgcchack.h"
        !          28771: #endif /* LIBXML_SCHEMAS_ENABLED */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>