50#pragma convert("ISO8859-1")
56#ifdef LIBXML_SCHEMAS_ENABLED
72#ifdef LIBXML_PATTERN_ENABLED
75#ifdef LIBXML_READER_ENABLED
96 #ifndef DEBUG_IDC_NODE_TABLE
97 #define DEBUG_IDC_NODE_TABLE
103#define ENABLE_REDEFINE
109#define DUMP_CONTENT_MODEL
111#ifdef LIBXML_READER_ENABLED
115#define UNBOUNDED (1 << 30)
117 xmlGenericError(xmlGenericErrorContext, \
118 "Unimplemented block at %s:%d\n", \
121#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
127 "http://www.w3.org/2001/XMLSchema";
130 "http://www.w3.org/2001/XMLSchema-instance";
133 "http://www.w3.org/2000/xmlns/";
138#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
139#define PCTXT_CAST (xmlSchemaParserCtxtPtr)
140#define VCTXT_CAST (xmlSchemaValidCtxtPtr)
141#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
142#define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
143#define WXS_PTC_CAST (xmlSchemaParticlePtr)
144#define WXS_TYPE_CAST (xmlSchemaTypePtr)
145#define WXS_ELEM_CAST (xmlSchemaElementPtr)
146#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
147#define WXS_ATTR_CAST (xmlSchemaAttributePtr)
148#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
149#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
150#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
151#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
152#define WXS_IDC_CAST (xmlSchemaIDCPtr)
153#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
154#define WXS_LIST_CAST (xmlSchemaItemListPtr)
159#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
161#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
165#define WXS_ELEM_TYPEDEF(e) (e)->subtypes
167#define WXS_SUBST_HEAD(item) (item)->refDecl
171#define WXS_ATTR_TYPEDEF(a) (a)->subtypes
175#define WXS_ATTRUSE_DECL(au) (WXS_ATTR_USE_CAST (au))->attrDecl
177#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
179#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
181#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
185#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
186#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
190#define WXS_PARTICLE(p) WXS_PTC_CAST (p)
192#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
194#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
196#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
200#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
204#define WXS_IS_MODEL_GROUP(i) \
205 (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
206 ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
207 ((i)->type == XML_SCHEMA_TYPE_ALL))
209#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
213#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
214 ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
216#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
217 ((t) == XML_SCHEMA_SCHEMA_IMPORT))
219#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
221#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
225#define WXS_IS_ANYTYPE(i) \
226 (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
227 ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
229#define WXS_IS_COMPLEX(i) \
230 (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
231 ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
233#define WXS_IS_SIMPLE(item) \
234 ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
235 ((item->type == XML_SCHEMA_TYPE_BASIC) && \
236 (item->builtInType != XML_SCHEMAS_ANYTYPE)))
238#define WXS_IS_ANY_SIMPLE_TYPE(i) \
239 (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
240 ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
242#define WXS_IS_RESTRICTION(t) \
243 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
245#define WXS_IS_EXTENSION(t) \
246 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
248#define WXS_IS_TYPE_NOT_FIXED(i) \
249 (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
250 (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
252#define WXS_IS_TYPE_NOT_FIXED_1(item) \
253 (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
254 (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
256#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
258#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
262#define WXS_HAS_COMPLEX_CONTENT(item) \
263 ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
264 (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
265 (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
267#define WXS_HAS_SIMPLE_CONTENT(item) \
268 ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
269 (item->contentType == XML_SCHEMA_CONTENT_BASIC))
271#define WXS_HAS_MIXED_CONTENT(item) \
272 (item->contentType == XML_SCHEMA_CONTENT_MIXED)
274#define WXS_EMPTIABLE(t) \
275 (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
277#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
279#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
281#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
285#define WXS_LIST_ITEMTYPE(t) (t)->subtypes
287#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
289#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
291#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
295#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
297#define WXS_HAS_BUCKETS(ctx) \
298( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
299(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
301#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
303#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
305#define WXS_SCHEMA(ctx) (ctx)->schema
307#define WXS_ADD_LOCAL(ctx, item) \
308 xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item)
310#define WXS_ADD_GLOBAL(ctx, item) \
311 xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item)
313#define WXS_ADD_PENDING(ctx, item) \
314 xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
318#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
322#define IS_SCHEMA(node, type) \
323 ((node != NULL) && (node->ns != NULL) && \
324 (xmlStrEqual(node->name, (const xmlChar *) type)) && \
325 (xmlStrEqual(node->ns->href, xmlSchemaNs)))
327#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
334#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
336#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
338#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
340#define HFAILURE if (res == -1) goto exit_failure;
342#define HERROR if (res != 0) goto exit_error;
344#define HSTOP(ctx) if ((ctx)->stop) goto exit;
348#define SUBSET_RESTRICTION 1<<0
349#define SUBSET_EXTENSION 1<<1
350#define SUBSET_SUBSTITUTION 1<<2
351#define SUBSET_LIST 1<<3
352#define SUBSET_UNION 1<<4
354typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
355typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
357typedef struct _xmlSchemaItemList xmlSchemaItemList;
358typedef xmlSchemaItemList *xmlSchemaItemListPtr;
359struct _xmlSchemaItemList {
365#define XML_SCHEMA_CTXT_PARSER 1
366#define XML_SCHEMA_CTXT_VALIDATOR 2
368typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
369typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
370struct _xmlSchemaAbstractCtxt {
375typedef struct _xmlSchemaBucket xmlSchemaBucket;
376typedef xmlSchemaBucket *xmlSchemaBucketPtr;
378#define XML_SCHEMA_SCHEMA_MAIN 0
379#define XML_SCHEMA_SCHEMA_IMPORT 1
380#define XML_SCHEMA_SCHEMA_INCLUDE 2
381#define XML_SCHEMA_SCHEMA_REDEFINE 3
388typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
389typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
390struct _xmlSchemaSchemaRelation {
391 xmlSchemaSchemaRelationPtr
next;
393 const xmlChar *importNamespace;
394 xmlSchemaBucketPtr bucket;
397#define XML_SCHEMA_BUCKET_MARKED 1<<0
398#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
400struct _xmlSchemaBucket {
404 const xmlChar *origTargetNamespace;
405 const xmlChar *targetNamespace;
407 xmlSchemaSchemaRelationPtr relations;
412 xmlSchemaItemListPtr globals;
413 xmlSchemaItemListPtr locals;
424typedef struct _xmlSchemaImport xmlSchemaImport;
425typedef xmlSchemaImport *xmlSchemaImportPtr;
426struct _xmlSchemaImport {
431 const xmlChar *origTargetNamespace;
436 const xmlChar *targetNamespace;
439 xmlSchemaSchemaRelationPtr relations;
444 xmlSchemaItemListPtr globals;
445 xmlSchemaItemListPtr locals;
453typedef struct _xmlSchemaInclude xmlSchemaInclude;
454typedef xmlSchemaInclude *xmlSchemaIncludePtr;
455struct _xmlSchemaInclude {
459 const xmlChar *origTargetNamespace;
460 const xmlChar *targetNamespace;
462 xmlSchemaSchemaRelationPtr relations;
467 xmlSchemaItemListPtr globals;
468 xmlSchemaItemListPtr locals;
471 xmlSchemaImportPtr ownerImport;
479typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
480typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
481struct _xmlSchemaBasicItem {
482 xmlSchemaTypeType
type;
492typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
493typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
494struct _xmlSchemaAnnotItem {
495 xmlSchemaTypeType
type;
496 xmlSchemaAnnotPtr annot;
505typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
506typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
507struct _xmlSchemaTreeItem {
508 xmlSchemaTypeType
type;
509 xmlSchemaAnnotPtr annot;
510 xmlSchemaTreeItemPtr
next;
511 xmlSchemaTreeItemPtr children;
515#define XML_SCHEMA_ATTR_USE_FIXED 1<<0
522typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
523typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
524struct _xmlSchemaAttributeUse {
525 xmlSchemaTypeType
type;
526 xmlSchemaAnnotPtr annot;
527 xmlSchemaAttributeUsePtr
next;
532 xmlSchemaAttributePtr attrDecl;
538 xmlSchemaValPtr defVal;
547typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
548typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
549struct _xmlSchemaAttributeUseProhib {
550 xmlSchemaTypeType
type;
553 const xmlChar *targetNamespace;
560typedef struct _xmlSchemaRedef xmlSchemaRedef;
561typedef xmlSchemaRedef *xmlSchemaRedefPtr;
562struct _xmlSchemaRedef {
563 xmlSchemaRedefPtr
next;
564 xmlSchemaBasicItemPtr
item;
566 xmlSchemaBasicItemPtr
target;
570 xmlSchemaBucketPtr targetBucket;
576typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
577typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
578struct _xmlSchemaConstructionCtxt {
579 xmlSchemaPtr mainSchema;
580 xmlSchemaBucketPtr mainBucket;
584 xmlSchemaBucketPtr bucket;
585 xmlSchemaItemListPtr pending;
588 xmlSchemaRedefPtr redefs;
589 xmlSchemaRedefPtr lastRedef;
592#define XML_SCHEMAS_PARSE_ERROR 1
593#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
595struct _xmlSchemaParserCtxt {
598 xmlSchemaValidityErrorFunc
error;
599 xmlSchemaValidityWarningFunc
warning;
604 xmlSchemaConstructionCtxtPtr constructor;
624 xmlAutomataStatePtr
start;
625 xmlAutomataStatePtr
end;
626 xmlAutomataStatePtr
state;
629 xmlSchemaTypePtr ctxtType;
631 xmlSchemaValidCtxtPtr vctxt;
636 const xmlChar *targetNamespace;
637 xmlSchemaBucketPtr redefined;
639 xmlSchemaRedefPtr redef;
641 xmlSchemaItemListPtr attrProhibs;
650typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
651typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
652struct _xmlSchemaQNameRef {
653 xmlSchemaTypeType
type;
654 xmlSchemaBasicItemPtr
item;
655 xmlSchemaTypeType itemType;
657 const xmlChar *targetNamespace;
667typedef struct _xmlSchemaParticle xmlSchemaParticle;
668typedef xmlSchemaParticle *xmlSchemaParticlePtr;
669struct _xmlSchemaParticle {
670 xmlSchemaTypeType
type;
671 xmlSchemaAnnotPtr annot;
672 xmlSchemaTreeItemPtr
next;
673 xmlSchemaTreeItemPtr children;
687typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
688typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
689struct _xmlSchemaModelGroup {
690 xmlSchemaTypeType
type;
691 xmlSchemaAnnotPtr annot;
692 xmlSchemaTreeItemPtr
next;
693 xmlSchemaTreeItemPtr children;
697#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
698#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
705typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
706typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
707struct _xmlSchemaModelGroupDef {
708 xmlSchemaTypeType
type;
709 xmlSchemaAnnotPtr annot;
710 xmlSchemaTreeItemPtr
next;
711 xmlSchemaTreeItemPtr children;
713 const xmlChar *targetNamespace;
718typedef struct _xmlSchemaIDC xmlSchemaIDC;
719typedef xmlSchemaIDC *xmlSchemaIDCPtr;
727typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
728typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
729struct _xmlSchemaIDCSelect {
730 xmlSchemaIDCSelectPtr
next;
744struct _xmlSchemaIDC {
745 xmlSchemaTypeType
type;
746 xmlSchemaAnnotPtr annot;
747 xmlSchemaIDCPtr
next;
750 const xmlChar *targetNamespace;
751 xmlSchemaIDCSelectPtr selector;
752 xmlSchemaIDCSelectPtr
fields;
754 xmlSchemaQNameRefPtr
ref;
762typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
763typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
764struct _xmlSchemaIDCAug {
765 xmlSchemaIDCAugPtr
next;
776typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
777typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
778struct _xmlSchemaPSVIIDCKey {
779 xmlSchemaTypePtr
type;
788typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
789typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
790struct _xmlSchemaPSVIIDCNode {
792 xmlSchemaPSVIIDCKeyPtr *keys;
803typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
804typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
805struct _xmlSchemaPSVIIDCBinding {
806 xmlSchemaPSVIIDCBindingPtr
next;
807 xmlSchemaIDCPtr definition;
808 xmlSchemaPSVIIDCNodePtr *nodeTable;
811 xmlSchemaItemListPtr dupls;
815#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
816#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
818#define XPATH_STATE_OBJ_MATCHES -2
819#define XPATH_STATE_OBJ_BLOCKED -3
821typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
822typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
829typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
830typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
831struct _xmlSchemaIDCStateObj {
833 xmlSchemaIDCStateObjPtr
next;
838 xmlSchemaIDCMatcherPtr matcher;
840 xmlSchemaIDCSelectPtr sel;
851struct _xmlSchemaIDCMatcher {
854 xmlSchemaIDCMatcherPtr
next;
855 xmlSchemaIDCMatcherPtr nextCached;
856 xmlSchemaIDCAugPtr aidc;
858 xmlSchemaPSVIIDCKeyPtr **keySeqs;
861 xmlSchemaItemListPtr targets;
869#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0
870#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
871#define XML_SCHEMA_ELEM_INFO_NILLED 1<<2
872#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3
874#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4
875#define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5
876#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6
878#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7
879#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8
880#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9
881#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10
888struct _xmlSchemaNodeInfo {
896 xmlSchemaTypePtr typeDef;
903 xmlSchemaElementPtr decl;
905 xmlSchemaPSVIIDCBindingPtr idcTable;
907 xmlSchemaIDCMatcherPtr idcMatchers;
909 xmlRegExecCtxtPtr regexCtxt;
919#define XML_SCHEMAS_ATTR_UNKNOWN 1
920#define XML_SCHEMAS_ATTR_ASSESSED 2
921#define XML_SCHEMAS_ATTR_PROHIBITED 3
922#define XML_SCHEMAS_ATTR_ERR_MISSING 4
923#define XML_SCHEMAS_ATTR_INVALID_VALUE 5
924#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
925#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
926#define XML_SCHEMAS_ATTR_DEFAULT 8
927#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
928#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
929#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
930#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
931#define XML_SCHEMAS_ATTR_WILD_SKIP 13
932#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
933#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
934#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
935#define XML_SCHEMAS_ATTR_META 17
939#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
940#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
941#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
942#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
943#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
945typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
946typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
947struct _xmlSchemaAttrInfo {
955 xmlSchemaTypePtr typeDef;
958 xmlSchemaAttributePtr decl;
959 xmlSchemaAttributeUsePtr use;
963 xmlSchemaNodeInfoPtr
parent;
967#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
973struct _xmlSchemaValidCtxt {
976 xmlSchemaValidityErrorFunc
error;
977 xmlSchemaValidityWarningFunc
warning;
996 xmlRegExecCtxtPtr regexp;
997 xmlSchemaValPtr
value;
1002 xmlSchemaParserCtxtPtr pctxt;
1006 xmlSchemaNodeInfoPtr *elemInfos;
1008 xmlSchemaNodeInfoPtr
inode;
1010 xmlSchemaIDCAugPtr aidcs;
1012 xmlSchemaIDCStateObjPtr xpathStates;
1013 xmlSchemaIDCStateObjPtr xpathStatePool;
1014 xmlSchemaIDCMatcherPtr idcMatcherCache;
1016 xmlSchemaPSVIIDCNodePtr *idcNodes;
1020 xmlSchemaPSVIIDCKeyPtr *idcKeys;
1028#ifdef LIBXML_READER_ENABLED
1032 xmlSchemaAttrInfoPtr *attrInfos;
1037 xmlSchemaItemListPtr nodeQNames;
1039 int createIDCNodeTables;
1040 int psviExposeIDCNodeTables;
1043 xmlSchemaValidityLocatorFunc locFunc;
1052typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
1053typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
1054struct _xmlSchemaSubstGroup {
1055 xmlSchemaElementPtr
head;
1056 xmlSchemaItemListPtr members;
1064typedef struct _xmlIDCHashEntry xmlIDCHashEntry;
1065typedef xmlIDCHashEntry *xmlIDCHashEntryPtr;
1066struct _xmlIDCHashEntry {
1067 xmlIDCHashEntryPtr
next;
1077static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
1080static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
1084xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
1085 xmlSchemaAbstractCtxtPtr ctxt);
1087xmlSchemaFacetTypeToString(xmlSchemaTypeType
type);
1089xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1092xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
1093 xmlSchemaParserCtxtPtr ctxt);
1095xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
1096static xmlSchemaWhitespaceValueType
1097xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type);
1098static xmlSchemaTreeItemPtr
1099xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1103xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item);
1104static xmlSchemaTypeLinkPtr
1105xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type);
1107xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
1108 const char *funcName,
1111xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
1112 xmlSchemaTypePtr
type,
1113 xmlSchemaTypePtr baseType,
1116xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
1117 xmlSchemaParserCtxtPtr ctxt);
1119xmlSchemaComponentListFree(xmlSchemaItemListPtr
list);
1120static xmlSchemaQNameRefPtr
1121xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
1138xmlSchemaItemTypeToStr(xmlSchemaTypeType
type)
1141 case XML_SCHEMA_TYPE_BASIC:
1142 return(
BAD_CAST "simple type definition");
1143 case XML_SCHEMA_TYPE_SIMPLE:
1144 return(
BAD_CAST "simple type definition");
1145 case XML_SCHEMA_TYPE_COMPLEX:
1146 return(
BAD_CAST "complex type definition");
1147 case XML_SCHEMA_TYPE_ELEMENT:
1148 return(
BAD_CAST "element declaration");
1149 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1151 case XML_SCHEMA_TYPE_ATTRIBUTE:
1152 return(
BAD_CAST "attribute declaration");
1153 case XML_SCHEMA_TYPE_GROUP:
1154 return(
BAD_CAST "model group definition");
1155 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1156 return(
BAD_CAST "attribute group definition");
1157 case XML_SCHEMA_TYPE_NOTATION:
1158 return(
BAD_CAST "notation declaration");
1159 case XML_SCHEMA_TYPE_SEQUENCE:
1160 return(
BAD_CAST "model group (sequence)");
1161 case XML_SCHEMA_TYPE_CHOICE:
1162 return(
BAD_CAST "model group (choice)");
1163 case XML_SCHEMA_TYPE_ALL:
1164 return(
BAD_CAST "model group (all)");
1165 case XML_SCHEMA_TYPE_PARTICLE:
1167 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1168 return(
BAD_CAST "unique identity-constraint");
1170 case XML_SCHEMA_TYPE_IDC_KEY:
1171 return(
BAD_CAST "key identity-constraint");
1173 case XML_SCHEMA_TYPE_IDC_KEYREF:
1174 return(
BAD_CAST "keyref identity-constraint");
1176 case XML_SCHEMA_TYPE_ANY:
1178 case XML_SCHEMA_EXTRA_QNAMEREF:
1179 return(
BAD_CAST "[helper component] QName reference");
1180 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
1181 return(
BAD_CAST "[helper component] attribute use prohibition");
1183 return(
BAD_CAST "Not a schema component");
1194xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item)
1196 switch (
item->type) {
1197 case XML_SCHEMA_TYPE_BASIC:
1198 if (WXS_IS_COMPLEX(WXS_TYPE_CAST
item))
1199 return(
BAD_CAST "complex type definition");
1201 return(
BAD_CAST "simple type definition");
1203 return(xmlSchemaItemTypeToStr(
item->type));
1218xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr
item)
1220 switch (
item->type) {
1221 case XML_SCHEMA_TYPE_ELEMENT:
1222 return (((xmlSchemaElementPtr)
item)->
node);
1223 case XML_SCHEMA_TYPE_ATTRIBUTE:
1224 return (((xmlSchemaAttributePtr)
item)->
node);
1225 case XML_SCHEMA_TYPE_COMPLEX:
1226 case XML_SCHEMA_TYPE_SIMPLE:
1227 return (((xmlSchemaTypePtr)
item)->
node);
1228 case XML_SCHEMA_TYPE_ANY:
1229 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1230 return (((xmlSchemaWildcardPtr)
item)->
node);
1231 case XML_SCHEMA_TYPE_PARTICLE:
1232 return (((xmlSchemaParticlePtr)
item)->
node);
1233 case XML_SCHEMA_TYPE_SEQUENCE:
1234 case XML_SCHEMA_TYPE_CHOICE:
1235 case XML_SCHEMA_TYPE_ALL:
1236 return (((xmlSchemaModelGroupPtr)
item)->
node);
1237 case XML_SCHEMA_TYPE_GROUP:
1238 return (((xmlSchemaModelGroupDefPtr)
item)->
node);
1239 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1240 return (((xmlSchemaAttributeGroupPtr)
item)->
node);
1241 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1242 case XML_SCHEMA_TYPE_IDC_KEY:
1243 case XML_SCHEMA_TYPE_IDC_KEYREF:
1244 return (((xmlSchemaIDCPtr)
item)->
node);
1245 case XML_SCHEMA_EXTRA_QNAMEREF:
1246 return(((xmlSchemaQNameRefPtr)
item)->
node);
1251 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1252 return (((xmlSchemaAttributeUsePtr)
item)->
node);
1265static xmlSchemaBasicItemPtr
1266xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr
item)
1268 switch (
item->type) {
1269 case XML_SCHEMA_TYPE_ELEMENT:
1270 return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr)
item)->
next);
1271 case XML_SCHEMA_TYPE_ATTRIBUTE:
1272 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr)
item)->
next);
1273 case XML_SCHEMA_TYPE_COMPLEX:
1274 case XML_SCHEMA_TYPE_SIMPLE:
1275 return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr)
item)->
next);
1276 case XML_SCHEMA_TYPE_ANY:
1277 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1279 case XML_SCHEMA_TYPE_PARTICLE:
1280 return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr)
item)->
next);
1281 case XML_SCHEMA_TYPE_SEQUENCE:
1282 case XML_SCHEMA_TYPE_CHOICE:
1283 case XML_SCHEMA_TYPE_ALL:
1285 case XML_SCHEMA_TYPE_GROUP:
1287 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1288 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr)
item)->
next);
1289 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1290 case XML_SCHEMA_TYPE_IDC_KEY:
1291 case XML_SCHEMA_TYPE_IDC_KEYREF:
1292 return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr)
item)->
next);
1318 if (namespaceName !=
NULL) {
1323 if (localName !=
NULL) {
1324 if (namespaceName ==
NULL)
1337 return (xmlSchemaFormatQName(
buf,
ns->href, localName));
1339 return (xmlSchemaFormatQName(
buf,
NULL, localName));
1343xmlSchemaGetComponentName(xmlSchemaBasicItemPtr
item)
1348 switch (
item->type) {
1349 case XML_SCHEMA_TYPE_ELEMENT:
1350 return (((xmlSchemaElementPtr)
item)->
name);
1351 case XML_SCHEMA_TYPE_ATTRIBUTE:
1352 return (((xmlSchemaAttributePtr)
item)->
name);
1353 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1354 return (((xmlSchemaAttributeGroupPtr)
item)->
name);
1355 case XML_SCHEMA_TYPE_BASIC:
1356 case XML_SCHEMA_TYPE_SIMPLE:
1357 case XML_SCHEMA_TYPE_COMPLEX:
1358 return (((xmlSchemaTypePtr)
item)->
name);
1359 case XML_SCHEMA_TYPE_GROUP:
1360 return (((xmlSchemaModelGroupDefPtr)
item)->
name);
1361 case XML_SCHEMA_TYPE_IDC_KEY:
1362 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1363 case XML_SCHEMA_TYPE_IDC_KEYREF:
1364 return (((xmlSchemaIDCPtr)
item)->
name);
1365 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1366 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1367 return(xmlSchemaGetComponentName(
1368 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1371 case XML_SCHEMA_EXTRA_QNAMEREF:
1372 return (((xmlSchemaQNameRefPtr)
item)->
name);
1373 case XML_SCHEMA_TYPE_NOTATION:
1374 return (((xmlSchemaNotationPtr)
item)->
name);
1384#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
1385#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
1401xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr
item)
1406 switch (
item->type) {
1407 case XML_SCHEMA_TYPE_ELEMENT:
1408 return (((xmlSchemaElementPtr)
item)->targetNamespace);
1409 case XML_SCHEMA_TYPE_ATTRIBUTE:
1410 return (((xmlSchemaAttributePtr)
item)->targetNamespace);
1411 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1412 return (((xmlSchemaAttributeGroupPtr)
item)->targetNamespace);
1413 case XML_SCHEMA_TYPE_BASIC:
1414 return (
BAD_CAST "http://www.w3.org/2001/XMLSchema");
1415 case XML_SCHEMA_TYPE_SIMPLE:
1416 case XML_SCHEMA_TYPE_COMPLEX:
1417 return (((xmlSchemaTypePtr)
item)->targetNamespace);
1418 case XML_SCHEMA_TYPE_GROUP:
1419 return (((xmlSchemaModelGroupDefPtr)
item)->targetNamespace);
1420 case XML_SCHEMA_TYPE_IDC_KEY:
1421 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1422 case XML_SCHEMA_TYPE_IDC_KEYREF:
1423 return (((xmlSchemaIDCPtr)
item)->targetNamespace);
1424 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1425 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1426 return(xmlSchemaGetComponentTargetNs(
1427 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1431 case XML_SCHEMA_EXTRA_QNAMEREF:
1432 return (((xmlSchemaQNameRefPtr)
item)->targetNamespace);
1433 case XML_SCHEMA_TYPE_NOTATION:
1434 return (((xmlSchemaNotationPtr)
item)->targetNamespace);
1448 return (xmlSchemaFormatQName(
buf,
1449 xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr)
item),
1450 xmlSchemaGetComponentName((xmlSchemaBasicItemPtr)
item)));
1461 (xmlSchemaBasicItemPtr)
item));
1468xmlSchemaGetIDCDesignation(
xmlChar **
buf, xmlSchemaIDCPtr idc)
1470 return(xmlSchemaGetComponentDesignation(
buf, idc));
1481xmlSchemaWildcardPCToString(
int pc)
1484 case XML_SCHEMAS_ANY_SKIP:
1486 case XML_SCHEMAS_ANY_LAX:
1488 case XML_SCHEMAS_ANY_STRICT:
1491 return (
BAD_CAST "invalid process contents");
1509xmlSchemaGetCanonValueWhtspExt_1(xmlSchemaValPtr
val,
1510 xmlSchemaWhitespaceValueType ws,
1515 xmlSchemaValType valType;
1521 list = xmlSchemaValueGetNext(
val) ? 1 : 0;
1525 valType = xmlSchemaGetValType(
val);
1527 case XML_SCHEMAS_STRING:
1528 case XML_SCHEMAS_NORMSTRING:
1529 case XML_SCHEMAS_ANYSIMPLETYPE:
1530 value = xmlSchemaValueGetAsString(
val);
1532 if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
1533 value2 = xmlSchemaCollapseString(
value);
1534 else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
1535 value2 = xmlSchemaWhiteSpaceReplace(
value);
1541 if (xmlSchemaGetCanonValue(
val, &value2) == -1) {
1544 goto internal_error;
1546 if (for_hash && valType == XML_SCHEMAS_DECIMAL) {
1557 if (
len > 2 && value2[
len-1] ==
'0' && value2[
len-2] ==
'.')
1562 if (*retValue ==
NULL)
1573 FREE_AND_NULL(value2)
1574 val = xmlSchemaValueGetNext(
val);
1579 if (*retValue !=
NULL)
1587xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr
val,
1588 xmlSchemaWhitespaceValueType ws,
1591 return xmlSchemaGetCanonValueWhtspExt_1(
val, ws, retValue, 0);
1595xmlSchemaGetCanonValueHash(xmlSchemaValPtr
val,
1598 return xmlSchemaGetCanonValueWhtspExt_1(
val, XML_SCHEMA_WHITESPACE_COLLAPSE,
1631 xmlSchemaBasicItemPtr
item,
1642 if (itemDes !=
NULL) {
1645 switch (
item->type) {
1646 case XML_SCHEMA_TYPE_BASIC: {
1647 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1649 if (WXS_IS_ATOMIC(
type))
1651 else if (WXS_IS_LIST(
type))
1653 else if (WXS_IS_UNION(
type))
1661 case XML_SCHEMA_TYPE_SIMPLE: {
1662 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1664 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1669 if (WXS_IS_ATOMIC(
type))
1671 else if (WXS_IS_LIST(
type))
1673 else if (WXS_IS_UNION(
type))
1677 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1684 case XML_SCHEMA_TYPE_COMPLEX: {
1685 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1687 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL)
1692 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1699 case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
1700 xmlSchemaAttributeUsePtr ause;
1702 ause = WXS_ATTR_USE_CAST
item;
1704 if (WXS_ATTRUSE_DECL(ause) !=
NULL) {
1707 xmlSchemaGetComponentQName(&
str, WXS_ATTRUSE_DECL(ause)));
1715 case XML_SCHEMA_TYPE_ATTRIBUTE: {
1716 xmlSchemaAttributePtr
attr;
1718 attr = (xmlSchemaAttributePtr)
item;
1727 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1728 xmlSchemaGetComponentDesignation(
buf,
item);
1730 case XML_SCHEMA_TYPE_ELEMENT: {
1731 xmlSchemaElementPtr
elem;
1737 elem->targetNamespace,
elem->name));
1741 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1742 case XML_SCHEMA_TYPE_IDC_KEY:
1743 case XML_SCHEMA_TYPE_IDC_KEYREF:
1744 if (
item->type == XML_SCHEMA_TYPE_IDC_UNIQUE)
1746 else if (
item->type == XML_SCHEMA_TYPE_IDC_KEY)
1753 case XML_SCHEMA_TYPE_ANY:
1754 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1756 ((xmlSchemaWildcardPtr)
item)->processContents));
1759 case XML_SCHEMA_FACET_MININCLUSIVE:
1760 case XML_SCHEMA_FACET_MINEXCLUSIVE:
1761 case XML_SCHEMA_FACET_MAXINCLUSIVE:
1762 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
1763 case XML_SCHEMA_FACET_TOTALDIGITS:
1764 case XML_SCHEMA_FACET_FRACTIONDIGITS:
1765 case XML_SCHEMA_FACET_PATTERN:
1766 case XML_SCHEMA_FACET_ENUMERATION:
1767 case XML_SCHEMA_FACET_WHITESPACE:
1768 case XML_SCHEMA_FACET_LENGTH:
1769 case XML_SCHEMA_FACET_MAXLENGTH:
1770 case XML_SCHEMA_FACET_MINLENGTH:
1775 case XML_SCHEMA_TYPE_GROUP: {
1783 case XML_SCHEMA_TYPE_SEQUENCE:
1784 case XML_SCHEMA_TYPE_CHOICE:
1785 case XML_SCHEMA_TYPE_ALL:
1786 case XML_SCHEMA_TYPE_PARTICLE:
1789 case XML_SCHEMA_TYPE_NOTATION: {
1803 if ((named == 0) && (itemNode !=
NULL)) {
1813 xmlSchemaFormatQName(&
str,
elem->ns->href,
elem->name));
1822 if (itemNode->
ns !=
NULL) {
1845xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
1848 xmlSchemaFacetPtr facet;
1849 xmlSchemaWhitespaceValueType
ws;
1861 ws = xmlSchemaGetWhiteSpaceFacetValue(
type->baseType);
1862 for (facet =
type->facets; facet !=
NULL; facet = facet->
next) {
1863 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
1866 res = xmlSchemaGetCanonValueWhtspExt(facet->val,
1869 xmlSchemaInternalErr(actxt,
1870 "xmlSchemaFormatFacetEnumSet",
1871 "compute the canonical lexical representation");
1897 }
while ((
type !=
NULL) && (
type->type != XML_SCHEMA_TYPE_BASIC));
1910xmlSchemaErrMemory(
const char *
msg)
1918xmlSchemaPSimpleErr(
const char *
msg)
1932xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
1963 channel = ctxt->error;
1964 data = ctxt->errCtxt;
1965 schannel = ctxt->serror;
1969 (
const char *) str1, (
const char *) str2,
NULL, 0, 0,
2029 channel = ctxt->error;
2030 data = ctxt->errCtxt;
2031 schannel = ctxt->serror;
2035 (
const char *) strData1, (
const char *) strData2,
2036 (
const char *) strData3, 0, 0,
msg, str1, str2,
2054xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
2070 msg, (
const char *)
str);
2073#define WXS_ERROR_TYPE_ERROR 1
2074#define WXS_ERROR_TYPE_WARNING 2
2091xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
2102 if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2103 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
2109 channel = vctxt->error;
2111 channel = vctxt->warning;
2113 schannel = vctxt->serror;
2114 data = vctxt->errCtxt;
2122 (vctxt->depth >= 0) &&
2123 (vctxt->inode !=
NULL)) {
2124 node = vctxt->inode->node;
2130 (vctxt->parserCtxt !=
NULL) &&
2131 (vctxt->parserCtxt->input !=
NULL)) {
2132 file = vctxt->parserCtxt->input->filename;
2133 line = vctxt->parserCtxt->input->line;
2134 col = vctxt->parserCtxt->input->col;
2145 if (vctxt->doc !=
NULL)
2146 file = (
const char *) vctxt->doc->URL;
2147 else if ((vctxt->parserCtxt !=
NULL) &&
2148 (vctxt->parserCtxt->input !=
NULL))
2149 file = vctxt->parserCtxt->input->filename;
2151 if (vctxt->locFunc !=
NULL) {
2155 vctxt->locFunc(vctxt->locCtxt, &
f, &
l);
2163 file = vctxt->filename;
2165 __xmlRaiseError(schannel, channel,
data, ctxt,
2168 (
const char *) str1, (
const char *) str2,
2169 (
const char *) str3, 0, col,
msg, str1, str2, str3, str4);
2171 }
else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
2172 xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
2176 channel = pctxt->error;
2178 channel = pctxt->warning;
2180 schannel = pctxt->serror;
2181 data = pctxt->errCtxt;
2182 __xmlRaiseError(schannel, channel,
data, ctxt,
2184 errorLevel,
NULL, 0,
2185 (
const char *) str1, (
const char *) str2,
2186 (
const char *) str3, 0, 0,
msg, str1, str2, str3, str4);
2206xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
2215xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
2221 msg, str1, str2, str3, str4);
2225xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
2234 xmlSchemaAbstractCtxtPtr actxt,
2280 }
else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2281 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
2286 xmlSchemaNodeInfoPtr ielem =
2287 vctxt->elemInfos[vctxt->depth];
2291 ielem->nsName, ielem->localName));
2299 vctxt->inode->nsName, vctxt->inode->localName));
2302 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
2336xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
2337 const char *funcName,
2350 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
2352 (
const char *)
msg, (
const xmlChar *) funcName, str1, str2);
2353 else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
2355 (
const char *)
msg, (
const xmlChar *) funcName, str1, str2);
2361xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
2362 const char *funcName,
2370xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
2371 const char *funcName,
2376 xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName,
message,
2382xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
2385 xmlSchemaBasicItemPtr
item,
2393 (actxt->type == XML_SCHEMA_CTXT_PARSER)) {
2398 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2402 (
const char *)
msg, str1, str2, str3, str4);
2407xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
2410 xmlSchemaBasicItemPtr
item,
2422xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
2433 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2439 (
const char *)
msg, str1, str2, str3,
NULL);
2447xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
2449 xmlSchemaPSVIIDCNodePtr idcNode,
2462 xmlSchemaFormatQName(&qname,
2463 vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
2464 vctxt->nodeQNames->items[idcNode->nodeQNameID]),
2466 FREE_AND_NULL(qname);
2471xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
2475 return (
node->type);
2476 if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
2477 (((xmlSchemaValidCtxtPtr) actxt)->inode !=
NULL))
2478 return ( ((xmlSchemaValidCtxtPtr) actxt)->
inode->nodeType);
2483xmlSchemaIsGlobalItem(xmlSchemaTypePtr
item)
2485 switch (
item->type) {
2486 case XML_SCHEMA_TYPE_COMPLEX:
2487 case XML_SCHEMA_TYPE_SIMPLE:
2488 if (
item->flags & XML_SCHEMAS_TYPE_GLOBAL)
2491 case XML_SCHEMA_TYPE_GROUP:
2493 case XML_SCHEMA_TYPE_ELEMENT:
2494 if ( ((xmlSchemaElementPtr)
item)->
flags &
2495 XML_SCHEMAS_ELEM_GLOBAL)
2498 case XML_SCHEMA_TYPE_ATTRIBUTE:
2499 if ( ((xmlSchemaAttributePtr)
item)->
flags &
2500 XML_SCHEMAS_ATTR_GLOBAL)
2511xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2515 xmlSchemaTypePtr
type,
2520 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2522 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2529 if (! xmlSchemaIsGlobalItem(
type))
2534 if (WXS_IS_ATOMIC(
type))
2536 else if (WXS_IS_LIST(
type))
2538 else if (WXS_IS_UNION(
type))
2541 if (xmlSchemaIsGlobalItem(
type)) {
2544 if (
type->builtInType != 0) {
2548 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
2557 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2567 xmlSchemaNodeInfoPtr
ni,
2572 return (xmlSchemaFormatQName(
str,
node->ns->href,
node->name));
2574 return (xmlSchemaFormatQName(
str,
NULL,
node->name));
2576 return (xmlSchemaFormatQName(
str,
ni->nsName,
ni->localName));
2581xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
2583 xmlSchemaAttrInfoPtr
ni,
2588 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2591 xmlSchemaFormatErrorNodeQName(&
str, (xmlSchemaNodeInfoPtr)
ni,
node),
2598xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2612 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2620 if (nbval + nbneg > 0) {
2621 if (nbval + nbneg > 1) {
2627 for (
i = 0;
i < nbval + nbneg;
i++) {
2631 if ((
cur[0] ==
'n') && (
cur[1] ==
'o') && (
cur[2] ==
't') &&
2646 while ((*
end != 0) && (*
end !=
'|'))
2656 if ((nbneg == 0) || (*
end !=
'*') || (*localName !=
'*')) {
2676 FREE_AND_NULL(nsName)
2678 FREE_AND_NULL(localName);
2683 FREE_AND_NULL(localName);
2685 if (
i < nbval + nbneg -1)
2698xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
2703 xmlSchemaTypePtr
type,
2704 xmlSchemaFacetPtr facet,
2710 xmlSchemaTypeType facetType;
2711 int nodeType = xmlSchemaEvalErrorNodeType(actxt,
node);
2713 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2715 facetType = XML_SCHEMA_FACET_ENUMERATION;
2721 facetType = facet->type;
2730 if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
2731 (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
2732 (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
2734 char len[25], actLen[25];
2744 snprintf(
len, 24,
"%lu", xmlSchemaGetFacetValueAsULong(facet));
2747 if (facetType == XML_SCHEMA_FACET_LENGTH)
2749 BAD_CAST "this differs from the allowed length of '%s'.\n");
2750 else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
2752 BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
2753 else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
2755 BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
2764 }
else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
2766 "of the set {%s}.\n");
2768 xmlSchemaFormatFacetEnumSet(actxt, &
str,
type));
2769 }
else if (facetType == XML_SCHEMA_FACET_PATTERN) {
2771 "by the pattern '%s'.\n");
2774 }
else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
2776 "minimum value allowed ('%s').\n");
2779 }
else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
2781 "maximum value allowed ('%s').\n");
2784 }
else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
2789 }
else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
2794 }
else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
2796 "digits than are allowed ('%s').\n");
2799 }
else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
2801 "digits than are allowed ('%s').\n");
2814 xmlSchemaErr(actxt,
error,
node, (
const char *)
msg, str1, str2);
2820#define VERROR(err, type, msg) \
2821 xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
2823#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
2825#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
2826#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
2828#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
2842xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
2844 xmlSchemaBasicItemPtr ownerItem,
2851 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2856 xmlSchemaPErr(ctxt, ownerElem,
error,
2857 "%s: The attribute '%s' is required but missing.\n",
2878xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
2880 xmlSchemaBasicItemPtr ownerItem,
2885 xmlSchemaTypeType refType,
2886 const char *refTypeStr)
2890 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2891 if (refTypeStr ==
NULL)
2892 refTypeStr = (
const char *) xmlSchemaItemTypeToStr(refType);
2893 xmlSchemaPErrExt(ctxt, ownerElem,
error,
2895 "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
2897 xmlSchemaFormatQName(&
strA, refURI, refName),
2914xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
2917 xmlSchemaBasicItemPtr ownerItem,
2923 if (ownerDes ==
NULL)
2924 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem,
attr->parent);
2925 else if (*ownerDes ==
NULL) {
2926 xmlSchemaFormatItemForReport(ownerDes,
NULL, ownerItem,
attr->parent);
2932 "%s, attribute '%s': %s.\n",
2937 "%s, attribute '%s': %s.\n",
2940 if (ownerDes ==
NULL)
2954xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
2961 xmlSchemaFormatNodeForError(&
strA, ACTXT_CAST ctxt,
attr->parent);
2963 "%sThe attribute '%s' is not allowed.\n",
BAD_CAST strA,
2966 FREE_AND_NULL(
strA);
2967 FREE_AND_NULL(strB);
2985xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
2987 xmlSchemaBasicItemPtr
item,
2996 xmlSchemaFormatItemForReport(&
des,
NULL,
item, itemElem);
3001 itemElem = WXS_ITEM_NODE(
item);
3021xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
3023 xmlSchemaBasicItemPtr
item,
3046xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
3049 xmlSchemaBasicItemPtr ownerItem,
3050 const xmlSchemaAttributeUsePtr attruse,
3057 xmlSchemaFormatItemForReport(&
msg,
NULL, ownerItem,
NULL);
3061 WXS_BASIC_CAST attruse,
NULL));
3066 xmlSchemaErr4(ACTXT_CAST ctxt,
error,
node,
3067 (
const char *)
msg, str1, str2, str3, str4);
3082xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
3084 xmlSchemaTypePtr
type,
3085 xmlSchemaTypePtr baseType,
3086 xmlSchemaFacetPtr facet)
3090 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
type->node);
3092 "%s: The facet '%s' is not allowed on types derived from the "
3094 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
3095 xmlSchemaFormatItemForReport(&strT,
NULL, WXS_BASIC_CAST baseType,
NULL),
3098 FREE_AND_NULL(strT);
3112xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
3114 xmlSchemaTypePtr
type,
3115 xmlSchemaFacetPtr facet)
3119 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
3122 "%s: The facet '%s' is not allowed.\n",
3123 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
3138xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
3140 xmlSchemaBasicItemPtr ownerItem,
3147 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST ownerItem,
attr->parent);
3149 "%s: The attributes '%s' and '%s' are mutually exclusive.\n",
3167xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
3171 xmlSchemaTypePtr
type,
3180 xmlSchemaFormatNodeForError(&
msg, ACTXT_CAST ctxt,
node);
3191 if (! xmlSchemaIsGlobalItem(
type))
3196 if (WXS_IS_ATOMIC(
type))
3198 else if (WXS_IS_LIST(
type))
3200 else if (WXS_IS_UNION(
type))
3203 if (xmlSchemaIsGlobalItem(
type)) {
3206 if (
type->builtInType != 0) {
3210 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
3229 FREE_AND_NULL(expectedEscaped);
3260xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
3262 xmlSchemaBasicItemPtr ownerItem,
3270 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
3272 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3277 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3278 "%s: The content is not valid. Expected is %s.\n",
3281 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3282 "%s: The content is not valid.\n",
3320xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
3326 xmlSchemaPErrMemory(ctxt,
"allocating schema",
NULL);
3330 ret->dict = ctxt->dict;
3344xmlSchemaNewFacet(
void)
3346 xmlSchemaFacetPtr
ret;
3348 ret = (xmlSchemaFacetPtr)
xmlMalloc(
sizeof(xmlSchemaFacet));
3366static xmlSchemaAnnotPtr
3369 xmlSchemaAnnotPtr
ret;
3371 ret = (xmlSchemaAnnotPtr)
xmlMalloc(
sizeof(xmlSchemaAnnot));
3373 xmlSchemaPErrMemory(ctxt,
"allocating annotation",
node);
3381static xmlSchemaItemListPtr
3382xmlSchemaItemListCreate(
void)
3384 xmlSchemaItemListPtr
ret;
3388 xmlSchemaPErrMemory(
NULL,
3389 "allocating an item list structure",
NULL);
3392 memset(
ret, 0,
sizeof(xmlSchemaItemList));
3397xmlSchemaItemListClear(xmlSchemaItemListPtr
list)
3404 list->sizeItems = 0;
3408xmlSchemaItemListAdd(xmlSchemaItemListPtr
list,
void *
item)
3412 20 *
sizeof(
void *));
3414 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3417 list->sizeItems = 20;
3418 }
else if (
list->sizeItems <=
list->nbItems) {
3419 list->sizeItems *= 2;
3421 list->sizeItems *
sizeof(
void *));
3423 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3424 list->sizeItems = 0;
3433xmlSchemaItemListAddSize(xmlSchemaItemListPtr
list,
3438 if (initialSize <= 0)
3441 initialSize *
sizeof(
void *));
3443 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3446 list->sizeItems = initialSize;
3447 }
else if (
list->sizeItems <=
list->nbItems) {
3448 list->sizeItems *= 2;
3450 list->sizeItems *
sizeof(
void *));
3452 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3453 list->sizeItems = 0;
3462xmlSchemaItemListInsert(xmlSchemaItemListPtr
list,
void *
item,
int idx)
3466 20 *
sizeof(
void *));
3468 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3471 list->sizeItems = 20;
3472 }
else if (
list->sizeItems <=
list->nbItems) {
3473 list->sizeItems *= 2;
3475 list->sizeItems *
sizeof(
void *));
3477 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3478 list->sizeItems = 0;
3499xmlSchemaItemListInsertSize(xmlSchemaItemListPtr
list,
3505 if (initialSize <= 0)
3508 initialSize *
sizeof(
void *));
3510 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3513 list->sizeItems = initialSize;
3514 }
else if (
list->sizeItems <=
list->nbItems) {
3515 list->sizeItems *= 2;
3517 list->sizeItems *
sizeof(
void *));
3519 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3520 list->sizeItems = 0;
3541xmlSchemaItemListRemove(xmlSchemaItemListPtr
list,
int idx)
3545 xmlSchemaPSimpleErr(
"Internal error: xmlSchemaItemListRemove, "
3550 if (
list->nbItems == 1) {
3555 list->sizeItems = 0;
3556 }
else if (
list->nbItems -1 ==
idx) {
3573xmlSchemaItemListFree(xmlSchemaItemListPtr
list)
3583xmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
3587 if (bucket->globals !=
NULL) {
3588 xmlSchemaComponentListFree(bucket->globals);
3589 xmlSchemaItemListFree(bucket->globals);
3591 if (bucket->locals !=
NULL) {
3592 xmlSchemaComponentListFree(bucket->locals);
3593 xmlSchemaItemListFree(bucket->locals);
3595 if (bucket->relations !=
NULL) {
3596 xmlSchemaSchemaRelationPtr prev,
cur = bucket->relations;
3603 if ((! bucket->preserveDoc) && (bucket->doc !=
NULL)) {
3606 if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
3608 xmlSchemaFree(WXS_IMPBUCKET(bucket)->
schema);
3616 xmlSchemaBucketFree((xmlSchemaBucketPtr) bucket);
3619static xmlSchemaBucketPtr
3620xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
3623 xmlSchemaBucketPtr
ret;
3625 xmlSchemaPtr mainSchema;
3627 if (WXS_CONSTRUCTOR(pctxt)->mainSchema ==
NULL) {
3628 PERROR_INT(
"xmlSchemaBucketCreate",
3629 "no main schema on constructor");
3632 mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
3634 if (WXS_IS_BUCKET_INCREDEF(
type))
3635 size =
sizeof(xmlSchemaInclude);
3637 size =
sizeof(xmlSchemaImport);
3640 xmlSchemaPErrMemory(
NULL,
"allocating schema bucket",
NULL);
3644 ret->targetNamespace = targetNamespace;
3646 ret->globals = xmlSchemaItemListCreate();
3651 ret->locals = xmlSchemaItemListCreate();
3663 if (! WXS_HAS_BUCKETS(pctxt)) {
3664 if (WXS_IS_BUCKET_INCREDEF(
type)) {
3665 PERROR_INT(
"xmlSchemaBucketCreate",
3666 "first bucket but it's an include or redefine");
3667 xmlSchemaBucketFree(
ret);
3671 ret->type = XML_SCHEMA_SCHEMA_MAIN;
3673 WXS_CONSTRUCTOR(pctxt)->mainBucket =
ret;
3674 WXS_IMPBUCKET(
ret)->schema = mainSchema;
3678 mainSchema->targetNamespace = targetNamespace;
3680 if (
type == XML_SCHEMA_SCHEMA_MAIN) {
3681 PERROR_INT(
"xmlSchemaBucketCreate",
3682 "main bucket but it's not the first one");
3683 xmlSchemaBucketFree(
ret);
3685 }
else if (
type == XML_SCHEMA_SCHEMA_IMPORT) {
3690 WXS_IMPBUCKET(
ret)->schema = xmlSchemaNewSchema(pctxt);
3692 xmlSchemaBucketFree(
ret);
3695 WXS_IMPBUCKET(
ret)->schema->targetNamespace = targetNamespace;
3698 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
3705 if (mainSchema->schemasImports ==
NULL) {
3707 WXS_CONSTRUCTOR(pctxt)->dict);
3708 if (mainSchema->schemasImports ==
NULL) {
3709 xmlSchemaBucketFree(
ret);
3713 if (targetNamespace ==
NULL)
3715 XML_SCHEMAS_NO_NAMESPACE,
ret);
3718 targetNamespace,
ret);
3720 PERROR_INT(
"xmlSchemaBucketCreate",
3721 "failed to add the schema bucket to the hash");
3722 xmlSchemaBucketFree(
ret);
3727 if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
3728 WXS_INCBUCKET(
ret)->ownerImport =
3729 WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
3731 WXS_INCBUCKET(
ret)->ownerImport =
3732 WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
3735 if (mainSchema->includes ==
NULL) {
3736 mainSchema->includes = xmlSchemaItemListCreate();
3737 if (mainSchema->includes ==
NULL) {
3738 xmlSchemaBucketFree(
ret);
3742 xmlSchemaItemListAdd(mainSchema->includes,
ret);
3748 if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->
buckets,
ret) == -1)
3754xmlSchemaAddItemSize(xmlSchemaItemListPtr *
list,
int initialSize,
void *
item)
3757 *
list = xmlSchemaItemListCreate();
3761 xmlSchemaItemListAddSize(*
list, initialSize,
item);
3772xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
3776 if (annot->next ==
NULL) {
3779 xmlSchemaAnnotPtr prev;
3783 annot = annot->next;
3785 }
while (annot !=
NULL);
3796xmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
3810xmlSchemaFreeAttribute(xmlSchemaAttributePtr
attr)
3815 xmlSchemaFreeAnnot(
attr->annot);
3817 xmlSchemaFreeValue(
attr->defVal);
3828xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
3832 if (use->annot !=
NULL)
3833 xmlSchemaFreeAnnot(use->annot);
3834 if (use->defVal !=
NULL)
3835 xmlSchemaFreeValue(use->defVal);
3846xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
3860xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr
set)
3862 xmlSchemaWildcardNsPtr
next;
3878xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
3880 if (wildcard ==
NULL)
3882 if (wildcard->annot !=
NULL)
3883 xmlSchemaFreeAnnot(wildcard->annot);
3884 if (wildcard->nsSet !=
NULL)
3885 xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
3886 if (wildcard->negNsSet !=
NULL)
3898xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
3902 if (attrGr->annot !=
NULL)
3903 xmlSchemaFreeAnnot(attrGr->annot);
3904 if (attrGr->attrUses !=
NULL)
3905 xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
3916xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr
item)
3928xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr
link)
3930 xmlSchemaTypeLinkPtr
next;
3940xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
3942 xmlSchemaIDCStateObjPtr
next;
3943 while (sto !=
NULL) {
3945 if (sto->history !=
NULL)
3947 if (sto->xpathCtxt !=
NULL)
3948 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
3961xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
3963 xmlSchemaIDCSelectPtr
cur, prev;
3967 if (idcDef->annot !=
NULL)
3968 xmlSchemaFreeAnnot(idcDef->annot);
3970 if (idcDef->selector !=
NULL) {
3971 if (idcDef->selector->xpathComp !=
NULL)
3972 xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
3976 if (idcDef->fields !=
NULL) {
3977 cur = idcDef->fields;
3981 if (prev->xpathComp !=
NULL)
3982 xmlFreePattern((xmlPatternPtr) prev->xpathComp);
3996xmlSchemaFreeElement(xmlSchemaElementPtr
elem)
4001 xmlSchemaFreeAnnot(
elem->annot);
4003 xmlRegFreeRegexp(
elem->contModel);
4005 xmlSchemaFreeValue(
elem->defVal);
4016xmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
4020 if (facet->val !=
NULL)
4021 xmlSchemaFreeValue(facet->val);
4022 if (facet->regexp !=
NULL)
4023 xmlRegFreeRegexp(facet->regexp);
4024 if (facet->annot !=
NULL)
4025 xmlSchemaFreeAnnot(facet->annot);
4036xmlSchemaFreeType(xmlSchemaTypePtr
type)
4041 xmlSchemaFreeAnnot(
type->annot);
4043 xmlSchemaFacetPtr facet,
next;
4045 facet =
type->facets;
4046 while (facet !=
NULL) {
4048 xmlSchemaFreeFacet(facet);
4053 xmlSchemaItemListFree((xmlSchemaItemListPtr)
type->attrUses);
4055 xmlSchemaFreeTypeLinkList(
type->memberTypes);
4067 xmlRegFreeRegexp(
type->contModel);
4078xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr
item)
4081 xmlSchemaFreeAnnot(
item->annot);
4092xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr
item)
4095 xmlSchemaFreeAnnot(
item->annot);
4100xmlSchemaComponentListFree(xmlSchemaItemListPtr
list)
4105 xmlSchemaTreeItemPtr
item;
4106 xmlSchemaTreeItemPtr *
items = (xmlSchemaTreeItemPtr *)
list->items;
4113 switch (
item->type) {
4114 case XML_SCHEMA_TYPE_SIMPLE:
4115 case XML_SCHEMA_TYPE_COMPLEX:
4116 xmlSchemaFreeType((xmlSchemaTypePtr)
item);
4118 case XML_SCHEMA_TYPE_ATTRIBUTE:
4119 xmlSchemaFreeAttribute((xmlSchemaAttributePtr)
item);
4121 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
4122 xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr)
item);
4124 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
4125 xmlSchemaFreeAttributeUseProhib(
4126 (xmlSchemaAttributeUseProhibPtr)
item);
4128 case XML_SCHEMA_TYPE_ELEMENT:
4129 xmlSchemaFreeElement((xmlSchemaElementPtr)
item);
4131 case XML_SCHEMA_TYPE_PARTICLE:
4133 xmlSchemaFreeAnnot(
item->annot);
4136 case XML_SCHEMA_TYPE_SEQUENCE:
4137 case XML_SCHEMA_TYPE_CHOICE:
4138 case XML_SCHEMA_TYPE_ALL:
4139 xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr)
item);
4141 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
4142 xmlSchemaFreeAttributeGroup(
4143 (xmlSchemaAttributeGroupPtr)
item);
4145 case XML_SCHEMA_TYPE_GROUP:
4146 xmlSchemaFreeModelGroupDef(
4147 (xmlSchemaModelGroupDefPtr)
item);
4149 case XML_SCHEMA_TYPE_ANY:
4150 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
4151 xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
item);
4153 case XML_SCHEMA_TYPE_IDC_KEY:
4154 case XML_SCHEMA_TYPE_IDC_UNIQUE:
4155 case XML_SCHEMA_TYPE_IDC_KEYREF:
4156 xmlSchemaFreeIDC((xmlSchemaIDCPtr)
item);
4158 case XML_SCHEMA_TYPE_NOTATION:
4159 xmlSchemaFreeNotation((xmlSchemaNotationPtr)
item);
4161 case XML_SCHEMA_EXTRA_QNAMEREF:
4162 xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr)
item);
4166 xmlSchemaPSimpleInternalErr(
NULL,
4167 "Internal error: xmlSchemaComponentListFree, "
4168 "unexpected component type '%s'\n",
4185xmlSchemaFree(xmlSchemaPtr
schema)
4215 xmlSchemaItemListPtr
list = (xmlSchemaItemListPtr)
schema->includes;
4218 xmlSchemaBucketFree((xmlSchemaBucketPtr)
list->items[
i]);
4220 xmlSchemaItemListFree(
list);
4223 xmlSchemaFreeAnnot(
schema->annot);
4236#ifdef LIBXML_OUTPUT_ENABLED
4239xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output);
4249xmlSchemaElementDump(
void *payload,
void *
data,
4254 xmlSchemaElementPtr
elem = (xmlSchemaElementPtr) payload;
4261 if (
elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
4264 if (
namespace !=
NULL)
4265 fprintf(output,
"ns '%s'",
namespace);
4268 if ((
elem->minOccurs != 1) || (
elem->maxOccurs != 1)) {
4270 if (
elem->maxOccurs >= UNBOUNDED)
4271 fprintf(output,
"max: unbounded\n");
4272 else if (
elem->maxOccurs != 1)
4281 if ((
elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
4282 (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
4283 (
elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
4284 (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
4286 if (
elem->flags & XML_SCHEMAS_ELEM_FIXED)
4288 if (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
4289 fprintf(output,
"[default] ");
4290 if (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
4291 fprintf(output,
"[abstract] ");
4292 if (
elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
4293 fprintf(output,
"[nillable] ");
4310 }
else if (
elem->subtypes !=
NULL) {
4314 xmlSchemaTypeDump(
elem->subtypes, output);
4320 fprintf(output,
" substitutionGroup: '%s' ",
elem->substGroup);
4336xmlSchemaAnnotDump(
FILE * output, xmlSchemaAnnotPtr annot)
4348 fprintf(output,
" Annot: empty\n");
4360xmlSchemaContentModelDump(xmlSchemaParticlePtr particle,
FILE * output,
int depth)
4363 xmlSchemaTreeItemPtr term;
4367 if (particle ==
NULL)
4369 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
4373 if (particle->children ==
NULL) {
4374 fprintf(output,
"MISSING particle term\n");
4377 term = particle->children;
4381 switch (term->type) {
4382 case XML_SCHEMA_TYPE_ELEMENT:
4383 fprintf(output,
"ELEM '%s'", xmlSchemaFormatQName(&
str,
4384 ((xmlSchemaElementPtr)term)->targetNamespace,
4385 ((xmlSchemaElementPtr)term)->
name));
4388 case XML_SCHEMA_TYPE_SEQUENCE:
4391 case XML_SCHEMA_TYPE_CHOICE:
4394 case XML_SCHEMA_TYPE_ALL:
4397 case XML_SCHEMA_TYPE_ANY:
4405 if (particle->minOccurs != 1)
4406 fprintf(output,
" min: %d", particle->minOccurs);
4407 if (particle->maxOccurs >= UNBOUNDED)
4408 fprintf(output,
" max: unbounded");
4409 else if (particle->maxOccurs != 1)
4410 fprintf(output,
" max: %d", particle->maxOccurs);
4413 ((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
4414 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
4415 (term->type == XML_SCHEMA_TYPE_ALL)) &&
4416 (term->children !=
NULL)) {
4417 xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
4420 if (particle->next !=
NULL)
4421 xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
4433xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses,
FILE * output)
4435 xmlSchemaAttributeUsePtr use;
4436 xmlSchemaAttributeUseProhibPtr prohib;
4437 xmlSchemaQNameRefPtr
ref;
4442 if ((uses ==
NULL) || (uses->nbItems == 0))
4445 fprintf(output,
" attributes:\n");
4446 for (
i = 0;
i < uses->nbItems;
i++) {
4447 use = uses->items[
i];
4448 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
4449 fprintf(output,
" [prohibition] ");
4450 prohib = (xmlSchemaAttributeUseProhibPtr) use;
4452 tns = prohib->targetNamespace;
4453 }
else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
4454 fprintf(output,
" [reference] ");
4455 ref = (xmlSchemaQNameRefPtr) use;
4457 tns =
ref->targetNamespace;
4460 name = WXS_ATTRUSE_DECL_NAME(use);
4461 tns = WXS_ATTRUSE_DECL_TNS(use);
4464 (
const char *) xmlSchemaFormatQName(&
str, tns,
name));
4477xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output)
4480 fprintf(output,
"Type: NULL\n");
4487 fprintf(output,
"(no name) ");
4489 fprintf(output,
"ns '%s' ",
type->targetNamespace);
4490 switch (
type->type) {
4491 case XML_SCHEMA_TYPE_BASIC:
4494 case XML_SCHEMA_TYPE_SIMPLE:
4497 case XML_SCHEMA_TYPE_COMPLEX:
4498 fprintf(output,
"[complex] ");
4500 case XML_SCHEMA_TYPE_SEQUENCE:
4501 fprintf(output,
"[sequence] ");
4503 case XML_SCHEMA_TYPE_CHOICE:
4506 case XML_SCHEMA_TYPE_ALL:
4509 case XML_SCHEMA_TYPE_UR:
4512 case XML_SCHEMA_TYPE_RESTRICTION:
4513 fprintf(output,
"[restriction] ");
4515 case XML_SCHEMA_TYPE_EXTENSION:
4516 fprintf(output,
"[extension] ");
4519 fprintf(output,
"[unknown type %d] ",
type->type);
4523 switch (
type->contentType) {
4524 case XML_SCHEMA_CONTENT_UNKNOWN:
4525 fprintf(output,
"[unknown] ");
4527 case XML_SCHEMA_CONTENT_EMPTY:
4530 case XML_SCHEMA_CONTENT_ELEMENTS:
4531 fprintf(output,
"[element] ");
4533 case XML_SCHEMA_CONTENT_MIXED:
4536 case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
4539 case XML_SCHEMA_CONTENT_BASIC:
4542 case XML_SCHEMA_CONTENT_SIMPLE:
4545 case XML_SCHEMA_CONTENT_ANY:
4558 xmlSchemaAttrUsesDump(
type->attrUses, output);
4560 xmlSchemaAnnotDump(output,
type->annot);
4561#ifdef DUMP_CONTENT_MODEL
4562 if ((
type->type == XML_SCHEMA_TYPE_COMPLEX) &&
4564 xmlSchemaContentModelDump((xmlSchemaParticlePtr)
type->subtypes,
4571xmlSchemaTypeDumpEntry(
void *
type,
void *output,
4574 xmlSchemaTypeDump((xmlSchemaTypePtr)
type, (
FILE *) output);
4585xmlSchemaDump(
FILE * output, xmlSchemaPtr
schema)
4590 fprintf(output,
"Schemas: NULL\n");
4599 fprintf(output,
"%s", (
const char *)
schema->targetNamespace);
4601 fprintf(output,
"no target namespace");
4604 xmlSchemaAnnotDump(output,
schema->annot);
4609#ifdef DEBUG_IDC_NODE_TABLE
4617xmlSchemaDebugDumpIDCTable(
FILE * output,
4620 xmlSchemaPSVIIDCBindingPtr
bind)
4624 xmlSchemaPSVIIDCNodePtr
tab;
4625 xmlSchemaPSVIIDCKeyPtr
key;
4628 fprintf(output,
"IDC: TABLES on '%s'\n",
4629 xmlSchemaFormatQName(&
str, namespaceName, localName));
4635 fprintf(output,
"IDC: BINDING '%s' (%d)\n",
4636 xmlSchemaGetComponentQName(&
str,
4639 for (
i = 0;
i <
bind->nbNodes;
i++) {
4642 for (
j = 0;
j <
bind->definition->nbFields;
j++) {
4649 fprintf(output,
"CANON-VALUE-FAILED ");
4651 FREE_AND_NULL(
value)
4653 fprintf(output,
"(no val), ");
4655 fprintf(output,
"(key missing), ");
4659 if (
bind->dupls &&
bind->dupls->nbItems) {
4660 fprintf(output,
"IDC: dupls (%d):\n",
bind->dupls->nbItems);
4661 for (
i = 0;
i <
bind->dupls->nbItems;
i++) {
4664 for (
j = 0;
j <
bind->definition->nbFields;
j++) {
4671 fprintf(output,
"CANON-VALUE-FAILED ");
4673 FREE_AND_NULL(
value)
4675 fprintf(output,
"(no val), ");
4677 fprintf(output,
"(key missing), ");
4711 prop =
node->properties;
4712 while (prop !=
NULL) {
4738 prop =
node->properties;
4739 while (prop !=
NULL) {
4740 if ((prop->
ns !=
NULL) &&
4750xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt,
xmlNodePtr node)
4800#define WXS_FIND_GLOBAL_ITEM(slot) \
4801 if (xmlStrEqual(nsName, schema->targetNamespace)) { \
4802 ret = xmlHashLookup(schema->slot, name); \
4803 if (ret != NULL) goto exit; \
4805 if (xmlHashSize(schema->schemasImports) > 1) { \
4806 xmlSchemaImportPtr import; \
4807 if (nsName == NULL) \
4808 import = xmlHashLookup(schema->schemasImports, \
4809 XML_SCHEMAS_NO_NAMESPACE); \
4811 import = xmlHashLookup(schema->schemasImports, nsName); \
4812 if (import == NULL) \
4814 ret = xmlHashLookup(import->schema->slot, name); \
4827static xmlSchemaElementPtr
4831 xmlSchemaElementPtr
ret =
NULL;
4836 WXS_FIND_GLOBAL_ITEM(elemDecl)
4861static xmlSchemaTypePtr
4871 ret = xmlSchemaGetPredefinedType(
name, nsName);
4882 WXS_FIND_GLOBAL_ITEM(typeDecl)
4908static xmlSchemaAttributePtr
4912 xmlSchemaAttributePtr
ret =
NULL;
4917 WXS_FIND_GLOBAL_ITEM(attrDecl)
4942static xmlSchemaAttributeGroupPtr
4946 xmlSchemaAttributeGroupPtr
ret =
NULL;
4951 WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
4982static xmlSchemaModelGroupDefPtr
4986 xmlSchemaModelGroupDefPtr
ret =
NULL;
4991 WXS_FIND_GLOBAL_ITEM(groupDecl)
5007static xmlSchemaNotationPtr
5008xmlSchemaGetNotation(xmlSchemaPtr
schema,
5012 xmlSchemaNotationPtr
ret =
NULL;
5017 WXS_FIND_GLOBAL_ITEM(notaDecl)
5023static xmlSchemaIDCPtr
5024xmlSchemaGetIDC(xmlSchemaPtr
schema,
5033 WXS_FIND_GLOBAL_ITEM(idcDef)
5049static xmlSchemaBasicItemPtr
5050xmlSchemaGetNamedComponent(xmlSchemaPtr
schema,
5051 xmlSchemaTypeType itemType,
5056 case XML_SCHEMA_TYPE_GROUP:
5057 return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(
schema,
5059 case XML_SCHEMA_TYPE_ELEMENT:
5060 return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(
schema,
5074#define IS_BLANK_NODE(n) \
5075 (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
5097 }
else while ((*
str != 0) && (
len != 0)) {
5107#define WXS_COMP_NAME(c, t) ((t) (c))->name
5108#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
5113static xmlSchemaBasicItemPtr
5114xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
5115 xmlSchemaTypeType
type,
5119 xmlSchemaBasicItemPtr
ret;
5124 if ((bucket->globals ==
NULL) ||
5125 (bucket->globals->nbItems == 0))
5130 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
5131 ret = bucket->globals->items[
i];
5134 case XML_SCHEMA_TYPE_COMPLEX:
5135 case XML_SCHEMA_TYPE_SIMPLE:
5136 if ((WXS_COMP_NAME(
ret, xmlSchemaTypePtr) ==
name) &&
5137 (WXS_COMP_TNS(
ret, xmlSchemaTypePtr) ==
5143 case XML_SCHEMA_TYPE_GROUP:
5144 if ((WXS_COMP_NAME(
ret,
5145 xmlSchemaModelGroupDefPtr) ==
name) &&
5147 xmlSchemaModelGroupDefPtr) == nsName))
5152 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
5153 if ((WXS_COMP_NAME(
ret,
5154 xmlSchemaAttributeGroupPtr) ==
name) &&
5156 xmlSchemaAttributeGroupPtr) == nsName))
5171 if (bucket->relations !=
NULL) {
5172 xmlSchemaSchemaRelationPtr rel = bucket->relations;
5178 bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
5180 if ((rel->bucket !=
NULL) &&
5181 ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
5182 ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
5188 }
while (rel !=
NULL);
5189 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
5205static xmlSchemaNotationPtr
5206xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5210 xmlSchemaNotationPtr
ret =
NULL;
5215 ret = (xmlSchemaNotationPtr)
xmlMalloc(
sizeof(xmlSchemaNotation));
5217 xmlSchemaPErrMemory(ctxt,
"add annotation",
NULL);
5220 memset(
ret, 0,
sizeof(xmlSchemaNotation));
5221 ret->type = XML_SCHEMA_TYPE_NOTATION;
5223 ret->targetNamespace = nsName;
5226 WXS_ADD_GLOBAL(ctxt,
ret);
5242static xmlSchemaAttributePtr
5243xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5247 xmlSchemaAttributePtr
ret =
NULL;
5252 ret = (xmlSchemaAttributePtr)
xmlMalloc(
sizeof(xmlSchemaAttribute));
5254 xmlSchemaPErrMemory(ctxt,
"allocating attribute",
NULL);
5257 memset(
ret, 0,
sizeof(xmlSchemaAttribute));
5258 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
5261 ret->targetNamespace = nsName;
5264 WXS_ADD_GLOBAL(ctxt,
ret);
5266 WXS_ADD_LOCAL(ctxt,
ret);
5267 WXS_ADD_PENDING(ctxt,
ret);
5283static xmlSchemaAttributeUsePtr
5284xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
5287 xmlSchemaAttributeUsePtr
ret =
NULL;
5292 ret = (xmlSchemaAttributeUsePtr)
xmlMalloc(
sizeof(xmlSchemaAttributeUse));
5294 xmlSchemaPErrMemory(pctxt,
"allocating attribute",
NULL);
5297 memset(
ret, 0,
sizeof(xmlSchemaAttributeUse));
5298 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
5301 WXS_ADD_LOCAL(pctxt,
ret);
5311static xmlSchemaRedefPtr
5312xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
5313 xmlSchemaBucketPtr targetBucket,
5318 xmlSchemaRedefPtr
ret;
5320 ret = (xmlSchemaRedefPtr)
5323 xmlSchemaPErrMemory(pctxt,
5324 "allocating redefinition info",
NULL);
5329 ret->targetBucket = targetBucket;
5330 ret->refName = refName;
5331 ret->refTargetNs = refTargetNs;
5332 if (WXS_CONSTRUCTOR(pctxt)->redefs ==
NULL)
5333 WXS_CONSTRUCTOR(pctxt)->redefs =
ret;
5335 WXS_CONSTRUCTOR(pctxt)->lastRedef->next =
ret;
5336 WXS_CONSTRUCTOR(pctxt)->lastRedef =
ret;
5353static xmlSchemaAttributeGroupPtr
5354xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
5360 xmlSchemaAttributeGroupPtr
ret =
NULL;
5365 ret = (xmlSchemaAttributeGroupPtr)
5366 xmlMalloc(
sizeof(xmlSchemaAttributeGroup));
5368 xmlSchemaPErrMemory(pctxt,
"allocating attribute group",
NULL);
5371 memset(
ret, 0,
sizeof(xmlSchemaAttributeGroup));
5372 ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
5374 ret->targetNamespace = nsName;
5378 ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
5379 if (pctxt->isRedefine) {
5380 pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
5382 if (pctxt->redef ==
NULL) {
5386 pctxt->redefCounter = 0;
5388 WXS_ADD_GLOBAL(pctxt,
ret);
5389 WXS_ADD_PENDING(pctxt,
ret);
5405static xmlSchemaElementPtr
5406xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
5410 xmlSchemaElementPtr
ret =
NULL;
5415 ret = (xmlSchemaElementPtr)
xmlMalloc(
sizeof(xmlSchemaElement));
5417 xmlSchemaPErrMemory(ctxt,
"allocating element",
NULL);
5420 memset(
ret, 0,
sizeof(xmlSchemaElement));
5421 ret->type = XML_SCHEMA_TYPE_ELEMENT;
5423 ret->targetNamespace = nsName;
5427 WXS_ADD_GLOBAL(ctxt,
ret);
5429 WXS_ADD_LOCAL(ctxt,
ret);
5430 WXS_ADD_PENDING(ctxt,
ret);
5446static xmlSchemaTypePtr
5447xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5448 xmlSchemaTypeType
type,
5457 ret = (xmlSchemaTypePtr)
xmlMalloc(
sizeof(xmlSchemaType));
5459 xmlSchemaPErrMemory(ctxt,
"allocating type",
NULL);
5465 ret->targetNamespace = nsName;
5468 if (ctxt->isRedefine) {
5469 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5471 if (ctxt->redef ==
NULL) {
5475 ctxt->redefCounter = 0;
5477 WXS_ADD_GLOBAL(ctxt,
ret);
5479 WXS_ADD_LOCAL(ctxt,
ret);
5480 WXS_ADD_PENDING(ctxt,
ret);
5484static xmlSchemaQNameRefPtr
5485xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
5486 xmlSchemaTypeType refType,
5490 xmlSchemaQNameRefPtr
ret;
5492 ret = (xmlSchemaQNameRefPtr)
5495 xmlSchemaPErrMemory(pctxt,
5496 "allocating QName reference item",
NULL);
5500 ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
5501 ret->name = refName;
5502 ret->targetNamespace = refNs;
5504 ret->itemType = refType;
5508 WXS_ADD_LOCAL(pctxt,
ret);
5512static xmlSchemaAttributeUseProhibPtr
5513xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
5515 xmlSchemaAttributeUseProhibPtr
ret;
5517 ret = (xmlSchemaAttributeUseProhibPtr)
5518 xmlMalloc(
sizeof(xmlSchemaAttributeUseProhib));
5520 xmlSchemaPErrMemory(pctxt,
5521 "allocating attribute use prohibition",
NULL);
5524 memset(
ret, 0,
sizeof(xmlSchemaAttributeUseProhib));
5525 ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
5526 WXS_ADD_LOCAL(pctxt,
ret);
5543static xmlSchemaModelGroupPtr
5544xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
5546 xmlSchemaTypeType
type,
5549 xmlSchemaModelGroupPtr
ret =
NULL;
5554 ret = (xmlSchemaModelGroupPtr)
5557 xmlSchemaPErrMemory(ctxt,
"allocating model group component",
5561 memset(
ret, 0,
sizeof(xmlSchemaModelGroup));
5564 WXS_ADD_LOCAL(ctxt,
ret);
5565 if ((
type == XML_SCHEMA_TYPE_SEQUENCE) ||
5566 (
type == XML_SCHEMA_TYPE_CHOICE))
5567 WXS_ADD_PENDING(ctxt,
ret);
5585static xmlSchemaParticlePtr
5586xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
5589 xmlSchemaParticlePtr
ret =
NULL;
5596 ret = (xmlSchemaParticlePtr)
5599 xmlSchemaPErrMemory(ctxt,
"allocating particle component",
5603 ret->type = XML_SCHEMA_TYPE_PARTICLE;
5611 WXS_ADD_LOCAL(ctxt,
ret);
5631static xmlSchemaModelGroupDefPtr
5632xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
5638 xmlSchemaModelGroupDefPtr
ret =
NULL;
5643 ret = (xmlSchemaModelGroupDefPtr)
5644 xmlMalloc(
sizeof(xmlSchemaModelGroupDef));
5646 xmlSchemaPErrMemory(ctxt,
"adding group",
NULL);
5649 memset(
ret, 0,
sizeof(xmlSchemaModelGroupDef));
5651 ret->type = XML_SCHEMA_TYPE_GROUP;
5653 ret->targetNamespace = nsName;
5655 if (ctxt->isRedefine) {
5656 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5658 if (ctxt->redef ==
NULL) {
5662 ctxt->redefCounter = 0;
5664 WXS_ADD_GLOBAL(ctxt,
ret);
5665 WXS_ADD_PENDING(ctxt,
ret);
5677static xmlSchemaWildcardNsPtr
5678xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
5680 xmlSchemaWildcardNsPtr
ret;
5682 ret = (xmlSchemaWildcardNsPtr)
5685 xmlSchemaPErrMemory(ctxt,
"creating wildcard namespace constraint",
NULL);
5693static xmlSchemaIDCPtr
5694xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5703 ret = (xmlSchemaIDCPtr)
xmlMalloc(
sizeof(xmlSchemaIDC));
5705 xmlSchemaPErrMemory(ctxt,
5706 "allocating an identity-constraint definition",
NULL);
5711 ret->targetNamespace = nsName;
5716 WXS_ADD_GLOBAL(ctxt,
ret);
5720 if (
category == XML_SCHEMA_TYPE_IDC_KEYREF)
5721 WXS_ADD_PENDING(ctxt,
ret);
5735static xmlSchemaWildcardPtr
5736xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5739 xmlSchemaWildcardPtr
ret =
NULL;
5744 ret = (xmlSchemaWildcardPtr)
xmlMalloc(
sizeof(xmlSchemaWildcard));
5746 xmlSchemaPErrMemory(ctxt,
"adding wildcard",
NULL);
5749 memset(
ret, 0,
sizeof(xmlSchemaWildcard));
5752 WXS_ADD_LOCAL(ctxt,
ret);
5757xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr
group)
5762 xmlSchemaItemListFree(
group->members);
5769 xmlSchemaSubstGroupFree((xmlSchemaSubstGroupPtr)
group);
5772static xmlSchemaSubstGroupPtr
5773xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
5774 xmlSchemaElementPtr
head)
5776 xmlSchemaSubstGroupPtr
ret;
5779 if (WXS_SUBST_GROUPS(pctxt) ==
NULL) {
5781 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5785 ret = (xmlSchemaSubstGroupPtr)
xmlMalloc(
sizeof(xmlSchemaSubstGroup));
5787 xmlSchemaPErrMemory(
NULL,
5788 "allocating a substitution group container",
NULL);
5791 memset(
ret, 0,
sizeof(xmlSchemaSubstGroup));
5794 ret->members = xmlSchemaItemListCreate();
5796 xmlSchemaSubstGroupFree(
ret);
5802 PERROR_INT(
"xmlSchemaSubstGroupAdd",
5803 "failed to add a new substitution container");
5804 xmlSchemaSubstGroupFree(
ret);
5810static xmlSchemaSubstGroupPtr
5811xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
5812 xmlSchemaElementPtr
head)
5814 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5817 head->name,
head->targetNamespace));
5832xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
5833 xmlSchemaElementPtr
head,
5834 xmlSchemaElementPtr
member)
5836 xmlSchemaSubstGroupPtr substGroup =
NULL;
5841 substGroup = xmlSchemaSubstGroupGet(pctxt,
head);
5842 if (substGroup ==
NULL)
5843 substGroup = xmlSchemaSubstGroupAdd(pctxt,
head);
5844 if (substGroup ==
NULL)
5846 if (xmlSchemaItemListAdd(substGroup->members,
member) == -1)
5874xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
5876 xmlSchemaBasicItemPtr ownerItem,
5890 xmlSchemaPSimpleTypeErr(ctxt,
5893 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
5902 if (
ns &&
ns->href &&
ns->href[0])
5904 else if (
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
5911 *
uri = ctxt->targetNamespace;
5924 xmlSchemaPSimpleTypeErr(ctxt,
5927 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
NULL,
value,
5928 "The value '%s' of simple type 'xs:QName' has no "
5929 "corresponding namespace declaration in scope",
value,
NULL);
5954xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
5956 xmlSchemaBasicItemPtr ownerItem,
5964 return (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
5984xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
5986 xmlSchemaBasicItemPtr ownerItem,
5994 attr = xmlSchemaGetPropNode(ownerElem,
name);
6000 return (xmlSchemaPValAttrNodeQName(ctxt,
schema,
6014xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt,
xmlAttrPtr attr)
6035 strip = xmlSchemaCollapseString(
value);
6036 if (strip !=
NULL) {
6043 xmlSchemaPSimpleTypeErr(ctxt,
6046 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
6047 NULL,
NULL,
"Duplicate value '%s' of simple "
6052 }
else if (
ret > 0) {
6054 xmlSchemaPSimpleTypeErr(ctxt,
6057 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
6058 NULL,
NULL,
"The value '%s' of simple type 'xs:ID' is "
6059 "not a valid 'xs:NCName'",
6069xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
6075 attr = xmlSchemaGetPropNode(ownerElem, (
const char *)
name);
6078 return(xmlSchemaPValAttrNodeID(ctxt,
attr));
6099 attr = xmlSchemaGetPropNode(
node,
"maxOccurs");
6105 if (
max != UNBOUNDED) {
6106 xmlSchemaPSimpleTypeErr(ctxt,
6120 xmlSchemaPSimpleTypeErr(ctxt,
6127 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6146 xmlSchemaPSimpleTypeErr(ctxt,
6173 attr = xmlSchemaGetPropNode(
node,
"minOccurs");
6181 xmlSchemaPSimpleTypeErr(ctxt,
6188 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6207 xmlSchemaPSimpleTypeErr(ctxt,
6228xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
6229 xmlSchemaBasicItemPtr ownerItem,
6250 xmlSchemaPSimpleTypeErr(ctxt,
6253 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6275xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
6277 const char *
name,
int def)
6298 xmlSchemaPSimpleTypeErr(ctxt,
6302 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6313static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
6314 ctxt, xmlSchemaPtr
schema,
6317static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
6322static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
6326 xmlSchemaTypeType parentType);
6327static xmlSchemaBasicItemPtr
6328xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
6331 xmlSchemaItemListPtr uses,
6333static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
6336static xmlSchemaWildcardPtr
6337xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
6357xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
6358 xmlSchemaBasicItemPtr ownerItem,
6361 xmlSchemaTypePtr
type)
6372 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6373 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6374 "the given type is not a built-in type");
6377 switch (
type->builtInType) {
6378 case XML_SCHEMAS_NCNAME:
6379 case XML_SCHEMAS_QNAME:
6380 case XML_SCHEMAS_ANYURI:
6381 case XML_SCHEMAS_TOKEN:
6382 case XML_SCHEMAS_LANGUAGE:
6387 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6388 "validation using the given type is not supported while "
6389 "parsing a schema");
6397 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6398 "failed to validate a schema attribute value");
6400 }
else if (
ret > 0) {
6401 if (WXS_IS_LIST(
type))
6405 xmlSchemaPSimpleTypeErr(pctxt,
6429xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
6430 xmlSchemaBasicItemPtr ownerItem,
6432 xmlSchemaTypePtr
type,
6444 return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem,
attr,
6467xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
6468 xmlSchemaBasicItemPtr ownerItem,
6471 xmlSchemaTypePtr
type,
6481 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6484 xmlSchemaPErr(ctxt, ownerElem,
6486 "Internal error: xmlSchemaPValAttr, the given "
6487 "type '%s' is not a built-in type.\n",
6491 attr = xmlSchemaGetPropNode(ownerElem,
name);
6497 return (xmlSchemaPValAttrNode(ctxt, ownerItem,
attr,
6502xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
6509 if (
xmlStrEqual(pctxt->targetNamespace, namespaceName))
6516 if (WXS_BUCKET(pctxt)->relations !=
NULL) {
6517 xmlSchemaSchemaRelationPtr rel;
6519 rel = WXS_BUCKET(pctxt)->relations;
6521 if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
6525 }
while (rel !=
NULL);
6533 if (namespaceName ==
NULL)
6534 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6536 "References from this schema to components in no "
6537 "namespace are not allowed, since not indicated by an "
6540 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6542 "References from this schema to components in the "
6543 "namespace '%s' are not allowed, since not indicated by an "
6544 "import statement", namespaceName,
NULL);
6560xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6562 int parentType,
int *hasRefs)
6566 while ((IS_SCHEMA((*
child),
"attribute")) ||
6567 (IS_SCHEMA((*
child),
"attributeGroup"))) {
6568 if (IS_SCHEMA((*
child),
"attribute")) {
6579 *
list = xmlSchemaItemListCreate();
6583 if (xmlSchemaItemListAddSize(*
list, 2,
item) == -1)
6586 *
child = (*child)->next;
6603static xmlSchemaAnnotPtr
6604xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt,
xmlNodePtr node,
int needed)
6606 xmlSchemaAnnotPtr
ret;
6622 ret = xmlSchemaNewAnnot(ctxt,
node);
6632 xmlSchemaPIllegalAttrErr(ctxt,
6643 if (IS_SCHEMA(
child,
"appinfo")) {
6657 xmlSchemaPIllegalAttrErr(ctxt,
6662 xmlSchemaPValAttr(ctxt,
NULL,
child,
"source",
6663 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
6665 }
else if (IS_SCHEMA(
child,
"documentation")) {
6676 xmlSchemaPIllegalAttrErr(ctxt,
6684 xmlSchemaPIllegalAttrErr(ctxt,
6695 xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
6696 xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE),
NULL);
6700 xmlSchemaPContentErr(ctxt,
6722static xmlSchemaFacetPtr
6723xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6726 xmlSchemaFacetPtr facet;
6733 facet = xmlSchemaNewFacet();
6734 if (facet ==
NULL) {
6735 xmlSchemaPErrMemory(ctxt,
"allocating facet",
node);
6739 value = xmlSchemaGetProp(ctxt,
node,
"value");
6742 "Facet %s has no value\n",
node->name,
NULL);
6743 xmlSchemaFreeFacet(facet);
6746 if (IS_SCHEMA(
node,
"minInclusive")) {
6747 facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
6748 }
else if (IS_SCHEMA(
node,
"minExclusive")) {
6749 facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
6750 }
else if (IS_SCHEMA(
node,
"maxInclusive")) {
6751 facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
6752 }
else if (IS_SCHEMA(
node,
"maxExclusive")) {
6753 facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
6754 }
else if (IS_SCHEMA(
node,
"totalDigits")) {
6755 facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
6756 }
else if (IS_SCHEMA(
node,
"fractionDigits")) {
6757 facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
6758 }
else if (IS_SCHEMA(
node,
"pattern")) {
6759 facet->type = XML_SCHEMA_FACET_PATTERN;
6760 }
else if (IS_SCHEMA(
node,
"enumeration")) {
6761 facet->type = XML_SCHEMA_FACET_ENUMERATION;
6762 }
else if (IS_SCHEMA(
node,
"whiteSpace")) {
6763 facet->type = XML_SCHEMA_FACET_WHITESPACE;
6764 }
else if (IS_SCHEMA(
node,
"length")) {
6765 facet->type = XML_SCHEMA_FACET_LENGTH;
6766 }
else if (IS_SCHEMA(
node,
"maxLength")) {
6767 facet->type = XML_SCHEMA_FACET_MAXLENGTH;
6768 }
else if (IS_SCHEMA(
node,
"minLength")) {
6769 facet->type = XML_SCHEMA_FACET_MINLENGTH;
6772 "Unknown facet type %s\n",
node->name,
NULL);
6773 xmlSchemaFreeFacet(facet);
6777 facet->value =
value;
6778 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
6779 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
6782 fixed = xmlSchemaGetProp(ctxt,
node,
"fixed");
6790 if (IS_SCHEMA(
child,
"annotation")) {
6791 facet->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6796 "Facet %s has unexpected child content\n",
6816xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
6818 xmlSchemaWildcardPtr wildc,
6824 xmlSchemaWildcardNsPtr tmp, lastNs =
NULL;
6827 pc = xmlSchemaGetProp(ctxt,
node,
"processContents");
6830 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6832 wildc->processContents = XML_SCHEMAS_ANY_SKIP;
6834 wildc->processContents = XML_SCHEMAS_ANY_LAX;
6836 xmlSchemaPSimpleTypeErr(ctxt,
6839 NULL,
"(strict | skip | lax)", pc,
6841 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6847 attr = xmlSchemaGetPropNode(
node,
"namespace");
6852 wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
6853 if (wildc->negNsSet ==
NULL) {
6856 wildc->negNsSet->value = ctxt->targetNamespace;
6872 xmlSchemaPSimpleTypeErr(ctxt,
6876 "((##any | ##other) | List of (xs:anyURI | "
6877 "(##targetNamespace | ##local)))",
6882 dictnsItem = ctxt->targetNamespace;
6889 xmlSchemaPValAttrNodeValue(ctxt,
NULL,
attr,
6890 nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
6897 while (tmp !=
NULL) {
6898 if (dictnsItem == tmp->value)
6903 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
6908 tmp->value = dictnsItem;
6910 if (wildc->nsSet ==
NULL)
6912 else if (lastNs !=
NULL)
6920 }
while (*
cur != 0);
6926xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
6932 if ((maxOccurs == 0) && ( minOccurs == 0))
6934 if (maxOccurs != UNBOUNDED) {
6944 if (maxOccurs < 1) {
6948 xmlSchemaPCustomAttrErr(ctxt,
6951 xmlSchemaGetPropNode(
node,
"maxOccurs"),
6952 "The value must be greater than or equal to 1");
6954 }
else if (minOccurs > maxOccurs) {
6958 xmlSchemaPCustomAttrErr(ctxt,
6961 xmlSchemaGetPropNode(
node,
"minOccurs"),
6962 "The value must not be greater than the value of 'maxOccurs'");
6982static xmlSchemaParticlePtr
6983xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6986 xmlSchemaParticlePtr particle;
6988 xmlSchemaWildcardPtr wild;
6991 xmlSchemaAnnotPtr annot =
NULL;
7006 xmlSchemaPIllegalAttrErr(ctxt,
7010 xmlSchemaPIllegalAttrErr(ctxt,
7019 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
7020 "(xs:nonNegativeInteger | unbounded)");
7021 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
7022 "xs:nonNegativeInteger");
7027 wild = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY,
node);
7030 xmlSchemaParseWildcardNs(ctxt,
schema, wild,
node);
7035 if (IS_SCHEMA(
child,
"annotation")) {
7036 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
7040 xmlSchemaPContentErr(ctxt,
7043 NULL,
"(annotation?)");
7048 if ((
min == 0) && (
max == 0)) {
7055 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
7056 if (particle ==
NULL)
7058 particle->annot = annot;
7059 particle->children = (xmlSchemaTreeItemPtr) wild;
7074static xmlSchemaNotationPtr
7075xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
7079 xmlSchemaNotationPtr
ret;
7084 name = xmlSchemaGetProp(ctxt,
node,
"name");
7087 "Notation has no name\n",
NULL,
NULL);
7091 ctxt->targetNamespace,
node);
7097 if (IS_SCHEMA(
child,
"annotation")) {
7098 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
7102 xmlSchemaPContentErr(ctxt,
7105 NULL,
"(annotation?)");
7122static xmlSchemaWildcardPtr
7123xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
7126 xmlSchemaWildcardPtr
ret;
7133 ret = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
7147 xmlSchemaPIllegalAttrErr(ctxt,
7151 xmlSchemaPIllegalAttrErr(ctxt,
7166 if (IS_SCHEMA(
child,
"annotation")) {
7167 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
7171 xmlSchemaPContentErr(ctxt,
7174 NULL,
"(annotation?)");
7192static xmlSchemaBasicItemPtr
7193xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
7196 xmlSchemaItemListPtr uses,
7200 xmlSchemaAttributeUsePtr use =
NULL;
7204 int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7205 int nberrors, hasForm = 0, defValueType = 0;
7207#define WXS_ATTR_DEF_VAL_DEFAULT 1
7208#define WXS_ATTR_DEF_VAL_FIXED 2
7216 attr = xmlSchemaGetPropNode(
node,
"ref");
7218 if (xmlSchemaPValAttrNodeQName(pctxt,
schema,
7219 NULL,
attr, &tmpNs, &tmpName) != 0) {
7222 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, tmpNs) != 0)
7226 nberrors = pctxt->nberrors;
7235 xmlSchemaPValAttrNodeID(pctxt,
attr);
7244 xmlSchemaPValAttrNodeID(pctxt,
attr);
7247 xmlSchemaPValAttrNodeQName(pctxt,
schema,
NULL,
7248 attr, &tmpNs, &tmpName);
7255 attrValue = xmlSchemaGetNodeContent(pctxt,
7258 ns = pctxt->targetNamespace;
7261 xmlSchemaPSimpleTypeErr(pctxt,
7264 NULL,
"(qualified | unqualified)",
7275 occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7277 occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
7279 occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
7281 xmlSchemaPSimpleTypeErr(pctxt,
7284 NULL,
"(optional | prohibited | required)",
7294 xmlSchemaPMutualExclAttrErr(pctxt,
7299 defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
7308 xmlSchemaPMutualExclAttrErr(pctxt,
7313 defValueType = WXS_ATTR_DEF_VAL_FIXED;
7320 xmlSchemaPIllegalAttrErr(pctxt,
7331 if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
7332 (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
7333 xmlSchemaPSimpleTypeErr(pctxt,
7336 "(optional | prohibited | required)",
NULL,
7337 "The value of the attribute 'use' must be 'optional' "
7338 "if the attribute 'default' is present",
7344 if (nberrors != pctxt->nberrors)
7347 xmlSchemaAttributePtr attrDecl;
7350 if ((! hasForm) && (
schema->flags & XML_SCHEMAS_QUALIF_ATTR))
7351 ns = pctxt->targetNamespace;
7357 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7360 "The target namespace must not match '%s'",
7361 xmlSchemaInstanceNs,
NULL);
7363 attr = xmlSchemaGetPropNode(
node,
"name");
7369 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7370 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7378 xmlSchemaPSimpleTypeErr(pctxt,
7381 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7382 "The value of the attribute must not match 'xmlns'",
7386 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
7387 goto check_children;
7391 use = xmlSchemaAddAttributeUse(pctxt,
node);
7394 use->occurs = occurs;
7399 if (attrDecl ==
NULL)
7401 if (tmpName !=
NULL) {
7402 attrDecl->typeName = tmpName;
7403 attrDecl->typeNs = tmpNs;
7405 use->attrDecl = attrDecl;
7409 if (defValue !=
NULL) {
7410 attrDecl->defValue = defValue;
7411 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7412 attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
7414 }
else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7415 xmlSchemaQNameRefPtr
ref;
7420 use = xmlSchemaAddAttributeUse(pctxt,
node);
7426 WXS_ADD_PENDING(pctxt, use);
7427 use->occurs = occurs;
7431 ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
7439 use->attrDecl = WXS_ATTR_CAST
ref;
7443 if (defValue !=
NULL)
7444 use->defValue = defValue;
7445 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7446 use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
7454 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7455 xmlSchemaAttributeUseProhibPtr prohib;
7457 if (IS_SCHEMA(
child,
"annotation")) {
7458 xmlSchemaParseAnnotation(pctxt,
child, 0);
7462 xmlSchemaPContentErr(pctxt,
7470 if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
7471 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7474 "Skipping attribute use prohibition, since it is "
7475 "pointless inside an <attributeGroup>",
7478 }
else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
7479 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7482 "Skipping attribute use prohibition, since it is "
7483 "pointless when extending a type",
7497 for (
i = 0;
i < uses->nbItems;
i++) {
7498 use = uses->items[
i];
7499 if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
7500 (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
7501 (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
7505 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7508 "Skipping duplicate attribute use prohibition '%s'",
7509 xmlSchemaFormatQName(&
str, tmpNs, tmpName),
7519 prohib = xmlSchemaAddAttributeUseProhib(pctxt);
7522 prohib->node =
node;
7523 prohib->name = tmpName;
7524 prohib->targetNamespace = tmpNs;
7529 WXS_ADD_PENDING(pctxt, prohib);
7531 return(WXS_BASIC_CAST prohib);
7533 if (IS_SCHEMA(
child,
"annotation")) {
7537 use->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7542 if (IS_SCHEMA(
child,
"simpleType"))
7548 xmlSchemaPContentErr(pctxt,
7553 xmlSchemaPContentErr(pctxt,
7559 if (IS_SCHEMA(
child,
"simpleType")) {
7560 if (WXS_ATTRUSE_DECL(use)->typeName !=
NULL) {
7567 "The attribute 'type' and the <simpleType> child "
7568 "are mutually exclusive",
NULL);
7570 WXS_ATTRUSE_TYPEDEF(use) =
7571 xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7577 "(annotation?, simpleType?)");
7580 return (WXS_BASIC_CAST use);
7584static xmlSchemaAttributePtr
7585xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
7590 xmlSchemaAttributePtr
ret;
7606 attr = xmlSchemaGetPropNode(
node,
"name");
7612 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7613 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
7621 xmlSchemaPSimpleTypeErr(pctxt,
7624 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7625 "The value of the attribute must not match 'xmlns'",
7635 if (
xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
7636 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7638 "The target namespace must not match '%s'",
7639 xmlSchemaInstanceNs,
NULL);
7642 ret = xmlSchemaAddAttribute(pctxt,
schema, attrValue,
7643 pctxt->targetNamespace,
node, 1);
7646 ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
7660 xmlSchemaPIllegalAttrErr(pctxt,
7664 xmlSchemaPIllegalAttrErr(pctxt,
7676 ret->defValue = xmlSchemaGetProp(pctxt,
node,
"fixed");
7678 ret->flags |= XML_SCHEMAS_ATTR_FIXED;
7682 attr = xmlSchemaGetPropNode(
node,
"default");
7688 if (
ret->flags & XML_SCHEMAS_ATTR_FIXED) {
7690 WXS_BASIC_CAST
ret,
attr,
"default",
"fixed");
7698 if (IS_SCHEMA(
child,
"annotation")) {
7699 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7702 if (IS_SCHEMA(
child,
"simpleType")) {
7710 "The attribute 'type' and the <simpleType> child "
7711 "are mutually exclusive",
NULL);
7713 ret->subtypes = xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7719 "(annotation?, simpleType?)");
7737static xmlSchemaQNameRefPtr
7738xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
7742 xmlSchemaQNameRefPtr
ret;
7750 attr = xmlSchemaGetPropNode(
node,
"ref");
7752 xmlSchemaPMissingAttrErr(pctxt,
7757 xmlSchemaPValAttrNodeQName(pctxt,
schema,
7759 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, refNs) != 0)
7771 xmlSchemaPIllegalAttrErr(pctxt,
7775 xmlSchemaPIllegalAttrErr(pctxt,
7787 if (IS_SCHEMA(
child,
"annotation")) {
7791 xmlSchemaParseAnnotation(pctxt,
child, 0);
7795 xmlSchemaPContentErr(pctxt,
7804 if (pctxt->isRedefine && pctxt->redef &&
7805 (pctxt->redef->item->type ==
7806 XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
7807 (
ref == pctxt->redef->refName) &&
7808 (refNs == pctxt->redef->refTargetNs))
7817 if (pctxt->redefCounter != 0) {
7820 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7822 "The redefining attribute group definition "
7823 "'%s' must not contain more than one "
7824 "reference to the redefined definition",
7825 xmlSchemaFormatQName(&
str, refNs,
ref),
NULL);
7829 pctxt->redefCounter++;
7834 ret = xmlSchemaNewQNameRef(pctxt,
7835 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7839 pctxt->redef->reference = WXS_BASIC_CAST
ret;
7846 ret = xmlSchemaNewQNameRef(pctxt,
7847 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7852 WXS_ADD_PENDING(pctxt,
ret);
7868static xmlSchemaAttributeGroupPtr
7869xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
7874 xmlSchemaAttributeGroupPtr
ret;
7882 attr = xmlSchemaGetPropNode(
node,
"name");
7884 xmlSchemaPMissingAttrErr(pctxt,
7892 if (xmlSchemaPValAttrNode(pctxt,
7894 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7897 ret = xmlSchemaAddAttributeGroupDefinition(pctxt,
schema,
7898 name, pctxt->targetNamespace,
node);
7910 xmlSchemaPIllegalAttrErr(pctxt,
7914 xmlSchemaPIllegalAttrErr(pctxt,
7925 if (IS_SCHEMA(
child,
"annotation")) {
7926 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7932 if (xmlSchemaParseLocalAttributes(pctxt,
schema, &
child,
7933 (xmlSchemaItemListPtr *) &(
ret->attrUses),
7934 XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
7937 ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
7941 if (IS_SCHEMA(
child,
"anyAttribute")) {
7942 ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
7947 xmlSchemaPContentErr(pctxt,
7950 "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
7969 if ((*
flags & flagQualified) == 0)
7970 *
flags |= flagQualified;
7999 int flagRestriction,
8000 int flagSubstitution,
8017 if (flagExtension != -1)
8018 *
flags |= flagExtension;
8019 if (flagRestriction != -1)
8020 *
flags |= flagRestriction;
8021 if (flagSubstitution != -1)
8022 *
flags |= flagSubstitution;
8025 if (flagUnion != -1)
8026 *
flags |= flagUnion;
8042 if (flagExtension != -1) {
8043 if ((*
flags & flagExtension) == 0)
8044 *
flags |= flagExtension;
8048 if (flagRestriction != -1) {
8049 if ((*
flags & flagRestriction) == 0)
8050 *
flags |= flagRestriction;
8054 if (flagSubstitution != -1) {
8055 if ((*
flags & flagSubstitution) == 0)
8056 *
flags |= flagSubstitution;
8060 if (flagList != -1) {
8061 if ((*
flags & flagList) == 0)
8066 if (flagUnion != -1) {
8067 if ((*
flags & flagUnion) == 0)
8068 *
flags |= flagUnion;
8076 }
while ((
ret == 0) && (*
cur != 0));
8083xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
8084 xmlSchemaIDCPtr idc,
8085 xmlSchemaIDCSelectPtr selector,
8098 if (selector ==
NULL) {
8099 xmlSchemaPErr(ctxt, idc->node,
8101 "Internal error: xmlSchemaCheckCSelectorXPath, "
8102 "the selector is not specified.\n",
NULL,
NULL);
8109 if (selector->xpath ==
NULL) {
8110 xmlSchemaPCustomErr(ctxt,
8114 "The XPath expression of the selector is not valid",
NULL);
8130 nsList = xmlGetNsList(
attr->doc,
attr->parent);
8134 if (nsList !=
NULL) {
8137 for (
i = 0; nsList[
i] !=
NULL;
i++)
8142 if (nsArray ==
NULL) {
8143 xmlSchemaPErrMemory(ctxt,
"allocating a namespace array",
8149 nsArray[2 *
i] = nsList[
i]->
href;
8150 nsArray[2 *
i + 1] = nsList[
i]->
prefix;
8159 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8160 NULL, XML_PATTERN_XSFIELD, nsArray);
8162 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8163 NULL, XML_PATTERN_XSSEL, nsArray);
8164 if (nsArray !=
NULL)
8167 if (selector->xpathComp ==
NULL) {
8168 xmlSchemaPCustomErr(ctxt,
8172 "The XPath expression '%s' could not be "
8173 "compiled", selector->xpath);
8180#define ADD_ANNOTATION(annot) \
8181 xmlSchemaAnnotPtr cur = item->annot; \
8182 if (item->annot == NULL) { \
8183 item->annot = annot; \
8186 cur = item->annot; \
8187 if (cur->next != NULL) { \
8201static xmlSchemaAnnotPtr
8202xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
8203 xmlSchemaAnnotPtr annot)
8205 if ((annItem ==
NULL) || (annot ==
NULL))
8207 switch (annItem->type) {
8208 case XML_SCHEMA_TYPE_ELEMENT: {
8209 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) annItem;
8210 ADD_ANNOTATION(annot)
8213 case XML_SCHEMA_TYPE_ATTRIBUTE: {
8214 xmlSchemaAttributePtr
item = (xmlSchemaAttributePtr) annItem;
8215 ADD_ANNOTATION(annot)
8218 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
8219 case XML_SCHEMA_TYPE_ANY: {
8220 xmlSchemaWildcardPtr
item = (xmlSchemaWildcardPtr) annItem;
8221 ADD_ANNOTATION(annot)
8224 case XML_SCHEMA_TYPE_PARTICLE:
8225 case XML_SCHEMA_TYPE_IDC_KEY:
8226 case XML_SCHEMA_TYPE_IDC_KEYREF:
8227 case XML_SCHEMA_TYPE_IDC_UNIQUE: {
8228 xmlSchemaAnnotItemPtr
item = (xmlSchemaAnnotItemPtr) annItem;
8229 ADD_ANNOTATION(annot)
8232 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
8233 xmlSchemaAttributeGroupPtr
item =
8234 (xmlSchemaAttributeGroupPtr) annItem;
8235 ADD_ANNOTATION(annot)
8238 case XML_SCHEMA_TYPE_NOTATION: {
8239 xmlSchemaNotationPtr
item = (xmlSchemaNotationPtr) annItem;
8240 ADD_ANNOTATION(annot)
8243 case XML_SCHEMA_FACET_MININCLUSIVE:
8244 case XML_SCHEMA_FACET_MINEXCLUSIVE:
8245 case XML_SCHEMA_FACET_MAXINCLUSIVE:
8246 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
8247 case XML_SCHEMA_FACET_TOTALDIGITS:
8248 case XML_SCHEMA_FACET_FRACTIONDIGITS:
8249 case XML_SCHEMA_FACET_PATTERN:
8250 case XML_SCHEMA_FACET_ENUMERATION:
8251 case XML_SCHEMA_FACET_WHITESPACE:
8252 case XML_SCHEMA_FACET_LENGTH:
8253 case XML_SCHEMA_FACET_MAXLENGTH:
8254 case XML_SCHEMA_FACET_MINLENGTH: {
8255 xmlSchemaFacetPtr
item = (xmlSchemaFacetPtr) annItem;
8256 ADD_ANNOTATION(annot)
8259 case XML_SCHEMA_TYPE_SIMPLE:
8260 case XML_SCHEMA_TYPE_COMPLEX: {
8261 xmlSchemaTypePtr
item = (xmlSchemaTypePtr) annItem;
8262 ADD_ANNOTATION(annot)
8265 case XML_SCHEMA_TYPE_GROUP: {
8266 xmlSchemaModelGroupDefPtr
item = (xmlSchemaModelGroupDefPtr) annItem;
8267 ADD_ANNOTATION(annot)
8270 case XML_SCHEMA_TYPE_SEQUENCE:
8271 case XML_SCHEMA_TYPE_CHOICE:
8272 case XML_SCHEMA_TYPE_ALL: {
8273 xmlSchemaModelGroupPtr
item = (xmlSchemaModelGroupPtr) annItem;
8274 ADD_ANNOTATION(annot)
8278 xmlSchemaPCustomErr(
NULL,
8281 "Internal error: xmlSchemaAddAnnotation, "
8282 "The item is not a annotated schema component",
NULL);
8299static xmlSchemaIDCSelectPtr
8300xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
8301 xmlSchemaIDCPtr idc,
8305 xmlSchemaIDCSelectPtr
item;
8317 xmlSchemaPIllegalAttrErr(ctxt,
8321 xmlSchemaPIllegalAttrErr(ctxt,
8329 item = (xmlSchemaIDCSelectPtr)
xmlMalloc(
sizeof(xmlSchemaIDCSelect));
8331 xmlSchemaPErrMemory(ctxt,
8332 "allocating a 'selector' of an identity-constraint definition",
8340 attr = xmlSchemaGetPropNode(
node,
"xpath");
8342 xmlSchemaPMissingAttrErr(ctxt,
8352 if (xmlSchemaCheckCSelectorXPath(ctxt, idc,
item,
attr,
8357 "Internal error: xmlSchemaParseIDCSelectorAndField, "
8358 "validating the XPath expression of a IDC selector.\n",
8368 if (IS_SCHEMA(
child,
"annotation")) {
8372 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
8373 xmlSchemaParseAnnotation(ctxt,
child, 1));
8377 xmlSchemaPContentErr(ctxt,
8380 NULL,
"(annotation?)");
8396static xmlSchemaIDCPtr
8397xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
8400 xmlSchemaTypeType idcCategory,
8401 const xmlChar *targetNamespace)
8417 ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
8419 xmlSchemaPIllegalAttrErr(ctxt,
8423 xmlSchemaPIllegalAttrErr(ctxt,
8431 attr = xmlSchemaGetPropNode(
node,
"name");
8433 xmlSchemaPMissingAttrErr(ctxt,
8438 }
else if (xmlSchemaPValAttrNode(ctxt,
8440 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
8450 if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
8454 attr = xmlSchemaGetPropNode(
node,
"refer");
8456 xmlSchemaPMissingAttrErr(ctxt,
8464 item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
8468 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8470 &(
item->ref->targetNamespace),
8471 &(
item->ref->name));
8473 item->ref->targetNamespace);
8480 if (IS_SCHEMA(
child,
"annotation")) {
8481 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8485 xmlSchemaPContentErr(ctxt,
8488 "A child element is missing",
8489 "(annotation?, (selector, field+))");
8494 if (IS_SCHEMA(
child,
"selector")) {
8495 item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
8501 if (IS_SCHEMA(
child,
"field")) {
8503 field = xmlSchemaParseIDCSelectorAndField(ctxt,
8508 if (lastField !=
NULL)
8509 lastField->next =
field;
8515 }
while (IS_SCHEMA(
child,
"field"));
8517 xmlSchemaPContentErr(ctxt,
8520 NULL,
"(annotation?, (selector, field+))");
8524 xmlSchemaPContentErr(ctxt,
8527 NULL,
"(annotation?, (selector, field+))");
8546static xmlSchemaBasicItemPtr
8547xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8550 xmlSchemaElementPtr decl =
NULL;
8551 xmlSchemaParticlePtr particle =
NULL;
8552 xmlSchemaAnnotPtr annot =
NULL;
8564 if (isElemRef !=
NULL)
8571 nameAttr = xmlSchemaGetPropNode(
node,
"name");
8572 attr = xmlSchemaGetPropNode(
node,
"ref");
8573 if ((topLevel) || (
attr ==
NULL)) {
8574 if (nameAttr ==
NULL) {
8575 xmlSchemaPMissingAttrErr(ctxt,
8585 if (IS_SCHEMA(
child,
"annotation")) {
8586 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8593 goto declaration_part;
8597 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
8598 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
"(xs:nonNegativeInteger | unbounded)");
8600 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
8601 if (particle ==
NULL)
8608 xmlSchemaQNameRefPtr refer =
NULL;
8612 if (isElemRef !=
NULL)
8615 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8621 if (nameAttr !=
NULL) {
8622 xmlSchemaPMutualExclAttrErr(ctxt,
8641 xmlSchemaPCustomAttrErr(ctxt,
8644 "Only the attributes 'minOccurs', 'maxOccurs' and "
8645 "'id' are allowed in addition to 'ref'");
8649 xmlSchemaPIllegalAttrErr(ctxt,
8661 if ((
min == 0) && (
max == 0))
8666 refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
8670 particle->children = (xmlSchemaTreeItemPtr) refer;
8671 particle->annot = annot;
8676 WXS_ADD_PENDING(ctxt, particle);
8677 return ((xmlSchemaBasicItemPtr) particle);
8685 xmlSchemaIDCPtr curIDC =
NULL, lastIDC =
NULL;
8687 if (xmlSchemaPValAttrNode(ctxt,
NULL, nameAttr,
8688 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0)
8694 ns = ctxt->targetNamespace;
8696 attr = xmlSchemaGetPropNode(
node,
"form");
8700 ns = ctxt->targetNamespace;
8702 xmlSchemaPSimpleTypeErr(ctxt,
8705 NULL,
"(qualified | unqualified)",
8708 }
else if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
8709 ns = ctxt->targetNamespace;
8711 decl = xmlSchemaAddElement(ctxt,
name,
ns,
node, topLevel);
8729 if (topLevel == 0) {
8734 xmlSchemaPIllegalAttrErr(ctxt,
8741 xmlSchemaPIllegalAttrErr(ctxt,
8747 xmlSchemaPIllegalAttrErr(ctxt,
8759 decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
8760 decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
8761 xmlSchemaPValAttrQName(ctxt,
schema,
8763 &(decl->substGroupNs), &(decl->substGroup));
8764 if (xmlGetBooleanProp(ctxt,
node,
"abstract", 0))
8765 decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
8769 attr = xmlSchemaGetPropNode(
node,
"final");
8771 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
8772 decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
8773 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
8774 decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
8777 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8779 XML_SCHEMAS_ELEM_FINAL_EXTENSION,
8780 XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
8781 xmlSchemaPSimpleTypeErr(ctxt,
8784 NULL,
"(#all | List of (extension | restriction))",
8792 attr = xmlSchemaGetPropNode(
node,
"block");
8797 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
8798 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
8799 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
8800 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
8801 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
8802 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
8805 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8807 XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
8808 XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
8809 XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
8810 xmlSchemaPSimpleTypeErr(ctxt,
8813 NULL,
"(#all | List of (extension | "
8814 "restriction | substitution))", attrValue,
8818 if (xmlGetBooleanProp(ctxt,
node,
"nillable", 0))
8819 decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
8821 attr = xmlSchemaGetPropNode(
node,
"type");
8823 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8825 &(decl->namedTypeNs), &(decl->namedType));
8827 attr, decl->namedTypeNs);
8829 decl->value = xmlSchemaGetProp(ctxt,
node,
"default");
8830 attr = xmlSchemaGetPropNode(
node,
"fixed");
8833 if (decl->value !=
NULL) {
8838 xmlSchemaPMutualExclAttrErr(ctxt,
8842 decl->flags |= XML_SCHEMAS_ELEM_FIXED;
8843 decl->value =
fixed;
8849 if (IS_SCHEMA(
child,
"complexType")) {
8855 if (decl->namedType !=
NULL) {
8856 xmlSchemaPContentErr(ctxt,
8859 "The attribute 'type' and the <complexType> child are "
8860 "mutually exclusive",
NULL);
8862 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt,
schema,
child, 0);
8864 }
else if (IS_SCHEMA(
child,
"simpleType")) {
8870 if (decl->namedType !=
NULL) {
8871 xmlSchemaPContentErr(ctxt,
8874 "The attribute 'type' and the <simpleType> child are "
8875 "mutually exclusive",
NULL);
8877 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
8880 while ((IS_SCHEMA(
child,
"unique")) ||
8881 (IS_SCHEMA(
child,
"key")) || (IS_SCHEMA(
child,
"keyref"))) {
8882 if (IS_SCHEMA(
child,
"unique")) {
8884 XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
8885 }
else if (IS_SCHEMA(
child,
"key")) {
8887 XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
8888 }
else if (IS_SCHEMA(
child,
"keyref")) {
8890 XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
8892 if (lastIDC !=
NULL)
8893 lastIDC->next = curIDC;
8895 decl->idcs = (
void *) curIDC;
8900 xmlSchemaPContentErr(ctxt,
8903 NULL,
"(annotation?, ((simpleType | complexType)?, "
8904 "(unique | key | keyref)*))");
8906 decl->annot = annot;
8914 return ((xmlSchemaBasicItemPtr) decl);
8916 particle->children = (xmlSchemaTreeItemPtr) decl;
8917 return ((xmlSchemaBasicItemPtr) particle);
8922 if (annot !=
NULL) {
8923 if (particle !=
NULL)
8924 particle->annot =
NULL;
8927 xmlSchemaFreeAnnot(annot);
8945xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8948 xmlSchemaTypePtr
type;
8956 type = ctxt->ctxtType;
8960 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
8965 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
8974 xmlSchemaPIllegalAttrErr(ctxt,
8978 xmlSchemaPIllegalAttrErr(ctxt,
8988 attr = xmlSchemaGetPropNode(
node,
"memberTypes");
8992 const xmlChar *localName, *nsName;
8993 xmlSchemaTypeLinkPtr
link, lastLink =
NULL;
8994 xmlSchemaQNameRefPtr
ref;
9007 if (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
9012 link = (xmlSchemaTypeLinkPtr)
9015 xmlSchemaPErrMemory(ctxt,
"xmlSchemaParseUnion, "
9016 "allocating a type link",
NULL);
9021 if (lastLink ==
NULL)
9024 lastLink->next =
link;
9029 ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
9039 link->type = (xmlSchemaTypePtr)
ref;
9043 }
while (*
cur != 0);
9050 if (IS_SCHEMA(
child,
"annotation")) {
9054 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
9055 xmlSchemaParseAnnotation(ctxt,
child, 1));
9058 if (IS_SCHEMA(
child,
"simpleType")) {
9059 xmlSchemaTypePtr subtype,
last =
NULL;
9065 while (IS_SCHEMA(
child,
"simpleType")) {
9066 subtype = (xmlSchemaTypePtr)
9068 if (subtype !=
NULL) {
9070 type->subtypes = subtype;
9073 last->next = subtype;
9082 xmlSchemaPContentErr(ctxt,
9092 xmlSchemaPCustomErr(ctxt,
9095 "Either the attribute 'memberTypes' or "
9096 "at least one <simpleType> child must be present",
NULL);
9113static xmlSchemaTypePtr
9114xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9117 xmlSchemaTypePtr
type;
9124 type = ctxt->ctxtType;
9128 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
9133 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
9142 xmlSchemaPIllegalAttrErr(ctxt,
9146 xmlSchemaPIllegalAttrErr(ctxt,
9167 if (IS_SCHEMA(
child,
"annotation")) {
9168 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
9169 xmlSchemaParseAnnotation(ctxt,
child, 1));
9172 if (IS_SCHEMA(
child,
"simpleType")) {
9179 xmlSchemaPCustomErr(ctxt,
9182 "The attribute 'itemType' and the <simpleType> child "
9183 "are mutually exclusive",
NULL);
9189 xmlSchemaPCustomErr(ctxt,
9192 "Either the attribute 'itemType' or the <simpleType> child "
9193 "must be present",
NULL);
9196 xmlSchemaPContentErr(ctxt,
9202 (xmlSchemaGetPropNode(
node,
"itemType") ==
NULL)) {
9203 xmlSchemaPCustomErr(ctxt,
9206 "Either the attribute 'itemType' or the <simpleType> child "
9207 "must be present",
NULL);
9224static xmlSchemaTypePtr
9225xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9228 xmlSchemaTypePtr
type, oldCtxtType;
9232 int hasRestriction = 0;
9238 attr = xmlSchemaGetPropNode(
node,
"name");
9240 xmlSchemaPMissingAttrErr(ctxt,
9246 if (xmlSchemaPValAttrNode(ctxt,
9248 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
9254 xmlSchemaTypePtr biType;
9256 if (ctxt->isRedefine) {
9264 "Redefinition of built-in simple types is not "
9268 biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
9280 if (topLevel == 0) {
9281#ifdef ENABLE_NAMED_LOCALS
9287#ifdef ENABLE_NAMED_LOCALS
9290 XML_SCHEMA_TYPE_SIMPLE,
9292 ctxt->targetNamespace,
node, 0);
9295 XML_SCHEMA_TYPE_SIMPLE,
9296 NULL, ctxt->targetNamespace,
node, 0);
9300 type->type = XML_SCHEMA_TYPE_SIMPLE;
9301 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9309 xmlSchemaPIllegalAttrErr(ctxt,
9313 xmlSchemaPIllegalAttrErr(ctxt,
9324 type = xmlSchemaAddType(ctxt,
schema, XML_SCHEMA_TYPE_SIMPLE,
9325 attrValue, ctxt->targetNamespace,
node, 1);
9328 type->type = XML_SCHEMA_TYPE_SIMPLE;
9329 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9330 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
9340 xmlSchemaPIllegalAttrErr(ctxt,
9344 xmlSchemaPIllegalAttrErr(ctxt,
9352 attr = xmlSchemaGetPropNode(
node,
"final");
9354 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9355 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
9356 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9357 type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
9358 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9359 type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
9361 attrValue = xmlSchemaGetProp(ctxt,
node,
"final");
9362 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
9363 -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
9364 XML_SCHEMAS_TYPE_FINAL_LIST,
9365 XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
9367 xmlSchemaPSimpleTypeErr(ctxt,
9370 NULL,
"(#all | List of (list | union | restriction)",
9375 type->targetNamespace = ctxt->targetNamespace;
9380 oldCtxtType = ctxt->ctxtType;
9382 ctxt->ctxtType =
type;
9385 if (IS_SCHEMA(
child,
"annotation")) {
9386 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9392 "(annotation?, (restriction | list | union))");
9393 }
else if (IS_SCHEMA(
child,
"restriction")) {
9395 XML_SCHEMA_TYPE_SIMPLE);
9398 }
else if (IS_SCHEMA(
child,
"list")) {
9401 }
else if (IS_SCHEMA(
child,
"union")) {
9408 "(annotation?, (restriction | list | union))");
9417 if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
9419 NULL,
node,
"This is a redefinition, thus the "
9420 "<simpleType> must have a <restriction> child",
NULL);
9423 ctxt->ctxtType = oldCtxtType;
9438static xmlSchemaTreeItemPtr
9439xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
9443 xmlSchemaParticlePtr
item;
9452 attr = xmlSchemaGetPropNode(
node,
"ref");
9454 xmlSchemaPMissingAttrErr(ctxt,
9458 }
else if (xmlSchemaPValAttrNodeQName(ctxt,
schema,
NULL,
9463 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
9464 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
9465 "(xs:nonNegativeInteger | unbounded)");
9476 xmlSchemaPIllegalAttrErr(ctxt,
9480 xmlSchemaPIllegalAttrErr(ctxt,
9493 item->children = (xmlSchemaTreeItemPtr)
9494 xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP,
ref, refNs);
9501 if (IS_SCHEMA(
child,
"annotation")) {
9505 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9509 xmlSchemaPContentErr(ctxt,
9517 if ((
min == 0) && (
max == 0))
9520 return ((xmlSchemaTreeItemPtr)
item);
9540static xmlSchemaModelGroupDefPtr
9541xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
9545 xmlSchemaModelGroupDefPtr
item;
9553 attr = xmlSchemaGetPropNode(
node,
"name");
9555 xmlSchemaPMissingAttrErr(ctxt,
9560 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
9561 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
9565 ctxt->targetNamespace,
node);
9576 xmlSchemaPIllegalAttrErr(ctxt,
9580 xmlSchemaPIllegalAttrErr(ctxt,
9590 if (IS_SCHEMA(
child,
"annotation")) {
9591 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9594 if (IS_SCHEMA(
child,
"all")) {
9596 XML_SCHEMA_TYPE_ALL, 0);
9598 }
else if (IS_SCHEMA(
child,
"choice")) {
9600 XML_SCHEMA_TYPE_CHOICE, 0);
9602 }
else if (IS_SCHEMA(
child,
"sequence")) {
9604 XML_SCHEMA_TYPE_SEQUENCE, 0);
9611 xmlSchemaPContentErr(ctxt,
9614 "(annotation?, (all | choice | sequence)?)");
9639 if (
delete !=
NULL) {
9687 if (
delete !=
NULL) {
9696xmlSchemaClearSchemaDefaults(xmlSchemaPtr
schema)
9698 if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
9699 schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
9701 if (
schema->flags & XML_SCHEMAS_QUALIF_ATTR)
9702 schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
9704 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
9705 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
9706 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9707 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
9708 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9709 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
9710 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9711 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
9713 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
9714 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
9715 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
9716 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
9717 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
9718 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
9722xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
9728 int res = 0, oldErrs = ctxt->nberrors;
9750 attr = xmlSchemaGetPropNode(
node,
"targetNamespace");
9753 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
9760 attr = xmlSchemaGetPropNode(
node,
"elementFormDefault");
9763 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9764 XML_SCHEMAS_QUALIF_ELEM);
9767 xmlSchemaPSimpleTypeErr(ctxt,
9773 attr = xmlSchemaGetPropNode(
node,
"attributeFormDefault");
9776 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9777 XML_SCHEMAS_QUALIF_ATTR);
9780 xmlSchemaPSimpleTypeErr(ctxt,
9786 attr = xmlSchemaGetPropNode(
node,
"finalDefault");
9789 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9790 XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
9791 XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
9793 XML_SCHEMAS_FINAL_DEFAULT_LIST,
9794 XML_SCHEMAS_FINAL_DEFAULT_UNION);
9797 xmlSchemaPSimpleTypeErr(ctxt,
9800 "(#all | List of (extension | restriction | list | union))",
9804 attr = xmlSchemaGetPropNode(
node,
"blockDefault");
9807 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9808 XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
9809 XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
9810 XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
9813 xmlSchemaPSimpleTypeErr(ctxt,
9816 "(#all | List of (extension | restriction | substitution))",
9822 if (oldErrs != ctxt->nberrors)
9839xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
9843 xmlSchemaAnnotPtr annot;
9844 int res = 0, oldErrs, tmpOldErrs;
9849 oldErrs = ctxt->nberrors;
9851 while ((IS_SCHEMA(
child,
"include")) ||
9852 (IS_SCHEMA(
child,
"import")) ||
9853 (IS_SCHEMA(
child,
"redefine")) ||
9854 (IS_SCHEMA(
child,
"annotation"))) {
9855 if (IS_SCHEMA(
child,
"annotation")) {
9856 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9860 xmlSchemaFreeAnnot(annot);
9861 }
else if (IS_SCHEMA(
child,
"import")) {
9862 tmpOldErrs = ctxt->nberrors;
9866 if (tmpOldErrs != ctxt->nberrors)
9868 }
else if (IS_SCHEMA(
child,
"include")) {
9869 tmpOldErrs = ctxt->nberrors;
9873 if (tmpOldErrs != ctxt->nberrors)
9875 }
else if (IS_SCHEMA(
child,
"redefine")) {
9876 tmpOldErrs = ctxt->nberrors;
9880 if (tmpOldErrs != ctxt->nberrors)
9890 if (IS_SCHEMA(
child,
"complexType")) {
9891 xmlSchemaParseComplexType(ctxt,
schema,
child, 1);
9893 }
else if (IS_SCHEMA(
child,
"simpleType")) {
9896 }
else if (IS_SCHEMA(
child,
"element")) {
9899 }
else if (IS_SCHEMA(
child,
"attribute")) {
9900 xmlSchemaParseGlobalAttribute(ctxt,
schema,
child);
9902 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
9903 xmlSchemaParseAttributeGroupDefinition(ctxt,
schema,
child);
9905 }
else if (IS_SCHEMA(
child,
"group")) {
9906 xmlSchemaParseModelGroupDefinition(ctxt,
schema,
child);
9908 }
else if (IS_SCHEMA(
child,
"notation")) {
9912 xmlSchemaPContentErr(ctxt,
9915 NULL,
"((include | import | redefine | annotation)*, "
9916 "(((simpleType | complexType | group | attributeGroup) "
9917 "| element | attribute | notation), annotation*)*)");
9920 while (IS_SCHEMA(
child,
"annotation")) {
9924 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9928 xmlSchemaFreeAnnot(annot);
9933 ctxt->ctxtType =
NULL;
9934 if (oldErrs != ctxt->nberrors)
9941static xmlSchemaSchemaRelationPtr
9942xmlSchemaSchemaRelationCreate(
void)
9944 xmlSchemaSchemaRelationPtr
ret;
9946 ret = (xmlSchemaSchemaRelationPtr)
9947 xmlMalloc(
sizeof(xmlSchemaSchemaRelation));
9949 xmlSchemaPErrMemory(
NULL,
"allocating schema relation",
NULL);
9952 memset(
ret, 0,
sizeof(xmlSchemaSchemaRelation));
9958xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
9965xmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
9967 xmlSchemaRedefPtr prev;
9969 while (redef !=
NULL) {
9971 redef = redef->next;
9977xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
9985 if (con->buckets !=
NULL)
9986 xmlSchemaItemListFree(con->buckets);
9987 if (con->pending !=
NULL)
9988 xmlSchemaItemListFree(con->pending);
9989 if (con->substGroups !=
NULL)
9990 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
9991 if (con->redefs !=
NULL)
9992 xmlSchemaRedefListFree(con->redefs);
9993 if (con->dict !=
NULL)
9998static xmlSchemaConstructionCtxtPtr
9999xmlSchemaConstructionCtxtCreate(
xmlDictPtr dict)
10001 xmlSchemaConstructionCtxtPtr
ret;
10003 ret = (xmlSchemaConstructionCtxtPtr)
10004 xmlMalloc(
sizeof(xmlSchemaConstructionCtxt));
10006 xmlSchemaPErrMemory(
NULL,
10007 "allocating schema construction context",
NULL);
10010 memset(
ret, 0,
sizeof(xmlSchemaConstructionCtxt));
10012 ret->buckets = xmlSchemaItemListCreate();
10014 xmlSchemaPErrMemory(
NULL,
10015 "allocating list of schema buckets",
NULL);
10019 ret->pending = xmlSchemaItemListCreate();
10021 xmlSchemaPErrMemory(
NULL,
10022 "allocating list of pending global components",
NULL);
10023 xmlSchemaConstructionCtxtFree(
ret);
10031static xmlSchemaParserCtxtPtr
10032xmlSchemaParserCtxtCreate(
void)
10034 xmlSchemaParserCtxtPtr
ret;
10036 ret = (xmlSchemaParserCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaParserCtxt));
10038 xmlSchemaPErrMemory(
NULL,
"allocating schema parser context",
10042 memset(
ret, 0,
sizeof(xmlSchemaParserCtxt));
10043 ret->type = XML_SCHEMA_CTXT_PARSER;
10044 ret->attrProhibs = xmlSchemaItemListCreate();
10045 if (
ret->attrProhibs ==
NULL) {
10062static xmlSchemaParserCtxtPtr
10063xmlSchemaNewParserCtxtUseDict(
const char *URL,
xmlDictPtr dict)
10065 xmlSchemaParserCtxtPtr
ret;
10067 ret = xmlSchemaParserCtxtCreate();
10078xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
10080 if (vctxt->pctxt ==
NULL) {
10081 if (vctxt->schema !=
NULL)
10083 xmlSchemaNewParserCtxtUseDict(
"*", vctxt->schema->dict);
10085 vctxt->pctxt = xmlSchemaNewParserCtxt(
"*");
10086 if (vctxt->pctxt ==
NULL) {
10087 VERROR_INT(
"xmlSchemaCreatePCtxtOnVCtxt",
10088 "failed to create a temp. parser context");
10092 xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
10093 vctxt->warning, vctxt->errCtxt);
10094 xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
10110static xmlSchemaBucketPtr
10111xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10112 const xmlChar *schemaLocation)
10114 xmlSchemaBucketPtr
cur;
10115 xmlSchemaItemListPtr
list;
10117 list = pctxt->constructor->buckets;
10118 if (
list->nbItems == 0)
10122 for (
i = 0;
i <
list->nbItems;
i++) {
10123 cur = (xmlSchemaBucketPtr)
list->items[
i];
10125 if (
cur->schemaLocation == schemaLocation)
10132static xmlSchemaBucketPtr
10133xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10134 const xmlChar *schemaLocation,
10135 const xmlChar *targetNamespace)
10137 xmlSchemaBucketPtr
cur;
10138 xmlSchemaItemListPtr
list;
10140 list = pctxt->constructor->buckets;
10141 if (
list->nbItems == 0)
10145 for (
i = 0;
i <
list->nbItems;
i++) {
10146 cur = (xmlSchemaBucketPtr)
list->items[
i];
10148 if ((
cur->origTargetNamespace ==
NULL) &&
10149 (
cur->schemaLocation == schemaLocation) &&
10150 (
cur->targetNamespace == targetNamespace))
10158#define IS_BAD_SCHEMA_DOC(b) \
10159 (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
10161static xmlSchemaBucketPtr
10162xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
10163 const xmlChar *targetNamespace,
10166 xmlSchemaBucketPtr
cur;
10167 xmlSchemaItemListPtr
list;
10169 list = pctxt->constructor->buckets;
10170 if (
list->nbItems == 0)
10174 for (
i = 0;
i <
list->nbItems;
i++) {
10175 cur = (xmlSchemaBucketPtr)
list->items[
i];
10176 if ((! IS_BAD_SCHEMA_DOC(
cur)) &&
10177 (
cur->origTargetNamespace == targetNamespace) &&
10178 ((imported &&
cur->imported) ||
10179 ((!imported) && (!
cur->imported))))
10187xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
10189 xmlSchemaBucketPtr bucket)
10195 xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
10203 oldFlags =
schema->flags;
10206 xmlSchemaClearSchemaDefaults(
schema);
10207 schema->doc = bucket->doc;
10213 pctxt->targetNamespace = bucket->targetNamespace;
10214 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
10216 if ((bucket->targetNamespace !=
NULL) &&
10217 xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
10233 oldErrs = pctxt->nberrors;
10234 ret = xmlSchemaParseSchemaTopLevel(pctxt,
schema,
node->children);
10242 if ((
ret == 0) && (oldErrs != pctxt->nberrors)) {
10248 WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
10251 schema->flags = oldFlags;
10256xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
10258 xmlSchemaBucketPtr bucket)
10260 xmlSchemaParserCtxtPtr newpctxt;
10263 if (bucket ==
NULL)
10265 if (bucket->parsed) {
10266 PERROR_INT(
"xmlSchemaParseNewDoc",
10267 "reparsing a schema doc");
10270 if (bucket->doc ==
NULL) {
10271 PERROR_INT(
"xmlSchemaParseNewDoc",
10272 "parsing a schema doc, but there's no doc");
10275 if (pctxt->constructor ==
NULL) {
10276 PERROR_INT(
"xmlSchemaParseNewDoc",
10281 newpctxt = xmlSchemaNewParserCtxtUseDict(
10282 (
const char *) bucket->schemaLocation, pctxt->dict);
10283 if (newpctxt ==
NULL)
10285 newpctxt->constructor = pctxt->constructor;
10291 newpctxt->schema =
schema;
10292 xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
10294 xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
10296 newpctxt->counter = pctxt->counter;
10299 res = xmlSchemaParseNewDocWithContext(newpctxt,
schema, bucket);
10304 pctxt->nberrors += newpctxt->nberrors;
10305 pctxt->counter = newpctxt->counter;
10306 newpctxt->constructor =
NULL;
10308 xmlSchemaFreeParserCtxt(newpctxt);
10313xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
10314 xmlSchemaSchemaRelationPtr rel)
10316 xmlSchemaSchemaRelationPtr
cur = bucket->relations;
10319 bucket->relations = rel;
10336 if (ctxtNode ==
NULL)
10374xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
10376 const xmlChar *schemaLocation,
10378 const char *schemaBuffer,
10379 int schemaBufferLen,
10381 const xmlChar *sourceTargetNamespace,
10382 const xmlChar *importNamespace,
10383 xmlSchemaBucketPtr *bucket)
10386 xmlSchemaSchemaRelationPtr relation =
NULL;
10388 int res = 0,
err = 0, located = 0, preserveDoc = 0;
10389 xmlSchemaBucketPtr bkt =
NULL;
10391 if (bucket !=
NULL)
10395 case XML_SCHEMA_SCHEMA_IMPORT:
10396 case XML_SCHEMA_SCHEMA_MAIN:
10399 case XML_SCHEMA_SCHEMA_INCLUDE:
10402 case XML_SCHEMA_SCHEMA_REDEFINE:
10412 if ((
type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
10416 if (schemaLocation !=
NULL) {
10417 bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
10418 if ((bkt !=
NULL) &&
10419 (pctxt->constructor->bucket == bkt)) {
10422 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10423 invokingNode,
NULL,
10424 "The schema must not import/include/redefine itself",
10432 relation = xmlSchemaSchemaRelationCreate();
10433 if (relation ==
NULL)
10435 xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
10437 relation->type =
type;
10442 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10443 relation->importNamespace = importNamespace;
10444 if (schemaLocation ==
NULL) {
10452 targetNamespace = importNamespace;
10457 if ((WXS_IS_BUCKET_IMPMAIN(
type)) && (! bkt->imported)) {
10462 if (schemaLocation ==
NULL)
10463 schemaLocation =
BAD_CAST "in_memory_buffer";
10465 bkt->schemaLocation)) {
10466 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10467 invokingNode,
NULL,
10468 "The schema document '%s' cannot be imported, since "
10469 "it was already included or redefined",
10470 schemaLocation,
NULL);
10473 }
else if ((! WXS_IS_BUCKET_IMPMAIN(
type)) && (bkt->imported)) {
10479 if (schemaLocation ==
NULL)
10480 schemaLocation =
BAD_CAST "in_memory_buffer";
10482 bkt->schemaLocation)) {
10483 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10484 invokingNode,
NULL,
10485 "The schema document '%s' cannot be included or "
10486 "redefined, since it was already imported",
10487 schemaLocation,
NULL);
10493 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10515 relation->bucket = bkt;
10518 bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
10519 importNamespace, 1);
10522 relation->bucket = bkt;
10523 if (bkt->schemaLocation ==
NULL) {
10525 bkt->schemaLocation = schemaLocation;
10528 bkt->schemaLocation)) {
10534 if (schemaLocation ==
NULL)
10535 schemaLocation =
BAD_CAST "in_memory_buffer";
10537 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10539 invokingNode,
NULL,
10540 "Skipping import of schema located at '%s' for the "
10541 "namespace '%s', since this namespace was already "
10542 "imported with the schema located at '%s'",
10543 schemaLocation, importNamespace, bkt->schemaLocation);
10556 if ((bkt->origTargetNamespace ==
NULL) &&
10557 (bkt->targetNamespace != sourceTargetNamespace)) {
10558 xmlSchemaBucketPtr chamel;
10577 chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
10578 schemaLocation, sourceTargetNamespace);
10579 if (chamel !=
NULL) {
10581 relation->bucket = chamel;
10593 relation->bucket = bkt;
10598 if ((bkt !=
NULL) && (bkt->doc !=
NULL)) {
10599 PERROR_INT(
"xmlSchemaAddSchemaDoc",
10600 "trying to load a schema doc, but a doc is already "
10601 "assigned to the schema bucket");
10609 if (schemaDoc !=
NULL) {
10616 schemaDoc->
URL, -1);
10618 schemaLocation =
BAD_CAST "in_memory_buffer";
10619 }
else if ((schemaLocation !=
NULL) || (schemaBuffer !=
NULL)) {
10623 if (parserCtxt ==
NULL) {
10624 xmlSchemaPErrMemory(
NULL,
"xmlSchemaGetDoc, "
10625 "allocating a parser context",
NULL);
10628 if ((pctxt->dict !=
NULL) && (parserCtxt->
dict !=
NULL)) {
10637 if (schemaLocation !=
NULL) {
10640 NULL, SCHEMAS_PARSE_OPTIONS);
10641 }
else if (schemaBuffer !=
NULL) {
10644 NULL,
NULL, SCHEMAS_PARSE_OPTIONS);
10645 schemaLocation =
BAD_CAST "in_memory_buffer";
10678 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10679 invokingNode,
NULL,
10680 "Failed to parse the XML resource '%s'",
10681 schemaLocation,
NULL);
10685 if ((doc ==
NULL) && located)
10688 xmlSchemaPErr(pctxt,
NULL,
10690 "No information for parsing was provided with the "
10691 "given schema parser context.\n",
10703 if (docElem ==
NULL) {
10705 invokingNode,
NULL,
10706 "The document '%s' has no document element",
10707 schemaLocation,
NULL);
10713 xmlSchemaCleanupDoc(pctxt, docElem);
10717 if (!IS_SCHEMA(docElem,
"schema")) {
10719 invokingNode,
NULL,
10720 "The XML document '%s' is not a schema document",
10721 schemaLocation,
NULL);
10728 targetNamespace = xmlSchemaGetProp(pctxt, docElem,
10729 "targetNamespace");
10733 if ((bkt ==
NULL) && located) {
10735 bkt = xmlSchemaBucketCreate(pctxt,
type,
10741 bkt->schemaLocation = schemaLocation;
10742 bkt->located = located;
10745 bkt->targetNamespace = targetNamespace;
10746 bkt->origTargetNamespace = targetNamespace;
10748 bkt->preserveDoc = 1;
10750 if (WXS_IS_BUCKET_IMPMAIN(
type))
10755 if (relation !=
NULL)
10756 relation->bucket = bkt;
10764 if (bucket !=
NULL)
10769 if ((doc !=
NULL) && (! preserveDoc)) {
10774 return(pctxt->err);
10777 if ((doc !=
NULL) && (! preserveDoc)) {
10798xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
10803 const xmlChar *thisTargetNamespace;
10806 xmlSchemaBucketPtr bucket =
NULL;
10820 xmlSchemaPIllegalAttrErr(pctxt,
10824 xmlSchemaPIllegalAttrErr(pctxt,
10832 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10833 "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10834 &namespaceName) != 0) {
10835 xmlSchemaPSimpleTypeErr(pctxt,
10838 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10840 return (pctxt->err);
10843 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10844 "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10845 &schemaLocation) != 0) {
10846 xmlSchemaPSimpleTypeErr(pctxt,
10849 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10851 return (pctxt->err);
10857 if (IS_SCHEMA(
child,
"annotation")) {
10865 xmlSchemaPContentErr(pctxt,
10878 thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
10879 if (namespaceName !=
NULL) {
10885 if (
xmlStrEqual(thisTargetNamespace, namespaceName)) {
10886 xmlSchemaPCustomErr(pctxt,
10889 "The value of the attribute 'namespace' must not match "
10890 "the target namespace '%s' of the importing schema",
10891 thisTargetNamespace);
10892 return (pctxt->err);
10899 if (thisTargetNamespace ==
NULL) {
10900 xmlSchemaPCustomErr(pctxt,
10903 "The attribute 'namespace' must be existent if "
10904 "the importing schema has no target namespace",
10906 return (pctxt->err);
10912 if (schemaLocation !=
NULL)
10913 schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
10914 schemaLocation,
node);
10915 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
10916 schemaLocation,
NULL,
NULL, 0,
node, thisTargetNamespace,
10917 namespaceName, &bucket);
10929 if ((bucket ==
NULL) && (schemaLocation !=
NULL)) {
10930 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10933 "Failed to locate a schema at location '%s'. "
10934 "Skipping the import", schemaLocation,
NULL,
NULL);
10937 if ((bucket !=
NULL) && CAN_PARSE_SCHEMA(bucket)) {
10938 ret = xmlSchemaParseNewDoc(pctxt,
schema, bucket);
10945xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
10954 (schemaLocation ==
NULL))
10957 *schemaLocation =
NULL;
10967 xmlSchemaPIllegalAttrErr(pctxt,
10971 xmlSchemaPIllegalAttrErr(pctxt,
10984 attr = xmlSchemaGetPropNode(
node,
"schemaLocation");
10989 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
10990 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10991 (
const xmlChar **) schemaLocation) != 0)
11001 PERROR_INT(
"xmlSchemaParseIncludeOrRedefine",
11002 "could not build an URI from the schemaLocation")
11008 xmlSchemaPMissingAttrErr(pctxt,
11017 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11018 xmlSchemaPCustomErr(pctxt,
11021 "The schema document '%s' cannot redefine itself.",
11024 xmlSchemaPCustomErr(pctxt,
11027 "The schema document '%s' cannot include itself.",
11035 return(pctxt->err);
11041xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
11049 int isChameleon = 0, wasChameleon = 0;
11050 xmlSchemaBucketPtr bucket =
NULL;
11059 res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt,
schema,
11066 res = xmlSchemaAddSchemaDoc(pctxt,
type, schemaLocation,
NULL,
11067 NULL, 0,
node, pctxt->targetNamespace,
NULL, &bucket);
11075 if ((bucket ==
NULL) || (bucket->doc ==
NULL)) {
11076 if (
type == XML_SCHEMA_SCHEMA_INCLUDE) {
11089 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
11091 "Failed to load the document '%s' for inclusion",
11092 schemaLocation,
NULL);
11106 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
11108 "Failed to load the document '%s' for redefinition",
11109 schemaLocation,
NULL);
11117 if (bucket->origTargetNamespace !=
NULL) {
11124 if (pctxt->targetNamespace ==
NULL) {
11125 xmlSchemaCustomErr(ACTXT_CAST pctxt,
11128 "The target namespace of the included/redefined schema "
11129 "'%s' has to be absent, since the including/redefining "
11130 "schema has no target namespace",
11131 schemaLocation,
NULL);
11133 }
else if (!
xmlStrEqual(bucket->origTargetNamespace,
11134 pctxt->targetNamespace)) {
11136 xmlSchemaPCustomErrExt(pctxt,
11139 "The target namespace '%s' of the included/redefined "
11140 "schema '%s' differs from '%s' of the "
11141 "including/redefining schema",
11142 bucket->origTargetNamespace, schemaLocation,
11143 pctxt->targetNamespace);
11146 }
else if (pctxt->targetNamespace !=
NULL) {
11152 if (bucket->parsed &&
11153 bucket->origTargetNamespace !=
NULL) {
11154 xmlSchemaCustomErr(ACTXT_CAST pctxt,
11157 "The target namespace of the included/redefined schema "
11158 "'%s' has to be absent or the same as the "
11159 "including/redefining schema's target namespace",
11160 schemaLocation,
NULL);
11163 bucket->targetNamespace = pctxt->targetNamespace;
11169 if (bucket && (!bucket->parsed) && (bucket->doc !=
NULL)) {
11172 if ((
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
11173 schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11177 xmlSchemaParseNewDoc(pctxt,
schema, bucket);
11179 if (isChameleon && (!wasChameleon))
11180 schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11186 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11190 pctxt->redefined = bucket;
11194 pctxt->isRedefine = 1;
11195 while (IS_SCHEMA(
child,
"annotation") ||
11196 IS_SCHEMA(
child,
"simpleType") ||
11197 IS_SCHEMA(
child,
"complexType") ||
11198 IS_SCHEMA(
child,
"group") ||
11199 IS_SCHEMA(
child,
"attributeGroup")) {
11200 if (IS_SCHEMA(
child,
"annotation")) {
11204 }
else if (IS_SCHEMA(
child,
"simpleType")) {
11205 xmlSchemaParseSimpleType(pctxt,
schema,
child, 1);
11206 }
else if (IS_SCHEMA(
child,
"complexType")) {
11207 xmlSchemaParseComplexType(pctxt,
schema,
child, 1);
11209 }
else if (IS_SCHEMA(
child,
"group")) {
11211 xmlSchemaParseModelGroupDefinition(pctxt,
11213 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
11215 xmlSchemaParseAttributeGroupDefinition(pctxt,
schema,
11220 pctxt->redefined =
NULL;
11221 pctxt->isRedefine = 0;
11223 if (IS_SCHEMA(
child,
"annotation")) {
11232 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11233 xmlSchemaPContentErr(pctxt,
res,
11235 "(annotation | (simpleType | complexType | group | attributeGroup))*");
11237 xmlSchemaPContentErr(pctxt,
res,
11245 return(pctxt->err);
11249xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11253#ifndef ENABLE_REDEFINE
11258 XML_SCHEMA_SCHEMA_REDEFINE);
11265xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11271 XML_SCHEMA_SCHEMA_INCLUDE);
11302static xmlSchemaTreeItemPtr
11303xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11307 xmlSchemaModelGroupPtr
item;
11308 xmlSchemaParticlePtr particle =
NULL;
11311 int min = 1,
max = 1, isElemRef, hasRefs = 0;
11322 if (withParticle) {
11323 if (
type == XML_SCHEMA_TYPE_ALL) {
11324 min = xmlGetMinOccurs(ctxt,
node, 0, 1, 1,
"(0 | 1)");
11325 max = xmlGetMaxOccurs(ctxt,
node, 1, 1, 1,
"1");
11328 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
11329 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
11330 "(xs:nonNegativeInteger | unbounded)");
11336 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
11337 if (particle ==
NULL)
11339 particle->children = (xmlSchemaTreeItemPtr)
item;
11349 xmlSchemaPIllegalAttrErr(ctxt,
11353 xmlSchemaPIllegalAttrErr(ctxt,
11366 xmlSchemaPIllegalAttrErr(ctxt,
11370 xmlSchemaPIllegalAttrErr(ctxt,
11385 if (IS_SCHEMA(
child,
"annotation")) {
11386 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
11389 if (
type == XML_SCHEMA_TYPE_ALL) {
11390 xmlSchemaParticlePtr part,
last =
NULL;
11392 while (IS_SCHEMA(
child,
"element")) {
11393 part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
11400 if (part !=
NULL) {
11403 if (part->minOccurs > 1) {
11404 xmlSchemaPCustomErr(ctxt,
11407 "Invalid value for minOccurs (must be 0 or 1)",
11410 part->minOccurs = 1;
11412 if (part->maxOccurs > 1) {
11413 xmlSchemaPCustomErr(ctxt,
11416 "Invalid value for maxOccurs (must be 0 or 1)",
11419 part->maxOccurs = 1;
11422 item->children = (xmlSchemaTreeItemPtr) part;
11424 last->next = (xmlSchemaTreeItemPtr) part;
11430 xmlSchemaPContentErr(ctxt,
11433 "(annotation?, (annotation?, element*)");
11439 while ((IS_SCHEMA(
child,
"element")) ||
11440 (IS_SCHEMA(
child,
"group")) ||
11441 (IS_SCHEMA(
child,
"any")) ||
11442 (IS_SCHEMA(
child,
"choice")) ||
11443 (IS_SCHEMA(
child,
"sequence"))) {
11445 if (IS_SCHEMA(
child,
"element")) {
11446 part = (xmlSchemaTreeItemPtr)
11447 xmlSchemaParseElement(ctxt,
schema,
child, &isElemRef, 0);
11448 if (part && isElemRef)
11450 }
else if (IS_SCHEMA(
child,
"group")) {
11452 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11458 if (ctxt->isRedefine && ctxt->redef &&
11459 (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
11460 part && part->children)
11462 if ((xmlSchemaGetQNameRefName(part->children) ==
11463 ctxt->redef->refName) &&
11464 (xmlSchemaGetQNameRefTargetNs(part->children) ==
11465 ctxt->redef->refTargetNs))
11476 if (ctxt->redefCounter != 0) {
11479 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11481 "The redefining model group definition "
11482 "'%s' must not contain more than one "
11483 "reference to the redefined definition",
11484 xmlSchemaFormatQName(&
str,
11485 ctxt->redef->refTargetNs,
11486 ctxt->redef->refName),
11490 }
else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
11491 ((WXS_PARTICLE(part))->maxOccurs != 1))
11500 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11502 "The redefining model group definition "
11503 "'%s' must not contain a reference to the "
11504 "redefined definition with a "
11505 "maxOccurs/minOccurs other than 1",
11506 xmlSchemaFormatQName(&
str,
11507 ctxt->redef->refTargetNs,
11508 ctxt->redef->refName),
11513 ctxt->redef->reference = WXS_BASIC_CAST part;
11514 ctxt->redefCounter++;
11517 }
else if (IS_SCHEMA(
child,
"any")) {
11518 part = (xmlSchemaTreeItemPtr)
11520 }
else if (IS_SCHEMA(
child,
"choice")) {
11521 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11522 XML_SCHEMA_TYPE_CHOICE, 1);
11523 }
else if (IS_SCHEMA(
child,
"sequence")) {
11524 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11525 XML_SCHEMA_TYPE_SEQUENCE, 1);
11527 if (part !=
NULL) {
11529 item->children = part;
11537 xmlSchemaPContentErr(ctxt,
11540 "(annotation?, (element | group | choice | sequence | any)*)");
11543 if ((
max == 0) && (
min == 0))
11549 WXS_ADD_PENDING(ctxt,
item);
11552 return ((xmlSchemaTreeItemPtr) particle);
11554 return ((xmlSchemaTreeItemPtr)
item);
11568static xmlSchemaTypePtr
11569xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11572 xmlSchemaTypePtr
type;
11579 type = ctxt->ctxtType;
11580 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
11590 xmlSchemaPIllegalAttrErr(ctxt,
11594 xmlSchemaPIllegalAttrErr(ctxt,
11616 &(
type->baseNs), &(
type->base)) == 0)
11618 if ((
type->base ==
NULL) && (
type->type == XML_SCHEMA_TYPE_COMPLEX)) {
11619 xmlSchemaPMissingAttrErr(ctxt,
11622 }
else if ((ctxt->isRedefine) &&
11623 (
type->flags & XML_SCHEMAS_TYPE_GLOBAL))
11626 xmlSchemaPMissingAttrErr(ctxt,
11641 NULL,
node,
"This is a redefinition, but the QName "
11642 "value '%s' of the 'base' attribute does not match the "
11643 "type's designation '%s'",
11644 xmlSchemaFormatQName(&str1,
type->baseNs,
type->base),
11645 xmlSchemaFormatQName(&str2,
type->targetNamespace,
11647 FREE_AND_NULL(str1);
11648 FREE_AND_NULL(str2);
11659 if (IS_SCHEMA(
child,
"annotation")) {
11663 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11664 xmlSchemaParseAnnotation(ctxt,
child, 1));
11667 if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
11671 if (IS_SCHEMA(
child,
"simpleType")) {
11678 xmlSchemaPContentErr(ctxt,
11681 "The attribute 'base' and the <simpleType> child are "
11682 "mutually exclusive",
NULL);
11684 type->baseType = (xmlSchemaTypePtr)
11685 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11689 xmlSchemaPContentErr(ctxt,
11692 "Either the attribute 'base' or a <simpleType> child "
11693 "must be present",
NULL);
11695 }
else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11702 if (IS_SCHEMA(
child,
"all")) {
11703 type->subtypes = (xmlSchemaTypePtr)
11705 XML_SCHEMA_TYPE_ALL, 1);
11707 }
else if (IS_SCHEMA(
child,
"choice")) {
11708 type->subtypes = (xmlSchemaTypePtr)
11709 xmlSchemaParseModelGroup(ctxt,
11712 }
else if (IS_SCHEMA(
child,
"sequence")) {
11713 type->subtypes = (xmlSchemaTypePtr)
11715 XML_SCHEMA_TYPE_SEQUENCE, 1);
11720 }
else if (IS_SCHEMA(
child,
"group")) {
11721 type->subtypes = (xmlSchemaTypePtr)
11722 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11729 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11736 if (IS_SCHEMA(
child,
"simpleType")) {
11741 type->contentTypeDef = (xmlSchemaTypePtr)
11742 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11743 if (
type->contentTypeDef ==
NULL)
11749 if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
11750 (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
11751 xmlSchemaFacetPtr facet, lastfacet =
NULL;
11765 while ((IS_SCHEMA(
child,
"minInclusive")) ||
11766 (IS_SCHEMA(
child,
"minExclusive")) ||
11767 (IS_SCHEMA(
child,
"maxInclusive")) ||
11768 (IS_SCHEMA(
child,
"maxExclusive")) ||
11769 (IS_SCHEMA(
child,
"totalDigits")) ||
11770 (IS_SCHEMA(
child,
"fractionDigits")) ||
11771 (IS_SCHEMA(
child,
"pattern")) ||
11772 (IS_SCHEMA(
child,
"enumeration")) ||
11773 (IS_SCHEMA(
child,
"whiteSpace")) ||
11774 (IS_SCHEMA(
child,
"length")) ||
11775 (IS_SCHEMA(
child,
"maxLength")) ||
11776 (IS_SCHEMA(
child,
"minLength"))) {
11777 facet = xmlSchemaParseFacet(ctxt,
schema,
child);
11778 if (facet !=
NULL) {
11779 if (lastfacet ==
NULL)
11780 type->facets = facet;
11782 lastfacet->next = facet;
11784 lastfacet->next =
NULL;
11792 xmlSchemaFacetLinkPtr facetLink, lastFacetLink =
NULL;
11794 facet =
type->facets;
11796 facetLink = (xmlSchemaFacetLinkPtr)
11798 if (facetLink ==
NULL) {
11799 xmlSchemaPErrMemory(ctxt,
"allocating a facet link",
NULL);
11803 facetLink->facet = facet;
11804 facetLink->next =
NULL;
11805 if (lastFacetLink ==
NULL)
11806 type->facetSet = facetLink;
11808 lastFacetLink->
next = facetLink;
11809 lastFacetLink = facetLink;
11810 facet = facet->next;
11811 }
while (facet !=
NULL);
11814 if (
type->type == XML_SCHEMA_TYPE_COMPLEX) {
11818 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11819 (xmlSchemaItemListPtr *) &(
type->attrUses),
11820 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
11825 if (IS_SCHEMA(
child,
"anyAttribute")) {
11826 type->attributeWildcard =
11832 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11833 xmlSchemaPContentErr(ctxt,
11836 "annotation?, (group | all | choice | sequence)?, "
11837 "((attribute | attributeGroup)*, anyAttribute?))");
11838 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11839 xmlSchemaPContentErr(ctxt,
11842 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11843 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11844 "length | minLength | maxLength | enumeration | whiteSpace | "
11845 "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
11848 xmlSchemaPContentErr(ctxt,
11851 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11852 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11853 "length | minLength | maxLength | enumeration | whiteSpace | "
11872static xmlSchemaTypePtr
11873xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11876 xmlSchemaTypePtr
type;
11883 type = ctxt->ctxtType;
11884 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
11894 xmlSchemaPIllegalAttrErr(ctxt,
11898 xmlSchemaPIllegalAttrErr(ctxt,
11910 "base", &(
type->baseNs), &(
type->base)) == 0) &&
11912 xmlSchemaPMissingAttrErr(ctxt,
11920 if (IS_SCHEMA(
child,
"annotation")) {
11924 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11925 xmlSchemaParseAnnotation(ctxt,
child, 1));
11928 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11934 if (IS_SCHEMA(
child,
"all")) {
11935 type->subtypes = (xmlSchemaTypePtr)
11936 xmlSchemaParseModelGroup(ctxt,
schema,
11937 child, XML_SCHEMA_TYPE_ALL, 1);
11939 }
else if (IS_SCHEMA(
child,
"choice")) {
11940 type->subtypes = (xmlSchemaTypePtr)
11941 xmlSchemaParseModelGroup(ctxt,
schema,
11942 child, XML_SCHEMA_TYPE_CHOICE, 1);
11944 }
else if (IS_SCHEMA(
child,
"sequence")) {
11945 type->subtypes = (xmlSchemaTypePtr)
11946 xmlSchemaParseModelGroup(ctxt,
schema,
11947 child, XML_SCHEMA_TYPE_SEQUENCE, 1);
11949 }
else if (IS_SCHEMA(
child,
"group")) {
11950 type->subtypes = (xmlSchemaTypePtr)
11951 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11963 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11964 (xmlSchemaItemListPtr *) &(
type->attrUses),
11965 XML_SCHEMA_TYPE_EXTENSION,
NULL) == -1)
11970 if (IS_SCHEMA(
child,
"anyAttribute")) {
11971 ctxt->ctxtType->attributeWildcard =
11977 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11979 xmlSchemaPContentErr(ctxt,
11982 "(annotation?, ((group | all | choice | sequence)?, "
11983 "((attribute | attributeGroup)*, anyAttribute?)))");
11986 xmlSchemaPContentErr(ctxt,
11989 "(annotation?, ((attribute | attributeGroup)*, "
11990 "anyAttribute?))");
12008xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
12010 int *hasRestrictionOrExtension)
12012 xmlSchemaTypePtr
type;
12017 (hasRestrictionOrExtension ==
NULL))
12019 *hasRestrictionOrExtension = 0;
12021 type = ctxt->ctxtType;
12022 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
12030 xmlSchemaPIllegalAttrErr(ctxt,
12034 xmlSchemaPIllegalAttrErr(ctxt,
12046 if (IS_SCHEMA(
child,
"annotation")) {
12050 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
12051 xmlSchemaParseAnnotation(ctxt,
child, 1));
12055 xmlSchemaPContentErr(ctxt,
12058 "(annotation?, (restriction | extension))");
12061 xmlSchemaPContentErr(ctxt,
12064 "(annotation?, (restriction | extension))");
12066 if (IS_SCHEMA(
child,
"restriction")) {
12068 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
12069 (*hasRestrictionOrExtension) = 1;
12071 }
else if (IS_SCHEMA(
child,
"extension")) {
12073 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
12074 (*hasRestrictionOrExtension) = 1;
12078 xmlSchemaPContentErr(ctxt,
12081 "(annotation?, (restriction | extension))");
12098xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
12100 int *hasRestrictionOrExtension)
12102 xmlSchemaTypePtr
type;
12107 (hasRestrictionOrExtension ==
NULL))
12109 *hasRestrictionOrExtension = 0;
12111 type = ctxt->ctxtType;
12121 xmlSchemaPIllegalAttrErr(ctxt,
12125 xmlSchemaPIllegalAttrErr(ctxt,
12136 if (xmlGetBooleanProp(ctxt,
node,
"mixed", 0)) {
12137 if ((
type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
12138 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12141 if (IS_SCHEMA(
child,
"annotation")) {
12145 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
12146 xmlSchemaParseAnnotation(ctxt,
child, 1));
12150 xmlSchemaPContentErr(ctxt,
12153 NULL,
"(annotation?, (restriction | extension))");
12156 xmlSchemaPContentErr(ctxt,
12159 NULL,
"(annotation?, (restriction | extension))");
12161 if (IS_SCHEMA(
child,
"restriction")) {
12163 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12164 (*hasRestrictionOrExtension) = 1;
12166 }
else if (IS_SCHEMA(
child,
"extension")) {
12168 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12169 (*hasRestrictionOrExtension) = 1;
12173 xmlSchemaPContentErr(ctxt,
12176 NULL,
"(annotation?, (restriction | extension))");
12192static xmlSchemaTypePtr
12193xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
12196 xmlSchemaTypePtr
type, ctxtType;
12201#ifdef ENABLE_NAMED_LOCALS
12204 int final = 0,
block = 0, hasRestrictionOrExtension = 0;
12210 ctxtType = ctxt->ctxtType;
12213 attr = xmlSchemaGetPropNode(
node,
"name");
12215 xmlSchemaPMissingAttrErr(ctxt,
12218 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
12219 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
12224 if (topLevel == 0) {
12228#ifdef ENABLE_NAMED_LOCALS
12231 XML_SCHEMA_TYPE_COMPLEX,
12233 ctxt->targetNamespace,
node, 0);
12236 XML_SCHEMA_TYPE_COMPLEX,
12237 NULL, ctxt->targetNamespace,
node, 0);
12243 type->type = XML_SCHEMA_TYPE_COMPLEX;
12252 XML_SCHEMA_TYPE_COMPLEX,
12253 name, ctxt->targetNamespace,
node, 1);
12257 type->type = XML_SCHEMA_TYPE_COMPLEX;
12258 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
12260 type->targetNamespace = ctxt->targetNamespace;
12276 if (xmlSchemaPGetBoolNodeValue(ctxt,
12278 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12279 }
else if (topLevel) {
12289 if (xmlSchemaPGetBoolNodeValue(ctxt,
12291 type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
12296 attrValue = xmlSchemaGetNodeContent(ctxt,
12298 if (xmlSchemaPValAttrBlockFinal(attrValue,
12301 XML_SCHEMAS_TYPE_FINAL_EXTENSION,
12302 XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
12305 xmlSchemaPSimpleTypeErr(ctxt,
12308 "(#all | List of (extension | restriction))",
12316 attrValue = xmlSchemaGetNodeContent(ctxt,
12318 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
12320 XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
12321 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
12322 -1, -1, -1) != 0) {
12323 xmlSchemaPSimpleTypeErr(ctxt,
12326 "(#all | List of (extension | restriction)) ",
12331 xmlSchemaPIllegalAttrErr(ctxt,
12335 xmlSchemaPIllegalAttrErr(ctxt,
12339 xmlSchemaPIllegalAttrErr(ctxt,
12348 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
12349 type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
12350 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
12351 type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
12357 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
12358 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
12359 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
12360 type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
12366 if (IS_SCHEMA(
child,
"annotation")) {
12367 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
12370 ctxt->ctxtType =
type;
12371 if (IS_SCHEMA(
child,
"simpleContent")) {
12378 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
12379 type->flags ^= XML_SCHEMAS_TYPE_MIXED;
12381 &hasRestrictionOrExtension);
12383 }
else if (IS_SCHEMA(
child,
"complexContent")) {
12387 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
12388 xmlSchemaParseComplexContent(ctxt,
schema,
child,
12389 &hasRestrictionOrExtension);
12401 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
12402 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
12406 if (IS_SCHEMA(
child,
"all")) {
12407 type->subtypes = (xmlSchemaTypePtr)
12409 XML_SCHEMA_TYPE_ALL, 1);
12411 }
else if (IS_SCHEMA(
child,
"choice")) {
12412 type->subtypes = (xmlSchemaTypePtr)
12414 XML_SCHEMA_TYPE_CHOICE, 1);
12416 }
else if (IS_SCHEMA(
child,
"sequence")) {
12417 type->subtypes = (xmlSchemaTypePtr)
12419 XML_SCHEMA_TYPE_SEQUENCE, 1);
12421 }
else if (IS_SCHEMA(
child,
"group")) {
12422 type->subtypes = (xmlSchemaTypePtr)
12423 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
12433 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
12434 (xmlSchemaItemListPtr *) &(
type->attrUses),
12435 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
12440 if (IS_SCHEMA(
child,
"anyAttribute")) {
12441 type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt,
schema,
child);
12446 xmlSchemaPContentErr(ctxt,
12449 NULL,
"(annotation?, (simpleContent | complexContent | "
12450 "((group | all | choice | sequence)?, ((attribute | "
12451 "attributeGroup)*, anyAttribute?))))");
12456 if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
12458 NULL,
node,
"This is a redefinition, thus the "
12459 "<complexType> must have a <restriction> or <extension> "
12460 "grand-child",
NULL);
12462 ctxt->ctxtType = ctxtType;
12490xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
12502 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
12518xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
12524 return (ctxt->options);
12537xmlSchemaParserCtxtPtr
12538xmlSchemaNewParserCtxt(
const char *URL)
12540 xmlSchemaParserCtxtPtr
ret;
12545 ret = xmlSchemaParserCtxtCreate();
12563xmlSchemaParserCtxtPtr
12564xmlSchemaNewMemParserCtxt(
const char *
buffer,
int size)
12566 xmlSchemaParserCtxtPtr
ret;
12570 ret = xmlSchemaParserCtxtCreate();
12588xmlSchemaParserCtxtPtr
12589xmlSchemaNewDocParserCtxt(
xmlDocPtr doc)
12591 xmlSchemaParserCtxtPtr
ret;
12595 ret = xmlSchemaParserCtxtCreate();
12613xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
12617 if (ctxt->doc !=
NULL && !ctxt->preserve)
12619 if (ctxt->vctxt !=
NULL) {
12620 xmlSchemaFreeValidCtxt(ctxt->vctxt);
12622 if (ctxt->ownsConstructor && (ctxt->constructor !=
NULL)) {
12623 xmlSchemaConstructionCtxtFree(ctxt->constructor);
12624 ctxt->constructor =
NULL;
12625 ctxt->ownsConstructor = 0;
12627 if (ctxt->attrProhibs !=
NULL)
12628 xmlSchemaItemListFree(ctxt->attrProhibs);
12645xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
12646 xmlSchemaParticlePtr particle,
int counter, xmlAutomataStatePtr
end)
12648 xmlAutomataStatePtr
start, tmp;
12649 xmlSchemaElementPtr elemDecl,
member;
12650 xmlSchemaSubstGroupPtr substGroup;
12654 elemDecl = (xmlSchemaElementPtr) particle->children;
12658 start = pctxt->state;
12660 end = xmlAutomataNewState(pctxt->am);
12661 substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
12662 if (substGroup ==
NULL) {
12663 xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
12665 "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
12666 "declaration is marked having a subst. group but none "
12667 "available.\n", elemDecl->name,
NULL);
12678 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12679 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12683 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12684 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12685 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12688 }
else if (particle->maxOccurs == 1) {
12692 xmlAutomataNewEpsilon(pctxt->am,
12693 xmlAutomataNewTransition2(pctxt->am,
12695 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
end);
12699 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12700 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12714 tmp = xmlAutomataNewTransition2(pctxt->am,
start,
NULL,
12716 xmlAutomataNewEpsilon(pctxt->am, tmp,
end);
12719 xmlAutomataStatePtr hop;
12720 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12721 UNBOUNDED : particle->maxOccurs - 1;
12722 int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12725 xmlAutomataNewCounter(pctxt->am, minOccurs,
12727 hop = xmlAutomataNewState(pctxt->am);
12729 xmlAutomataNewEpsilon(pctxt->am,
12730 xmlAutomataNewTransition2(pctxt->am,
12732 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
12737 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12738 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12739 xmlAutomataNewEpsilon(pctxt->am,
12740 xmlAutomataNewTransition2(pctxt->am,
12745 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12746 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12748 if (particle->minOccurs == 0) {
12749 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12752 pctxt->state =
end;
12762xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
12763 xmlSchemaParticlePtr particle)
12767 if (((xmlSchemaElementPtr) particle->children)->flags &
12768 XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
12772 ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1,
NULL);
12774 xmlSchemaElementPtr elemDecl;
12775 xmlAutomataStatePtr
start;
12777 elemDecl = (xmlSchemaElementPtr) particle->children;
12779 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
12781 if (particle->maxOccurs == 1) {
12782 start = ctxt->state;
12783 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12784 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12785 }
else if ((particle->maxOccurs >= UNBOUNDED) &&
12786 (particle->minOccurs < 2)) {
12788 start = ctxt->state;
12789 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12790 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12791 ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
12792 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12795 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12796 UNBOUNDED : particle->maxOccurs - 1;
12797 int minOccurs = particle->minOccurs < 1 ?
12798 0 : particle->minOccurs - 1;
12800 start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
12801 counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
12802 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12803 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12804 xmlAutomataNewCountedTrans(ctxt->am, ctxt->state,
start,
counter);
12805 ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
12808 if (particle->minOccurs == 0) {
12809 xmlAutomataNewEpsilon(ctxt->am,
start, ctxt->state);
12827xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
12828 xmlSchemaParticlePtr particle)
12832 if (particle ==
NULL) {
12833 PERROR_INT(
"xmlSchemaBuildAContentModel",
"particle is NULL");
12836 if (particle->children ==
NULL) {
12844 switch (particle->children->type) {
12845 case XML_SCHEMA_TYPE_ANY: {
12847 xmlSchemaWildcardPtr wild;
12848 xmlSchemaWildcardNsPtr
ns;
12850 wild = (xmlSchemaWildcardPtr) particle->children;
12852 start = pctxt->state;
12853 end = xmlAutomataNewState(pctxt->am);
12855 if (particle->maxOccurs == 1) {
12856 if (wild->any == 1) {
12863 xmlAutomataNewTransition2(pctxt->am,
12865 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12870 xmlAutomataNewTransition2(pctxt->am,
12872 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12874 }
else if (wild->nsSet !=
NULL) {
12877 pctxt->state =
start;
12878 pctxt->state = xmlAutomataNewTransition2(pctxt->am,
12880 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12884 }
else if (wild->negNsSet !=
NULL) {
12885 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12891 xmlAutomataStatePtr hop;
12893 particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
12894 particle->maxOccurs - 1;
12896 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12898 counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12899 hop = xmlAutomataNewState(pctxt->am);
12900 if (wild->any == 1) {
12902 xmlAutomataNewTransition2(pctxt->am,
12904 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12906 xmlAutomataNewTransition2(pctxt->am,
12908 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12909 }
else if (wild->nsSet !=
NULL) {
12913 xmlAutomataNewTransition2(pctxt->am,
12915 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12919 }
else if (wild->negNsSet !=
NULL) {
12920 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12924 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12925 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12927 if (particle->minOccurs == 0) {
12928 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12931 pctxt->state =
end;
12934 case XML_SCHEMA_TYPE_ELEMENT:
12935 ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
12937 case XML_SCHEMA_TYPE_SEQUENCE:{
12938 xmlSchemaTreeItemPtr sub;
12945 if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
12946 sub = particle->children->children;
12948 while (sub !=
NULL) {
12949 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12950 (xmlSchemaParticlePtr) sub);
12951 if (tmp2 != 1)
ret = 0;
12955 xmlAutomataStatePtr oldstate = pctxt->state;
12957 if (particle->maxOccurs >= UNBOUNDED) {
12958 if (particle->minOccurs > 1) {
12959 xmlAutomataStatePtr tmp;
12962 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12964 oldstate = pctxt->state;
12966 counter = xmlAutomataNewCounter(pctxt->am,
12967 particle->minOccurs - 1, UNBOUNDED);
12969 sub = particle->children->children;
12970 while (sub !=
NULL) {
12971 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12972 (xmlSchemaParticlePtr) sub);
12973 if (tmp2 != 1)
ret = 0;
12976 tmp = pctxt->state;
12977 xmlAutomataNewCountedTrans(pctxt->am, tmp,
12980 xmlAutomataNewCounterTrans(pctxt->am, tmp,
12983 xmlAutomataNewEpsilon(pctxt->am,
12984 oldstate, pctxt->state);
12987 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12989 oldstate = pctxt->state;
12991 sub = particle->children->children;
12992 while (sub !=
NULL) {
12993 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12994 (xmlSchemaParticlePtr) sub);
12995 if (tmp2 != 1)
ret = 0;
12998 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
13005 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
13006 pctxt->state,
NULL);
13007 if (particle->minOccurs == 0) {
13008 xmlAutomataNewEpsilon(pctxt->am,
13009 oldstate, pctxt->state);
13013 }
else if ((particle->maxOccurs > 1)
13014 || (particle->minOccurs > 1)) {
13015 xmlAutomataStatePtr tmp;
13018 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
13020 oldstate = pctxt->state;
13022 counter = xmlAutomataNewCounter(pctxt->am,
13023 particle->minOccurs - 1,
13024 particle->maxOccurs - 1);
13026 sub = particle->children->children;
13027 while (sub !=
NULL) {
13028 tmp2 = xmlSchemaBuildAContentModel(pctxt,
13029 (xmlSchemaParticlePtr) sub);
13030 if (tmp2 != 1)
ret = 0;
13033 tmp = pctxt->state;
13034 xmlAutomataNewCountedTrans(pctxt->am,
13037 xmlAutomataNewCounterTrans(pctxt->am, tmp,
NULL,
13039 if ((particle->minOccurs == 0) || (
ret == 1)) {
13040 xmlAutomataNewEpsilon(pctxt->am,
13041 oldstate, pctxt->state);
13045 sub = particle->children->children;
13046 while (sub !=
NULL) {
13047 tmp2 = xmlSchemaBuildAContentModel(pctxt,
13048 (xmlSchemaParticlePtr) sub);
13049 if (tmp2 != 1)
ret = 0;
13058 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
13059 pctxt->state,
NULL);
13061 if (particle->minOccurs == 0) {
13062 xmlAutomataNewEpsilon(pctxt->am, oldstate,
13070 case XML_SCHEMA_TYPE_CHOICE:{
13071 xmlSchemaTreeItemPtr sub;
13075 start = pctxt->state;
13076 end = xmlAutomataNewState(pctxt->am);
13082 if (particle->maxOccurs == 1) {
13083 sub = particle->children->children;
13084 while (sub !=
NULL) {
13085 pctxt->state =
start;
13086 tmp2 = xmlSchemaBuildAContentModel(pctxt,
13087 (xmlSchemaParticlePtr) sub);
13088 if (tmp2 == 1)
ret = 1;
13089 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
13094 xmlAutomataStatePtr hop,
base;
13095 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
13096 UNBOUNDED : particle->maxOccurs - 1;
13098 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
13105 xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
13106 hop = xmlAutomataNewState(pctxt->am);
13107 base = xmlAutomataNewState(pctxt->am);
13109 sub = particle->children->children;
13110 while (sub !=
NULL) {
13111 pctxt->state =
base;
13112 tmp2 = xmlSchemaBuildAContentModel(pctxt,
13113 (xmlSchemaParticlePtr) sub);
13114 if (tmp2 == 1)
ret = 1;
13115 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
13118 xmlAutomataNewEpsilon(pctxt->am,
start,
base);
13119 xmlAutomataNewCountedTrans(pctxt->am, hop,
base,
counter);
13120 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
13122 xmlAutomataNewEpsilon(pctxt->am,
base,
end);
13124 if (particle->minOccurs == 0) {
13125 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
13128 pctxt->state =
end;
13131 case XML_SCHEMA_TYPE_ALL:{
13132 xmlAutomataStatePtr
start, tmp;
13133 xmlSchemaParticlePtr sub;
13134 xmlSchemaElementPtr elemDecl;
13138 sub = (xmlSchemaParticlePtr) particle->children->children;
13144 start = pctxt->state;
13145 tmp = xmlAutomataNewState(pctxt->am);
13146 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
13147 pctxt->state = tmp;
13148 while (sub !=
NULL) {
13149 pctxt->state = tmp;
13151 elemDecl = (xmlSchemaElementPtr) sub->children;
13153 PERROR_INT(
"xmlSchemaBuildAContentModel",
13154 "<element> particle has no term");
13163 if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
13171 counter = xmlAutomataNewCounter(pctxt->am,
13172 sub->minOccurs, sub->maxOccurs);
13173 xmlSchemaBuildContentModelForSubstGroup(pctxt,
13176 if ((sub->minOccurs == 1) &&
13177 (sub->maxOccurs == 1)) {
13178 xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
13181 elemDecl->targetNamespace,
13183 }
else if ((sub->minOccurs == 0) &&
13184 (sub->maxOccurs == 1)) {
13186 xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
13189 elemDecl->targetNamespace,
13195 sub = (xmlSchemaParticlePtr) sub->next;
13198 xmlAutomataNewAllTrans(pctxt->am, pctxt->state,
NULL, 0);
13199 if (particle->minOccurs == 0) {
13200 xmlAutomataNewEpsilon(pctxt->am,
start, pctxt->state);
13205 case XML_SCHEMA_TYPE_GROUP:
13216 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
13217 "xmlSchemaBuildAContentModel",
13218 "found unexpected term of type '%s' in content model",
13219 WXS_ITEM_TYPE_NAME(particle->children),
NULL);
13234xmlSchemaBuildContentModel(xmlSchemaTypePtr
type,
13235 xmlSchemaParserCtxtPtr ctxt)
13237 if ((
type->type != XML_SCHEMA_TYPE_COMPLEX) ||
13239 ((
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
13240 (
type->contentType != XML_SCHEMA_CONTENT_MIXED)))
13243#ifdef DEBUG_CONTENT
13245 "Building content model for %s\n",
name);
13248 ctxt->am = xmlNewAutomata();
13249 if (ctxt->am ==
NULL) {
13251 "Cannot create automata for complex type %s\n",
type->name);
13254 ctxt->state = xmlAutomataGetInitState(ctxt->am);
13258 xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(
type));
13259 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
13260 type->contModel = xmlAutomataCompile(ctxt->am);
13262 xmlSchemaPCustomErr(ctxt,
13265 "Failed to compile the content model",
NULL);
13266 }
else if (xmlRegexpIsDeterminist(
type->contModel) != 1) {
13267 xmlSchemaPCustomErr(ctxt,
13271 "The content model is not determinist",
NULL);
13273#ifdef DEBUG_CONTENT_REGEXP
13275 "Content model of %s:\n",
type->name);
13279 ctxt->state =
NULL;
13280 xmlFreeAutomata(ctxt->am);
13294xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
13295 xmlSchemaParserCtxtPtr ctxt)
13297 if ((ctxt ==
NULL) || (elemDecl ==
NULL) ||
13298 ((elemDecl !=
NULL) &&
13299 (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
13301 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
13303 if ((elemDecl->subtypes ==
NULL) && (elemDecl->namedType !=
NULL)) {
13304 xmlSchemaTypePtr
type;
13309 type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
13310 elemDecl->namedTypeNs);
13312 xmlSchemaPResCompAttrErr(ctxt,
13314 WXS_BASIC_CAST elemDecl, elemDecl->node,
13315 "type", elemDecl->namedType, elemDecl->namedTypeNs,
13316 XML_SCHEMA_TYPE_BASIC,
"type definition");
13318 elemDecl->subtypes =
type;
13320 if (elemDecl->substGroup !=
NULL) {
13321 xmlSchemaElementPtr substHead;
13327 substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
13328 elemDecl->substGroupNs);
13329 if (substHead ==
NULL) {
13330 xmlSchemaPResCompAttrErr(ctxt,
13332 WXS_BASIC_CAST elemDecl,
NULL,
13333 "substitutionGroup", elemDecl->substGroup,
13334 elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT,
NULL);
13336 xmlSchemaResolveElementReferences(substHead, ctxt);
13341 WXS_SUBST_HEAD(elemDecl) = substHead;
13348 if (elemDecl->subtypes ==
NULL)
13349 elemDecl->subtypes = substHead->subtypes;
13356 if ((elemDecl->subtypes ==
NULL) &&
13357 (elemDecl->namedType ==
NULL) &&
13358 (elemDecl->substGroup ==
NULL))
13359 elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
13374xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
13375 xmlSchemaTypePtr
type)
13378 xmlSchemaTypeLinkPtr
link, lastLink, newLink;
13379 xmlSchemaTypePtr memberType;
13397 nsName = ((xmlSchemaQNameRefPtr)
link->type)->targetNamespace;
13399 memberType = xmlSchemaGetType(ctxt->schema,
name, nsName);
13400 if ((memberType ==
NULL) || (! WXS_IS_SIMPLE(memberType))) {
13402 WXS_BASIC_CAST
type,
type->node,
"memberTypes",
13403 name, nsName, XML_SCHEMA_TYPE_SIMPLE,
NULL);
13407 if (lastLink ==
NULL)
13410 lastLink->next =
link->next;
13415 link->type = memberType;
13423 memberType =
type->subtypes;
13424 while (memberType !=
NULL) {
13425 link = (xmlSchemaTypeLinkPtr)
xmlMalloc(
sizeof(xmlSchemaTypeLink));
13427 xmlSchemaPErrMemory(ctxt,
"allocating a type link",
NULL);
13430 link->type = memberType;
13432 if (lastLink ==
NULL)
13435 lastLink->next =
link;
13437 memberType = memberType->next;
13453xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13457 if (WXS_IS_COMPLEX(
type))
13459 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13460 if (
type->builtInType == valType)
13462 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13463 (
type->builtInType == XML_SCHEMAS_ANYTYPE))
13465 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13467 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13482xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13486 if (WXS_IS_COMPLEX(
type))
13488 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13489 if (
type->builtInType == valType)
13493 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13498static xmlSchemaTypePtr
13499xmlSchemaQueryBuiltInType(xmlSchemaTypePtr
type)
13503 if (WXS_IS_COMPLEX(
type))
13505 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13507 return(xmlSchemaQueryBuiltInType(
type->subtypes));
13518static xmlSchemaTypePtr
13519xmlSchemaGetPrimitiveType(xmlSchemaTypePtr
type)
13527 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13528 (
type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
13544static xmlSchemaTypePtr
13545xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr
type)
13547 if (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))
13550 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13570xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
13571 xmlSchemaWildcardPtr
dest,
13572 xmlSchemaWildcardPtr
source)
13574 xmlSchemaWildcardNsPtr
cur, tmp,
last;
13582 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13585 tmp->value =
cur->value;
13594 xmlSchemaFreeWildcardNsSet(
dest->negNsSet);
13596 dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13599 dest->negNsSet->value =
source->negNsSet->value;
13617xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
13618 xmlSchemaWildcardPtr completeWild,
13619 xmlSchemaWildcardPtr curWild)
13621 xmlSchemaWildcardNsPtr
cur, curB, tmp;
13627 if ((completeWild->any == curWild->any) &&
13628 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13629 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13631 if ((completeWild->negNsSet ==
NULL) ||
13632 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13634 if (completeWild->nsSet !=
NULL) {
13640 cur = completeWild->nsSet;
13643 curB = curWild->nsSet;
13644 while (curB !=
NULL) {
13645 if (
cur->value == curB->value) {
13664 if (completeWild->any != curWild->any) {
13665 if (completeWild->any == 0) {
13666 completeWild->any = 1;
13667 if (completeWild->nsSet !=
NULL) {
13668 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13669 completeWild->nsSet =
NULL;
13671 if (completeWild->negNsSet !=
NULL) {
13672 xmlFree(completeWild->negNsSet);
13673 completeWild->negNsSet =
NULL;
13682 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13684 xmlSchemaWildcardNsPtr
start;
13686 cur = curWild->nsSet;
13687 start = completeWild->nsSet;
13691 while (curB !=
NULL) {
13692 if (
cur->value == curB->value) {
13699 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13702 tmp->value =
cur->value;
13703 tmp->next = completeWild->nsSet;
13704 completeWild->nsSet = tmp;
13715 if ((completeWild->negNsSet !=
NULL) &&
13716 (curWild->negNsSet !=
NULL) &&
13717 (completeWild->negNsSet->value != curWild->negNsSet->value)) {
13718 completeWild->negNsSet->value =
NULL;
13725 if (((completeWild->negNsSet !=
NULL) &&
13726 (completeWild->negNsSet->value !=
NULL) &&
13727 (curWild->nsSet !=
NULL)) ||
13728 ((curWild->negNsSet !=
NULL) &&
13729 (curWild->negNsSet->value !=
NULL) &&
13730 (completeWild->nsSet !=
NULL))) {
13732 int nsFound, absentFound = 0;
13734 if (completeWild->nsSet !=
NULL) {
13735 cur = completeWild->nsSet;
13736 curB = curWild->negNsSet;
13738 cur = curWild->nsSet;
13739 curB = completeWild->negNsSet;
13745 else if (
cur->value == curB->value)
13747 if (nsFound && absentFound)
13752 if (nsFound && absentFound) {
13757 completeWild->any = 1;
13758 if (completeWild->nsSet !=
NULL) {
13759 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13760 completeWild->nsSet =
NULL;
13762 if (completeWild->negNsSet !=
NULL) {
13763 xmlFree(completeWild->negNsSet);
13764 completeWild->negNsSet =
NULL;
13766 }
else if (nsFound && (!absentFound)) {
13772 if (completeWild->nsSet !=
NULL) {
13773 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13774 completeWild->nsSet =
NULL;
13776 if (completeWild->negNsSet ==
NULL) {
13777 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13778 if (completeWild->negNsSet ==
NULL)
13781 completeWild->negNsSet->value =
NULL;
13782 }
else if ((!nsFound) && absentFound) {
13787 xmlSchemaPErr(ctxt, completeWild->node,
13789 "The union of the wildcard is not expressible.\n",
13792 }
else if ((!nsFound) && (!absentFound)) {
13798 if (completeWild->negNsSet ==
NULL) {
13799 if (completeWild->nsSet !=
NULL) {
13800 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13801 completeWild->nsSet =
NULL;
13803 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13804 if (completeWild->negNsSet ==
NULL)
13806 completeWild->negNsSet->value = curWild->negNsSet->value;
13814 if (((completeWild->negNsSet !=
NULL) &&
13815 (completeWild->negNsSet->value ==
NULL) &&
13816 (curWild->nsSet !=
NULL)) ||
13817 ((curWild->negNsSet !=
NULL) &&
13818 (curWild->negNsSet->value ==
NULL) &&
13819 (completeWild->nsSet !=
NULL))) {
13821 if (completeWild->nsSet !=
NULL) {
13822 cur = completeWild->nsSet;
13824 cur = curWild->nsSet;
13832 completeWild->any = 1;
13833 if (completeWild->nsSet !=
NULL) {
13834 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13835 completeWild->nsSet =
NULL;
13837 if (completeWild->negNsSet !=
NULL) {
13838 xmlFree(completeWild->negNsSet);
13839 completeWild->negNsSet =
NULL;
13845 if (completeWild->negNsSet ==
NULL) {
13850 if (completeWild->nsSet !=
NULL) {
13851 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13852 completeWild->nsSet =
NULL;
13854 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13855 if (completeWild->negNsSet ==
NULL)
13857 completeWild->negNsSet->value =
NULL;
13877xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
13878 xmlSchemaWildcardPtr completeWild,
13879 xmlSchemaWildcardPtr curWild)
13881 xmlSchemaWildcardNsPtr
cur, curB, prev, tmp;
13887 if ((completeWild->any == curWild->any) &&
13888 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13889 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13891 if ((completeWild->negNsSet ==
NULL) ||
13892 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13894 if (completeWild->nsSet !=
NULL) {
13900 cur = completeWild->nsSet;
13903 curB = curWild->nsSet;
13904 while (curB !=
NULL) {
13905 if (
cur->value == curB->value) {
13924 if ((completeWild->any != curWild->any) && (completeWild->any)) {
13925 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13935 if (((completeWild->negNsSet !=
NULL) && (curWild->nsSet !=
NULL)) ||
13936 ((curWild->negNsSet !=
NULL) && (completeWild->nsSet !=
NULL))) {
13939 if (completeWild->nsSet ==
NULL) {
13940 neg = completeWild->negNsSet->value;
13941 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13944 neg = curWild->negNsSet->value;
13949 cur = completeWild->nsSet;
13953 completeWild->nsSet =
cur->next;
13955 prev->next =
cur->next;
13964 cur = completeWild->nsSet;
13966 if (
cur->value == neg) {
13968 completeWild->nsSet =
cur->next;
13970 prev->next =
cur->next;
13985 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13988 cur = completeWild->nsSet;
13992 curB = curWild->nsSet;
13993 while (curB !=
NULL) {
13994 if (
cur->value == curB->value) {
14002 completeWild->nsSet =
cur->next;
14004 prev->next =
cur->next;
14019 if ((completeWild->negNsSet !=
NULL) &&
14020 (curWild->negNsSet !=
NULL) &&
14021 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
14022 (completeWild->negNsSet->value !=
NULL) &&
14023 (curWild->negNsSet->value !=
NULL)) {
14026 "The intersection of the wildcard is not expressible.\n",
14035 if ((completeWild->negNsSet !=
NULL) && (curWild->negNsSet !=
NULL) &&
14036 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
14037 (completeWild->negNsSet->value ==
NULL)) {
14038 completeWild->negNsSet->value = curWild->negNsSet->value;
14055xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
14056 xmlSchemaWildcardPtr super)
14067 if ((sub->negNsSet !=
NULL) &&
14068 (super->negNsSet !=
NULL) &&
14069 (sub->negNsSet->value == super->negNsSet->value))
14074 if (sub->nsSet !=
NULL) {
14078 if (super->nsSet !=
NULL) {
14079 xmlSchemaWildcardNsPtr
cur, curB;
14085 curB = super->nsSet;
14086 while (curB !=
NULL) {
14087 if (
cur->value == curB->value) {
14099 }
else if (super->negNsSet !=
NULL) {
14100 xmlSchemaWildcardNsPtr
cur;
14107 if (
cur->value == super->negNsSet->value)
14118xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
14121 xmlSchemaValPtr *
val)
14128 if (attruse->defValue !=
NULL) {
14129 *
value = attruse->defValue;
14131 *
val = attruse->defVal;
14132 if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
14135 }
else if ((attruse->attrDecl !=
NULL) &&
14136 (attruse->attrDecl->defValue !=
NULL)) {
14137 *
value = attruse->attrDecl->defValue;
14139 *
val = attruse->attrDecl->defVal;
14140 if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
14158xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
14166 else if (wild->nsSet !=
NULL) {
14167 xmlSchemaWildcardNsPtr
cur;
14175 }
else if ((wild->negNsSet !=
NULL) && (
ns !=
NULL) &&
14182#define XML_SCHEMA_ACTION_DERIVE 0
14183#define XML_SCHEMA_ACTION_REDEFINE 1
14185#define WXS_ACTION_STR(a) \
14186((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
14200xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
14202 xmlSchemaBasicItemPtr
item,
14203 xmlSchemaBasicItemPtr baseItem,
14204 xmlSchemaItemListPtr uses,
14205 xmlSchemaItemListPtr baseUses,
14206 xmlSchemaWildcardPtr wild,
14207 xmlSchemaWildcardPtr baseWild)
14209 xmlSchemaAttributeUsePtr
cur =
NULL, bcur;
14214 if (uses !=
NULL) {
14215 for (
i = 0;
i < uses->nbItems;
i++) {
14216 cur = uses->items[
i];
14218 if (baseUses ==
NULL)
14220 for (
j = 0;
j < baseUses->nbItems;
j++) {
14221 bcur = baseUses->items[
j];
14222 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14223 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14224 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14225 WXS_ATTRUSE_DECL_TNS(bcur)))
14235 if ((
cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
14236 (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
14244 xmlSchemaPAttrUseErr4(pctxt,
14247 "The 'optional' attribute use is inconsistent "
14248 "with the corresponding 'required' attribute use of "
14251 xmlSchemaGetComponentDesignation(&
str, baseItem),
14253 FREE_AND_NULL(
str);
14255 }
else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
14256 WXS_ATTRUSE_TYPEDEF(
cur),
14257 WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
14267 xmlSchemaPAttrUseErr4(pctxt,
14270 "The attribute declaration's %s "
14271 "is not validly derived from "
14272 "the corresponding %s of the "
14273 "attribute declaration in the %s %s",
14274 xmlSchemaGetComponentDesignation(&
strA,
14275 WXS_ATTRUSE_TYPEDEF(
cur)),
14276 xmlSchemaGetComponentDesignation(&strB,
14277 WXS_ATTRUSE_TYPEDEF(bcur)),
14279 xmlSchemaGetComponentDesignation(&strC, baseItem));
14281 FREE_AND_NULL(
strA);
14282 FREE_AND_NULL(strB);
14283 FREE_AND_NULL(strC);
14292 xmlSchemaGetEffectiveValueConstraint(bcur,
14293 &effFixed, &bEffValue,
NULL);
14300 if ((bEffValue !=
NULL) &&
14304 xmlSchemaGetEffectiveValueConstraint(bcur,
14305 &effFixed, &rEffValue,
NULL);
14313 if ((effFixed == 0) ||
14314 (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
14318 xmlSchemaPAttrUseErr4(pctxt,
14321 "The effective value constraint of the "
14322 "attribute use is inconsistent with "
14323 "its correspondent in the %s %s",
14325 xmlSchemaGetComponentDesignation(&
str,
14328 FREE_AND_NULL(
str);
14345 if ((baseWild ==
NULL) ||
14346 (xmlSchemaCheckCVCWildcardNamespace(baseWild,
14347 (WXS_ATTRUSE_DECL(
cur))->targetNamespace) != 0))
14351 xmlSchemaPAttrUseErr4(pctxt,
14354 "Neither a matching attribute use, "
14355 "nor a matching wildcard exists in the %s %s",
14357 xmlSchemaGetComponentDesignation(&
str, baseItem),
14359 FREE_AND_NULL(
str);
14373 if (baseUses !=
NULL) {
14374 for (
j = 0;
j < baseUses->nbItems;
j++) {
14375 bcur = baseUses->items[
j];
14376 if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
14379 if (uses !=
NULL) {
14380 for (
i = 0;
i < uses->nbItems;
i++) {
14381 cur = uses->items[
i];
14382 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14383 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14384 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14385 WXS_ATTRUSE_DECL_TNS(bcur))) {
14394 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14397 "A matching attribute use for the "
14398 "'required' %s of the %s %s is missing",
14399 xmlSchemaGetComponentDesignation(&
strA, bcur),
14401 xmlSchemaGetComponentDesignation(&strB, baseItem),
14403 FREE_AND_NULL(
strA);
14404 FREE_AND_NULL(strB);
14411 if (wild !=
NULL) {
14416 if (baseWild ==
NULL) {
14422 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14425 "The %s has an attribute wildcard, "
14426 "but the %s %s '%s' does not have one",
14427 WXS_ITEM_TYPE_NAME(
item),
14429 WXS_ITEM_TYPE_NAME(baseItem),
14430 xmlSchemaGetComponentQName(&
str, baseItem));
14431 FREE_AND_NULL(
str);
14432 return(pctxt->err);
14433 }
else if ((baseWild->any == 0) &&
14434 xmlSchemaCheckCOSNSSubset(wild, baseWild))
14443 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14446 "The attribute wildcard is not a valid "
14447 "subset of the wildcard in the %s %s '%s'",
14449 WXS_ITEM_TYPE_NAME(baseItem),
14450 xmlSchemaGetComponentQName(&
str, baseItem),
14452 FREE_AND_NULL(
str);
14453 return(pctxt->err);
14462 if ((! WXS_IS_ANYTYPE(baseItem)) &&
14463 (wild->processContents < baseWild->processContents)) {
14465 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14468 "The {process contents} of the attribute wildcard is "
14469 "weaker than the one in the %s %s '%s'",
14471 WXS_ITEM_TYPE_NAME(baseItem),
14472 xmlSchemaGetComponentQName(&
str, baseItem),
14475 return(pctxt->err);
14483xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
14484 xmlSchemaBasicItemPtr
item,
14485 xmlSchemaWildcardPtr *completeWild,
14486 xmlSchemaItemListPtr
list,
14487 xmlSchemaItemListPtr prohibs);
14503xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
14504 xmlSchemaTypePtr
type)
14506 xmlSchemaTypePtr baseType =
NULL;
14507 xmlSchemaAttributeUsePtr use;
14508 xmlSchemaItemListPtr uses, baseUses, prohibs =
NULL;
14511 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14515 baseType =
type->baseType;
14516 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14517 if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
14520 uses =
type->attrUses;
14521 baseUses = baseType->attrUses;
14527 if (uses !=
NULL) {
14528 if (WXS_IS_RESTRICTION(
type)) {
14533 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14534 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14535 pctxt->attrProhibs) == -1)
14537 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14538 "failed to expand attributes");
14540 if (pctxt->attrProhibs->nbItems != 0)
14541 prohibs = pctxt->attrProhibs;
14543 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14544 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14547 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14548 "failed to expand attributes");
14555 if (baseUses !=
NULL) {
14557 xmlSchemaAttributeUseProhibPtr pro;
14559 if (WXS_IS_RESTRICTION(
type)) {
14561 xmlSchemaAttributeUsePtr tmp;
14564 usesCount = uses->nbItems;
14569 for (
i = 0;
i < baseUses->nbItems;
i++) {
14570 use = baseUses->items[
i];
14575 for (
j = 0;
j < prohibs->nbItems;
j++) {
14576 pro = prohibs->items[
j];
14577 if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
14578 (WXS_ATTRUSE_DECL_TNS(use) ==
14579 pro->targetNamespace))
14589 for (
j = 0;
j < usesCount;
j++) {
14590 tmp = uses->items[
j];
14591 if ((WXS_ATTRUSE_DECL_NAME(use) ==
14592 WXS_ATTRUSE_DECL_NAME(tmp)) &&
14593 (WXS_ATTRUSE_DECL_TNS(use) ==
14594 WXS_ATTRUSE_DECL_TNS(tmp)))
14600 if (uses ==
NULL) {
14601 type->attrUses = xmlSchemaItemListCreate();
14604 uses =
type->attrUses;
14606 xmlSchemaItemListAddSize(uses, 2, use);
14611 for (
i = 0;
i < baseUses->nbItems;
i++) {
14612 use = baseUses->items[
i];
14613 if (uses ==
NULL) {
14614 type->attrUses = xmlSchemaItemListCreate();
14617 uses =
type->attrUses;
14619 xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
14627 if (uses->nbItems == 0) {
14628 xmlSchemaItemListFree(uses);
14639 if (WXS_IS_EXTENSION(
type)) {
14640 if (baseType->attributeWildcard !=
NULL) {
14645 if (
type->attributeWildcard !=
NULL) {
14656 if (xmlSchemaUnionWildcards(pctxt,
type->attributeWildcard,
14657 baseType->attributeWildcard) == -1)
14664 type->attributeWildcard = baseType->attributeWildcard;
14701xmlSchemaTypeFinalContains(xmlSchemaTypePtr
type,
int final)
14705 if (
type->flags &
final)
14718static xmlSchemaTypeLinkPtr
14719xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type)
14721 while ((
type !=
NULL) && (
type->type == XML_SCHEMA_TYPE_SIMPLE)) {
14723 return (
type->memberTypes);
14741xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
14743 if ((particle->children ==
NULL) ||
14744 (particle->minOccurs == 0))
14746 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14748 xmlSchemaParticlePtr part =
14749 (xmlSchemaParticlePtr) particle->children->children;
14753 while (part !=
NULL) {
14754 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14755 (part->children->type == XML_SCHEMA_TYPE_ANY))
14756 cur = part->minOccurs;
14758 cur = xmlSchemaGetParticleTotalRangeMin(part);
14763 part = (xmlSchemaParticlePtr) part->next;
14765 return (particle->minOccurs *
min);
14769 xmlSchemaParticlePtr part =
14770 (xmlSchemaParticlePtr) particle->children->children;
14775 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14776 (part->children->type == XML_SCHEMA_TYPE_ANY))
14777 sum += part->minOccurs;
14779 sum += xmlSchemaGetParticleTotalRangeMin(part);
14780 part = (xmlSchemaParticlePtr) part->next;
14781 }
while (part !=
NULL);
14782 return (particle->minOccurs *
sum);
14796xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
14798 if ((particle->children ==
NULL) ||
14799 (particle->children->children ==
NULL))
14801 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14803 xmlSchemaParticlePtr part =
14804 (xmlSchemaParticlePtr) particle->children->children;
14806 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14807 if (part->children ==
NULL)
14809 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14810 (part->children->type == XML_SCHEMA_TYPE_ANY))
14811 cur = part->maxOccurs;
14813 cur = xmlSchemaGetParticleTotalRangeMax(part);
14814 if (
cur == UNBOUNDED)
14815 return (UNBOUNDED);
14820 return (particle->maxOccurs *
max);
14824 xmlSchemaParticlePtr part =
14825 (xmlSchemaParticlePtr) particle->children->children;
14827 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14828 if (part->children ==
NULL)
14830 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14831 (part->children->type == XML_SCHEMA_TYPE_ANY))
14832 cur = part->maxOccurs;
14834 cur = xmlSchemaGetParticleTotalRangeMax(part);
14835 if (
cur == UNBOUNDED)
14836 return (UNBOUNDED);
14837 if ((
cur > 0) && (particle->maxOccurs == UNBOUNDED))
14838 return (UNBOUNDED);
14842 return (particle->maxOccurs *
sum);
14854xmlSchemaGetParticleEmptiable(xmlSchemaParticlePtr particle)
14856 xmlSchemaParticlePtr part;
14859 if ((particle->children ==
NULL) || (particle->minOccurs == 0))
14862 part = (xmlSchemaParticlePtr) particle->children->children;
14866 while (part !=
NULL) {
14867 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14868 (part->children->type == XML_SCHEMA_TYPE_ANY))
14869 emptiable = (part->minOccurs == 0);
14871 emptiable = xmlSchemaGetParticleEmptiable(part);
14872 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14880 part = (xmlSchemaParticlePtr) part->next;
14883 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE)
14899xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
14904 if ((particle ==
NULL) || (particle->minOccurs == 0) ||
14905 (particle->children ==
NULL))
14911 if (WXS_IS_MODEL_GROUP(particle->children))
14912 return (xmlSchemaGetParticleEmptiable(particle));
14932xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
14933 xmlSchemaTypePtr
type,
14934 xmlSchemaTypePtr baseType,
14941 if (
type == baseType)
14952 if (WXS_IS_TYPE_NOT_FIXED(
type))
14953 if (xmlSchemaTypeFixup(
type, actxt) == -1)
14955 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14956 if (xmlSchemaTypeFixup(baseType, actxt) == -1)
14958 if ((subset & SUBSET_RESTRICTION) ||
14959 (xmlSchemaTypeFinalContains(
type->baseType,
14960 XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
14964 if (
type->baseType == baseType) {
14975 if ((! WXS_IS_ANYTYPE(
type->baseType)) &&
14976 (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
14977 baseType, subset) == 0)) {
14984 if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
14985 (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))) {
14996 if (WXS_IS_UNION(baseType)) {
14997 xmlSchemaTypeLinkPtr
cur;
14999 cur = baseType->memberTypes;
15001 if (WXS_IS_TYPE_NOT_FIXED(
cur->type))
15002 if (xmlSchemaTypeFixup(
cur->type, actxt) == -1)
15004 if (xmlSchemaCheckCOSSTDerivedOK(actxt,
15005 type,
cur->type, subset) == 0)
15032xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
15033 xmlSchemaTypePtr ctxtType,
15034 xmlSchemaTypePtr ancestor)
15038 if ((ancestor ==
NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
15041 if (ctxtType == ancestor) {
15042 xmlSchemaPCustomErr(pctxt,
15044 WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
15045 "The definition is circular",
NULL);
15048 if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
15054 ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
15055 ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
15056 ancestor->baseType);
15057 ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
15070xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr
item,
15071 xmlSchemaParserCtxtPtr ctxt)
15074 (
item->type == XML_SCHEMA_TYPE_BASIC) ||
15077 xmlSchemaCheckTypeDefCircularInternal(ctxt,
item,
15095xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
15096 xmlSchemaTypePtr ctxType,
15097 xmlSchemaTypeLinkPtr members)
15099 xmlSchemaTypeLinkPtr
member;
15100 xmlSchemaTypePtr memberType;
15105 while ((memberType !=
NULL) &&
15106 (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
15107 if (memberType == ctxType) {
15108 xmlSchemaPCustomErr(pctxt,
15110 WXS_BASIC_CAST ctxType,
NULL,
15111 "The union type definition is circular",
NULL);
15114 if ((WXS_IS_UNION(memberType)) &&
15115 ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
15118 memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
15119 res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
15121 xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
15122 memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
15126 memberType = memberType->baseType;
15134xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
15135 xmlSchemaTypePtr
type)
15137 if (! WXS_IS_UNION(
type))
15139 return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
type,
15140 type->memberTypes));
15152xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
15153 xmlSchemaParserCtxtPtr ctxt)
15155 if (typeDef ==
NULL)
15161 if (typeDef->baseType ==
NULL) {
15162 typeDef->baseType = xmlSchemaGetType(ctxt->schema,
15163 typeDef->base, typeDef->baseNs);
15164 if (typeDef->baseType ==
NULL) {
15165 xmlSchemaPResCompAttrErr(ctxt,
15167 WXS_BASIC_CAST typeDef, typeDef->node,
15168 "base", typeDef->base, typeDef->baseNs,
15169 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15173 if (WXS_IS_SIMPLE(typeDef)) {
15174 if (WXS_IS_UNION(typeDef)) {
15178 xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
15180 }
else if (WXS_IS_LIST(typeDef)) {
15184 if ((typeDef->subtypes ==
NULL) && (typeDef->base !=
NULL)) {
15186 typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
15187 typeDef->base, typeDef->baseNs);
15189 if ((typeDef->subtypes ==
NULL) ||
15190 (! WXS_IS_SIMPLE(typeDef->subtypes)))
15192 typeDef->subtypes =
NULL;
15193 xmlSchemaPResCompAttrErr(ctxt,
15195 WXS_BASIC_CAST typeDef, typeDef->node,
15196 "itemType", typeDef->base, typeDef->baseNs,
15197 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15208 else if ((WXS_TYPE_CONTENTTYPE(typeDef) !=
NULL) &&
15209 ((WXS_TYPE_CONTENTTYPE(typeDef))->
type ==
15210 XML_SCHEMA_TYPE_PARTICLE) &&
15211 (WXS_TYPE_PARTICLE_TERM(typeDef) !=
NULL) &&
15212 ((WXS_TYPE_PARTICLE_TERM(typeDef))->
type ==
15213 XML_SCHEMA_EXTRA_QNAMEREF))
15215 xmlSchemaQNameRefPtr
ref =
15216 WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
15217 xmlSchemaModelGroupDefPtr groupDef;
15222 WXS_TYPE_PARTICLE_TERM(typeDef) =
NULL;
15227 WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
15229 if (groupDef ==
NULL) {
15231 NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
15235 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15236 }
else if (WXS_MODELGROUPDEF_MODEL(groupDef) ==
NULL)
15238 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15244 WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
15246 if (WXS_MODELGROUPDEF_MODEL(groupDef)->
type == XML_SCHEMA_TYPE_ALL) {
15253 if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
15254 xmlSchemaCustomErr(ACTXT_CAST ctxt,
15257 WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
NULL,
15258 "The particle's {max occurs} must be 1, since the "
15259 "reference resolves to an 'all' model group",
15281xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
15282 xmlSchemaTypePtr
type)
15284 xmlSchemaTypePtr baseType =
type->baseType;
15298 if (baseType ==
NULL) {
15303 xmlSchemaPCustomErr(ctxt,
15306 "No base type existent",
NULL);
15310 if (! WXS_IS_SIMPLE(baseType)) {
15311 xmlSchemaPCustomErr(ctxt,
15314 "The base type '%s' is not a simple type",
15315 xmlSchemaGetComponentQName(&
str, baseType));
15319 if ((WXS_IS_LIST(
type) || WXS_IS_UNION(
type)) &&
15320 (WXS_IS_RESTRICTION(
type) == 0) &&
15321 ((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) &&
15322 (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) {
15323 xmlSchemaPCustomErr(ctxt,
15326 "A type, derived by list or union, must have "
15327 "the simple ur-type definition as base type, not '%s'",
15328 xmlSchemaGetComponentQName(&
str, baseType));
15335 if ((! WXS_IS_ATOMIC(
type)) && (! WXS_IS_UNION(
type)) &&
15336 (! WXS_IS_LIST(
type))) {
15337 xmlSchemaPCustomErr(ctxt,
15340 "The variety is absent",
NULL);
15348 if (xmlSchemaTypeFinalContains(baseType,
15349 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15350 xmlSchemaPCustomErr(ctxt,
15353 "The 'final' of its base type '%s' must not contain "
15355 xmlSchemaGetComponentQName(&
str, baseType));
15386xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
15387 xmlSchemaTypePtr
type)
15391 if (
type->type != XML_SCHEMA_TYPE_SIMPLE) {
15392 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15393 "given type is not a user-derived simpleType");
15397 if (WXS_IS_ATOMIC(
type)) {
15398 xmlSchemaTypePtr primitive;
15403 if (! WXS_IS_ATOMIC(
type->baseType)) {
15404 xmlSchemaPCustomErr(pctxt,
15407 "The base type '%s' is not an atomic simple type",
15408 xmlSchemaGetComponentQName(&
str,
type->baseType));
15416 if (xmlSchemaTypeFinalContains(
type->baseType,
15417 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15418 xmlSchemaPCustomErr(pctxt,
15421 "The final of its base type '%s' must not contain 'restriction'",
15422 xmlSchemaGetComponentQName(&
str,
type->baseType));
15433 xmlSchemaFacetPtr facet;
15436 primitive = xmlSchemaGetPrimitiveType(
type);
15437 if (primitive ==
NULL) {
15438 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15439 "failed to get primitive type");
15442 facet =
type->facets;
15444 if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
15446 xmlSchemaPIllegalFacetAtomicErr(pctxt,
15448 type, primitive, facet);
15450 facet = facet->next;
15451 }
while (facet !=
NULL);
15464 }
else if (WXS_IS_LIST(
type)) {
15465 xmlSchemaTypePtr itemType =
NULL;
15467 itemType =
type->subtypes;
15468 if ((itemType ==
NULL) || (! WXS_IS_SIMPLE(itemType))) {
15469 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15470 "failed to evaluate the item type");
15473 if (WXS_IS_TYPE_NOT_FIXED(itemType))
15474 xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
15480 if ((! WXS_IS_ATOMIC(itemType)) &&
15481 (! WXS_IS_UNION(itemType))) {
15482 xmlSchemaPCustomErr(pctxt,
15485 "The item type '%s' does not have a variety of atomic or union",
15486 xmlSchemaGetComponentQName(&
str, itemType));
15489 }
else if (WXS_IS_UNION(itemType)) {
15490 xmlSchemaTypeLinkPtr
member;
15492 member = itemType->memberTypes;
15495 xmlSchemaPCustomErr(pctxt,
15498 "The item type is a union type, but the "
15499 "member type '%s' of this item type is not atomic",
15508 if (WXS_IS_ANY_SIMPLE_TYPE(
type->baseType)) {
15509 xmlSchemaFacetPtr facet;
15518 if (xmlSchemaTypeFinalContains(itemType,
15519 XML_SCHEMAS_TYPE_FINAL_LIST)) {
15520 xmlSchemaPCustomErr(pctxt,
15523 "The final of its item type '%s' must not contain 'list'",
15524 xmlSchemaGetComponentQName(&
str, itemType));
15535 facet =
type->facets;
15537 if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
15538 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15543 facet = facet->next;
15544 }
while (facet !=
NULL);
15562 if (! WXS_IS_LIST(
type->baseType)) {
15563 xmlSchemaPCustomErr(pctxt,
15566 "The base type '%s' must be a list type",
15567 xmlSchemaGetComponentQName(&
str,
type->baseType));
15575 if (xmlSchemaTypeFinalContains(
type->baseType,
15576 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15577 xmlSchemaPCustomErr(pctxt,
15580 "The 'final' of the base type '%s' must not contain 'restriction'",
15581 xmlSchemaGetComponentQName(&
str,
type->baseType));
15591 xmlSchemaTypePtr baseItemType;
15593 baseItemType =
type->baseType->subtypes;
15594 if ((baseItemType ==
NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
15595 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15596 "failed to eval the item type of a base type");
15599 if ((itemType != baseItemType) &&
15600 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
15601 baseItemType, 0) != 0)) {
15603 xmlSchemaPCustomErrExt(pctxt,
15606 "The item type '%s' is not validly derived from "
15607 "the item type '%s' of the base type '%s'",
15608 xmlSchemaGetComponentQName(&
str, itemType),
15609 xmlSchemaGetComponentQName(&strBIT, baseItemType),
15610 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15613 FREE_AND_NULL(strBIT)
15614 FREE_AND_NULL(strBT)
15620 xmlSchemaFacetPtr facet;
15626 facet =
type->facets;
15628 switch (facet->type) {
15629 case XML_SCHEMA_FACET_LENGTH:
15630 case XML_SCHEMA_FACET_MINLENGTH:
15631 case XML_SCHEMA_FACET_MAXLENGTH:
15632 case XML_SCHEMA_FACET_WHITESPACE:
15637 case XML_SCHEMA_FACET_PATTERN:
15638 case XML_SCHEMA_FACET_ENUMERATION:
15641 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15651 facet = facet->
next;
15652 }
while (facet !=
NULL);
15663 }
else if (WXS_IS_UNION(
type)) {
15668 xmlSchemaTypeLinkPtr
member;
15673 xmlSchemaTypeFixup(
member->
type, ACTXT_CAST pctxt);
15677 xmlSchemaPCustomErr(pctxt,
15680 "The member type '%s' is neither an atomic, nor a list type",
15691 if (
type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
15698 if (xmlSchemaTypeFinalContains(
member->
type,
15699 XML_SCHEMAS_TYPE_FINAL_UNION)) {
15700 xmlSchemaPCustomErr(pctxt,
15703 "The 'final' of member type '%s' contains 'union'",
15714 xmlSchemaPCustomErr(pctxt,
15717 "No facets allowed",
NULL);
15725 if (! WXS_IS_UNION(
type->baseType)) {
15726 xmlSchemaPCustomErr(pctxt,
15729 "The base type '%s' is not a union type",
15730 xmlSchemaGetComponentQName(&
str,
type->baseType));
15737 if (xmlSchemaTypeFinalContains(
type->baseType,
15738 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15739 xmlSchemaPCustomErr(pctxt,
15742 "The 'final' of its base type '%s' must not contain 'restriction'",
15743 xmlSchemaGetComponentQName(&
str,
type->baseType));
15754 xmlSchemaTypeLinkPtr baseMember;
15770 baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(
type->baseType);
15772 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15773 "different number of member types in base");
15776 if (baseMember ==
NULL) {
15777 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15778 "different number of member types in base");
15779 }
else if ((
member->
type != baseMember->type) &&
15780 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
15784 xmlSchemaPCustomErrExt(pctxt,
15787 "The member type %s is not validly "
15788 "derived from its corresponding member "
15789 "type %s of the base type %s",
15791 xmlSchemaGetComponentQName(&strBMT, baseMember->type),
15792 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15794 FREE_AND_NULL(strBMT)
15795 FREE_AND_NULL(strBT)
15799 if (baseMember !=
NULL)
15800 baseMember = baseMember->next;
15809 xmlSchemaFacetPtr facet;
15812 facet =
type->facets;
15814 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
15815 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
15816 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15821 facet = facet->
next;
15822 }
while (facet !=
NULL);
15852xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
15853 xmlSchemaTypePtr
type)
15860 if (WXS_IS_RESTRICTION(
type)) {
15870 }
else if (WXS_IS_LIST(
type)) {
15877 }
else if (WXS_IS_UNION(
type)) {
15887xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
15889 if (ctxt->vctxt ==
NULL) {
15890 ctxt->vctxt = xmlSchemaNewValidCtxt(
NULL);
15891 if (ctxt->vctxt ==
NULL) {
15892 xmlSchemaPErr(ctxt,
NULL,
15894 "Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
15895 "failed to create a temp. validation context.\n",
15900 xmlSchemaSetValidErrors(ctxt->vctxt,
15901 ctxt->error, ctxt->warning, ctxt->errCtxt);
15902 xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
15903 ctxt->serror, ctxt->errCtxt);
15909xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
15911 xmlSchemaTypePtr
type,
15913 xmlSchemaValPtr *retVal,
15935xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
15937 xmlSchemaTypePtr
type,
15939 xmlSchemaValPtr *
val)
15949 if WXS_IS_COMPLEX(
type) {
15959 if ((! WXS_HAS_SIMPLE_CONTENT(
type)) &&
15960 ((! WXS_HAS_MIXED_CONTENT(
type)) || (! WXS_EMPTIABLE(
type)))) {
15962 xmlSchemaPCustomErr(pctxt,
15965 "For a string to be a valid default, the type definition "
15966 "must be a simple type or a complex type with mixed content "
15967 "and a particle emptiable",
NULL);
15982 if (WXS_IS_SIMPLE(
type))
15983 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15985 else if (WXS_HAS_SIMPLE_CONTENT(
type))
15986 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15992 PERROR_INT(
"xmlSchemaParseCheckCOSValidDefault",
15993 "calling xmlSchemaVCheckCVCSimpleType()");
16013xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
16014 xmlSchemaTypePtr
type)
16025 (WXS_IS_SIMPLE(
type->baseType)) &&
16026 (WXS_IS_EXTENSION(
type) == 0)) {
16031 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16034 "If the base type is a simple type, the derivation method must be "
16051 if (
type->attrUses &&
16052 (((xmlSchemaItemListPtr)
type->attrUses)->nbItems > 1))
16054 xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr)
type->attrUses;
16055 xmlSchemaAttributeUsePtr use, tmp;
16056 int i,
j, hasId = 0;
16058 for (
i = uses->nbItems -1;
i >= 0;
i--) {
16059 use = uses->items[
i];
16068 for (
j =
i -1;
j >= 0;
j--) {
16069 tmp = uses->items[
j];
16070 if ((WXS_ATTRUSE_DECL_NAME(use) ==
16071 WXS_ATTRUSE_DECL_NAME(tmp)) &&
16072 (WXS_ATTRUSE_DECL_TNS(use) ==
16073 WXS_ATTRUSE_DECL_TNS(tmp)))
16077 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16081 xmlSchemaGetComponentDesignation(&
str, use),
16083 FREE_AND_NULL(
str);
16087 if (xmlSchemaItemListRemove(uses,
i) == -1)
16099 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
16100 if (xmlSchemaIsDerivedFromBuiltInType(
16101 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
16106 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16109 "There must not exist more than one attribute "
16110 "declaration of type 'xs:ID' "
16111 "(or derived from 'xs:ID'). The %s violates this "
16113 xmlSchemaGetComponentDesignation(&
str, use),
16115 FREE_AND_NULL(
str);
16116 if (xmlSchemaItemListRemove(uses,
i) == -1)
16132xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
16133 xmlSchemaTypePtr typeB)
16139 if ((typeA ==
NULL) || (typeB ==
NULL))
16141 return (typeA == typeB);
16160xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16161 xmlSchemaTypePtr
type,
16162 xmlSchemaTypePtr baseType,
16165 int equal = xmlSchemaAreEqualTypes(
type, baseType);
16178 if (((
set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(
type))) ||
16179 ((
set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(
type))))
16190 if (
type->baseType == baseType)
16196 if (WXS_IS_ANYTYPE(
type->baseType))
16199 if (WXS_IS_COMPLEX(
type->baseType)) {
16205 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type->baseType,
16213 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
16231xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16232 xmlSchemaTypePtr
type,
16233 xmlSchemaTypePtr baseType,
16236 if (WXS_IS_SIMPLE(
type))
16237 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type, baseType,
set));
16239 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type, baseType,
set));
16260xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
16261 xmlSchemaTypePtr
type)
16263 xmlSchemaTypePtr
base =
type->baseType;
16272 if (WXS_IS_COMPLEX(
base)) {
16277 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16278 xmlSchemaPCustomErr(ctxt,
16281 "The 'final' of the base type definition "
16282 "contains 'extension'",
NULL);
16306 xmlSchemaAttributeUsePtr use, buse;
16308 for (
i = 0;
i < (WXS_LIST_CAST
base->attrUses)->nbItems;
i ++) {
16309 buse = (WXS_LIST_CAST
base->attrUses)->
items[
i];
16312 use = (WXS_LIST_CAST
type->attrUses)->
items[
j];
16313 for (
j = 0;
j < (WXS_LIST_CAST
type->attrUses)->nbItems;
j ++)
16315 if ((WXS_ATTRUSE_DECL_NAME(use) ==
16316 WXS_ATTRUSE_DECL_NAME(buse)) &&
16317 (WXS_ATTRUSE_DECL_TNS(use) ==
16318 WXS_ATTRUSE_DECL_TNS(buse)) &&
16319 (WXS_ATTRUSE_TYPEDEF(use) ==
16320 WXS_ATTRUSE_TYPEDEF(buse))
16330 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16337 "This type is missing a matching correspondent "
16338 "for its {base type}'s %s in its {attribute uses}",
16339 xmlSchemaGetComponentDesignation(&
str,
16358 if (
base->attributeWildcard !=
NULL) {
16359 if (
type->attributeWildcard ==
NULL) {
16362 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16365 "The base %s has an attribute wildcard, "
16366 "but this type is missing an attribute wildcard",
16367 xmlSchemaGetComponentDesignation(&
str,
base));
16370 }
else if (xmlSchemaCheckCOSNSSubset(
16371 base->attributeWildcard,
type->attributeWildcard))
16375 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16378 "The attribute wildcard is not a valid "
16379 "superset of the one in the base %s",
16380 xmlSchemaGetComponentDesignation(&
str,
base));
16388 if ((
type->contentTypeDef !=
NULL) &&
16389 (
type->contentTypeDef ==
base->contentTypeDef)) {
16396 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
16397 (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
16413 xmlSchemaPCustomErr(ctxt,
16416 "The content type must specify a particle",
NULL);
16422 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16432 if ((
type->contentType !=
base->contentType) ||
16433 ((
type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
16434 (
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
16439 xmlSchemaPCustomErr(ctxt,
16442 "The content type of both, the type and its base "
16443 "type, must either 'mixed' or 'element-only'",
NULL);
16468 if (
type->contentTypeDef !=
base) {
16473 xmlSchemaPCustomErr(ctxt,
16476 "The content type must be the simple base type",
NULL);
16479 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16485 xmlSchemaPCustomErr(ctxt,
16488 "The 'final' of the base type definition "
16489 "contains 'extension'",
NULL);
16517xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
16518 xmlSchemaTypePtr
type)
16520 xmlSchemaTypePtr
base;
16527 if (! WXS_IS_COMPLEX(
base)) {
16528 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16531 "The base type must be a complex type",
NULL,
NULL);
16534 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
16539 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16542 "The 'final' of the base type definition "
16543 "contains 'restriction'",
NULL,
NULL);
16544 return (ctxt->err);
16552 if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
16553 XML_SCHEMA_ACTION_DERIVE,
16554 WXS_BASIC_CAST
type, WXS_BASIC_CAST
base,
16556 type->attributeWildcard,
16557 base->attributeWildcard) == -1)
16564 if (
base->builtInType == XML_SCHEMAS_ANYTYPE) {
16570 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16571 (
type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16578 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16579 (
base->contentType == XML_SCHEMA_CONTENT_BASIC))
16592 err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
16593 type->contentTypeDef,
base->contentTypeDef, 0);
16599 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16602 "The {content type} %s is not validly derived from the "
16603 "base type's {content type} %s",
16604 xmlSchemaGetComponentDesignation(&
strA,
16605 type->contentTypeDef),
16606 xmlSchemaGetComponentDesignation(&strB,
16607 base->contentTypeDef));
16608 FREE_AND_NULL(
strA);
16609 FREE_AND_NULL(strB);
16612 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16613 (xmlSchemaIsParticleEmptiable(
16614 (xmlSchemaParticlePtr)
base->subtypes))) {
16622 xmlSchemaPCustomErr(ctxt,
16625 "The content type of the base type must be either "
16626 "a simple type or 'mixed' and an emptiable particle",
NULL);
16627 return (ctxt->err);
16629 }
else if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16634 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16640 }
else if (((
base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16641 (
base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
16642 xmlSchemaIsParticleEmptiable(
16643 (xmlSchemaParticlePtr)
base->subtypes)) {
16651 xmlSchemaPCustomErr(ctxt,
16654 "The content type of the base type must be either "
16655 "empty or 'mixed' (or 'elements-only') and an emptiable "
16657 return (ctxt->err);
16659 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16660 WXS_HAS_MIXED_CONTENT(
type)) {
16665 if (WXS_HAS_MIXED_CONTENT(
type) && (! WXS_HAS_MIXED_CONTENT(
base))) {
16671 xmlSchemaPCustomErr(ctxt,
16674 "If the content type is 'mixed', then the content type of the "
16675 "base type must also be 'mixed'",
NULL);
16676 return (ctxt->err);
16687 xmlSchemaPCustomErr(ctxt,
16690 "The type is not a valid restriction of its base type",
NULL);
16691 return (ctxt->err);
16707xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
16708 xmlSchemaTypePtr
type)
16714 ret = xmlSchemaCheckCTPropsCorrect(ctxt,
type);
16717 if (WXS_IS_EXTENSION(
type))
16718 ret = xmlSchemaCheckCOSCTExtends(ctxt,
type);
16720 ret = xmlSchemaCheckDerivationOKRestriction(ctxt,
type);
16737xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
16738 xmlSchemaTypePtr
type)
16740 xmlSchemaTypePtr
base;
16748 if (! WXS_HAS_SIMPLE_CONTENT(
type)) {
16754 if (! WXS_IS_COMPLEX(
base)) {
16756 xmlSchemaPCustomErr(ctxt,
16759 "If using <complexContent>, the base type is expected to be "
16760 "a complex type. The base type '%s' is a simple type",
16761 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16774 if (WXS_IS_SIMPLE(
base)) {
16775 if (WXS_IS_EXTENSION(
type) == 0) {
16782 xmlSchemaPCustomErr(ctxt,
16785 "If using <simpleContent> and <restriction>, the base "
16786 "type must be a complex type. The base type '%s' is "
16788 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16795 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16796 (
base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16802 if (
base->contentTypeDef ==
NULL) {
16805 "Internal error: xmlSchemaCheckSRCCT, "
16806 "'%s', base type has no content type",
16810 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16811 (WXS_IS_RESTRICTION(
type))) {
16818 if (! xmlSchemaIsParticleEmptiable(
16819 (xmlSchemaParticlePtr)
base->subtypes)) {
16826 if (
type->contentTypeDef ==
NULL) {
16834 xmlSchemaPCustomErr(ctxt,
16837 "A <simpleType> is expected among the children "
16838 "of <restriction>, if <simpleContent> is used and "
16839 "the base type '%s' is a complex type",
16840 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16851 if (WXS_IS_RESTRICTION(
type)) {
16852 xmlSchemaPCustomErr(ctxt,
16855 "If <simpleContent> and <restriction> is used, the "
16856 "base type must be a simple type or a complex type with "
16857 "mixed content and particle emptiable. The base type "
16858 "'%s' is none of those",
16859 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16862 xmlSchemaPCustomErr(ctxt,
16865 "If <simpleContent> and <extension> is used, the "
16866 "base type must be a simple type. The base type '%s' "
16867 "is a complex type",
16868 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16890#ifdef ENABLE_PARTICLE_RESTRICTION
16906xmlSchemaCheckParticleRangeOK(
int rmin,
int rmax,
16907 int bmin,
int bmax)
16911 if ((bmax != UNBOUNDED) &&
16936xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
16937 xmlSchemaParticlePtr
r,
16938 xmlSchemaParticlePtr
b)
16940 xmlSchemaElementPtr elemR, elemB;
16943 elemR = (xmlSchemaElementPtr)
r->children;
16944 elemB = (xmlSchemaElementPtr)
b->children;
16949 if ((elemR != elemB) &&
16951 (!
xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
16957 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
16958 b->minOccurs,
b->maxOccurs) != 0)
16964 if (elemR == elemB)
16969 if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
16970 (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
16977 if ((elemB->value !=
NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
16978 ((elemR->value ==
NULL) ||
16979 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
16988 if (elemB->idcs !=
NULL) {
16995 if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
16996 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
16997 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
16998 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
16999 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
17000 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
17014 set |= SUBSET_EXTENSION;
17015 set |= SUBSET_LIST;
17016 set |= SUBSET_UNION;
17017 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
17018 elemB->subtypes,
set) != 0)
17041xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
17042 xmlSchemaParticlePtr
r,
17043 xmlSchemaParticlePtr
b)
17054 if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr)
b->children,
17055 ((xmlSchemaElementPtr)
r->children)->targetNamespace) != 0)
17061 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17062 b->minOccurs,
b->maxOccurs) != 0)
17085xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
17086 xmlSchemaParticlePtr
r,
17087 xmlSchemaParticlePtr
b)
17111xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
17112 xmlSchemaParticlePtr
r,
17113 xmlSchemaParticlePtr
b,
17121 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17122 b->minOccurs,
b->maxOccurs))
17128 if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr)
r->children,
17129 (xmlSchemaWildcardPtr)
b->children))
17137 if (! isAnyTypeBase) {
17138 if ( ((xmlSchemaWildcardPtr)
r->children)->processContents <
17139 ((xmlSchemaWildcardPtr)
b->children)->processContents)
17161xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
17162 xmlSchemaParticlePtr
r,
17163 xmlSchemaParticlePtr
b)
17202xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
17203 xmlSchemaParticlePtr
r,
17204 xmlSchemaParticlePtr
b)
17206 xmlSchemaParticlePtr part;
17208 if ((
r->children ==
NULL) || (
r->children->children ==
NULL))
17218 part = (xmlSchemaParticlePtr)
r->children->children;
17220 if (xmlSchemaCheckCOSParticleRestrict(ctxt, part,
b))
17222 part = (xmlSchemaParticlePtr) part->next;
17223 }
while (part !=
NULL);
17229 if (xmlSchemaCheckParticleRangeOK(
17230 xmlSchemaGetParticleTotalRangeMin(
r),
17231 xmlSchemaGetParticleTotalRangeMax(
r),
17232 b->minOccurs,
b->maxOccurs) != 0)
17257xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
17258 xmlSchemaParticlePtr
r,
17259 xmlSchemaParticlePtr
b)
17263 if ((
r->children ==
NULL) || (
b->children ==
NULL) ||
17264 (
r->children->type !=
b->children->type))
17273 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17274 b->minOccurs,
b->maxOccurs))
17283#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
17284 xmlSchemaPCustomErrExt(pctxt, \
17285 XML_SCHEMAP_INVALID_FACET_VALUE, \
17286 WXS_BASIC_CAST fac1, fac1->node, \
17287 "It is an error for both '%s' and '%s' to be specified on the "\
17288 "same type definition", \
17289 BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
17290 BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
17292#define FACET_RESTR_ERR(fac1, msg) \
17293 xmlSchemaPCustomErr(pctxt, \
17294 XML_SCHEMAP_INVALID_FACET_VALUE, \
17295 WXS_BASIC_CAST fac1, fac1->node, \
17298#define FACET_RESTR_FIXED_ERR(fac) \
17299 xmlSchemaPCustomErr(pctxt, \
17300 XML_SCHEMAP_INVALID_FACET_VALUE, \
17301 WXS_BASIC_CAST fac, fac->node, \
17302 "The base type's facet is 'fixed', thus the value must not " \
17306xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
17307 xmlSchemaFacetPtr facet1,
17308 xmlSchemaFacetPtr facet2,
17318 if (lessGreater == 0)
17320 if (lessGreater == 1)
17334 xmlSchemaPCustomErr(pctxt,
17336 WXS_BASIC_CAST facet1,
NULL,
17350xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
17351 xmlSchemaTypePtr
type)
17353 xmlSchemaTypePtr
base =
type->baseType;
17355 xmlSchemaFacetPtr facet, bfacet,
17399 facet =
cur->facet;
17400 switch (facet->type) {
17401 case XML_SCHEMA_FACET_LENGTH:
17402 flength = facet;
break;
17403 case XML_SCHEMA_FACET_MINLENGTH:
17404 fminlen = facet;
break;
17405 case XML_SCHEMA_FACET_MININCLUSIVE:
17406 fmininc = facet;
break;
17407 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17408 fminexc = facet;
break;
17409 case XML_SCHEMA_FACET_MAXLENGTH:
17410 fmaxlen = facet;
break;
17411 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17412 fmaxinc = facet;
break;
17413 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17414 fmaxexc = facet;
break;
17415 case XML_SCHEMA_FACET_TOTALDIGITS:
17416 ftotdig = facet;
break;
17417 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17418 ffracdig = facet;
break;
17424 facet =
cur->facet;
17425 switch (facet->type) {
17426 case XML_SCHEMA_FACET_LENGTH:
17427 bflength = facet;
break;
17428 case XML_SCHEMA_FACET_MINLENGTH:
17429 bfminlen = facet;
break;
17430 case XML_SCHEMA_FACET_MININCLUSIVE:
17431 bfmininc = facet;
break;
17432 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17433 bfminexc = facet;
break;
17434 case XML_SCHEMA_FACET_MAXLENGTH:
17435 bfmaxlen = facet;
break;
17436 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17437 bfmaxinc = facet;
break;
17438 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17439 bfmaxexc = facet;
break;
17440 case XML_SCHEMA_FACET_TOTALDIGITS:
17441 bftotdig = facet;
break;
17442 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17443 bffracdig = facet;
break;
17451 if (flength && (fminlen || fmaxlen)) {
17452 FACET_RESTR_ERR(flength,
"It is an error for both 'length' and "
17453 "either of 'minLength' or 'maxLength' to be specified on "
17454 "the same type definition")
17459 if ((fmaxinc) && (fmaxexc)) {
17463 FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
17465 if ((fmininc) && (fminexc)) {
17469 FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
17472 if (flength && bflength) {
17477 res = xmlSchemaCompareValues(flength->val, bflength->val);
17479 goto internal_error;
17481 xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
17482 if ((
res != 0) && (bflength->fixed)) {
17483 FACET_RESTR_FIXED_ERR(flength)
17487 if (fminlen && bfminlen) {
17492 res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
17494 goto internal_error;
17496 xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
17497 if ((
res != 0) && (bfminlen->fixed)) {
17498 FACET_RESTR_FIXED_ERR(fminlen)
17501 if (fmaxlen && bfmaxlen) {
17506 res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
17508 goto internal_error;
17510 xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
17511 if ((
res != 0) && (bfmaxlen->fixed)) {
17512 FACET_RESTR_FIXED_ERR(fmaxlen)
17519 flength = bflength;
17522 fminlen = bfminlen;
17525 res = xmlSchemaCompareValues(flength->val, fminlen->val);
17527 goto internal_error;
17529 xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
17532 fmaxlen = bfmaxlen;
17535 res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
17537 goto internal_error;
17539 xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
17548 res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
17550 goto internal_error;
17552 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
17560 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
17562 goto internal_error;
17564 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
17565 if ((
res != 0) && (bfmaxinc->fixed)) {
17566 FACET_RESTR_FIXED_ERR(fmaxinc)
17571 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
17573 goto internal_error;
17575 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
17580 res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
17582 goto internal_error;
17584 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
17589 res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
17591 goto internal_error;
17593 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
17602 res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
17604 goto internal_error;
17606 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
17614 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
17616 goto internal_error;
17618 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
17620 if ((
res != 0) && (bfmaxexc->fixed)) {
17621 FACET_RESTR_FIXED_ERR(fmaxexc)
17626 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
17628 goto internal_error;
17630 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
17635 res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
17637 goto internal_error;
17639 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
17644 res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
17646 goto internal_error;
17648 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
17657 res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
17659 goto internal_error;
17661 xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
17669 res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
17671 goto internal_error;
17673 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
17675 if ((
res != 0) && (bfminexc->fixed)) {
17676 FACET_RESTR_FIXED_ERR(fminexc)
17681 res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
17683 goto internal_error;
17685 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
17690 res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
17692 goto internal_error;
17694 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
17699 res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
17701 goto internal_error;
17703 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
17712 res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
17714 goto internal_error;
17716 xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
17724 res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
17726 goto internal_error;
17728 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
17730 if ((
res != 0) && (bfmininc->fixed)) {
17731 FACET_RESTR_FIXED_ERR(fmininc)
17736 res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
17738 goto internal_error;
17740 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
17745 res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
17747 goto internal_error;
17749 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
17753 res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
17755 goto internal_error;
17757 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
17760 if (ftotdig && bftotdig) {
17765 res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
17767 goto internal_error;
17769 xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
17771 if ((
res != 0) && (bftotdig->fixed)) {
17772 FACET_RESTR_FIXED_ERR(ftotdig)
17775 if (ffracdig && bffracdig) {
17780 res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
17782 goto internal_error;
17784 xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
17786 if ((
res != 0) && (bffracdig->fixed)) {
17787 FACET_RESTR_FIXED_ERR(ffracdig)
17794 ftotdig = bftotdig;
17796 ffracdig = bffracdig;
17797 if (ftotdig && ffracdig) {
17798 res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
17800 goto internal_error;
17802 xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
17817 bfacet =
cur->facet;
17822 if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
17823 (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
17832 facet =
link->facet;
17833 if (facet->type == bfacet->type) {
17834 switch (facet->type) {
17835 case XML_SCHEMA_FACET_WHITESPACE:
17839 if (facet->whitespace < bfacet->whitespace) {
17840 FACET_RESTR_ERR(facet,
17841 "The 'whitespace' value has to be equal to "
17842 "or stronger than the 'whitespace' value of "
17845 if ((bfacet->fixed) &&
17846 (facet->whitespace != bfacet->whitespace)) {
17847 FACET_RESTR_FIXED_ERR(facet)
17863 link = (xmlSchemaFacetLinkPtr)
17866 xmlSchemaPErrMemory(pctxt,
17867 "deriving facets, creating a facet link",
NULL);
17883 PERROR_INT(
"xmlSchemaDeriveAndValidateFacets",
17884 "an error occurred");
17889xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
17890 xmlSchemaTypePtr
type)
17892 xmlSchemaTypeLinkPtr
link, lastLink, prevLink, subLink, newLink;
17905 if (WXS_IS_TYPE_NOT_FIXED(
link->type))
17906 xmlSchemaTypeFixup(
link->type, ACTXT_CAST pctxt);
17908 if (WXS_IS_UNION(
link->type)) {
17909 subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
link->type);
17910 if (subLink !=
NULL) {
17911 link->type = subLink->type;
17912 if (subLink->next !=
NULL) {
17913 lastLink =
link->next;
17914 subLink = subLink->next;
17916 while (subLink !=
NULL) {
17917 newLink = (xmlSchemaTypeLinkPtr)
17919 if (newLink ==
NULL) {
17920 xmlSchemaPErrMemory(pctxt,
"allocating a type link",
17924 newLink->type = subLink->type;
17925 prevLink->next = newLink;
17926 prevLink = newLink;
17927 newLink->next = lastLink;
17929 subLink = subLink->next;
17940xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr
type)
17942 int has = 0, needVal = 0, normVal = 0;
17944 has = (
type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
17946 needVal = (
type->baseType->flags &
17947 XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
17948 normVal = (
type->baseType->flags &
17949 XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
17952 xmlSchemaFacetPtr fac;
17954 for (fac =
type->facets; fac !=
NULL; fac = fac->
next) {
17955 switch (fac->type) {
17956 case XML_SCHEMA_FACET_WHITESPACE:
17958 case XML_SCHEMA_FACET_PATTERN:
17962 case XML_SCHEMA_FACET_ENUMERATION:
17974 type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
17976 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17978 type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
17980 if (has && (! needVal) && WXS_IS_ATOMIC(
type)) {
17981 xmlSchemaTypePtr
prim = xmlSchemaGetPrimitiveType(
type);
17985 if ((
prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
17986 (
prim->builtInType != XML_SCHEMAS_STRING)) {
17987 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17993xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr
type)
18000 if (WXS_IS_LIST(
type)) {
18001 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
18003 }
else if (WXS_IS_UNION(
type))
18007 xmlSchemaFacetLinkPtr lin;
18009 for (lin =
type->facetSet; lin !=
NULL; lin = lin->
next) {
18010 if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
18011 switch (lin->facet->whitespace) {
18012 case XML_SCHEMAS_FACET_PRESERVE:
18013 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
18015 case XML_SCHEMAS_FACET_REPLACE:
18016 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
18018 case XML_SCHEMAS_FACET_COLLAPSE:
18019 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
18034 xmlSchemaTypePtr anc;
18036 for (anc =
type->baseType; anc !=
NULL &&
18037 anc->builtInType != XML_SCHEMAS_ANYTYPE;
18038 anc = anc->baseType) {
18040 if (anc->type == XML_SCHEMA_TYPE_BASIC) {
18041 if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
18042 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
18044 }
else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
18045 (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
18046 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
18049 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
18058xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
18059 xmlSchemaTypePtr
type)
18061 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
18063 if (! WXS_IS_TYPE_NOT_FIXED_1(
type))
18065 type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
18067 if (WXS_IS_LIST(
type)) {
18075 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
18076 "list type has no item-type assigned");
18079 }
else if (WXS_IS_UNION(
type)) {
18087 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
18088 "union type has no member-types assigned");
18096 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
18097 "type has no base-type assigned");
18100 if (WXS_IS_TYPE_NOT_FIXED_1(
type->baseType))
18101 if (xmlSchemaFixupSimpleTypeStageOne(pctxt,
type->baseType) == -1)
18108 if (WXS_IS_ATOMIC(
type->baseType))
18109 type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
18110 else if (WXS_IS_LIST(
type->baseType)) {
18111 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
18115 type->subtypes =
type->baseType->subtypes;
18116 }
else if (WXS_IS_UNION(
type->baseType)) {
18117 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
18130xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt,
18131 xmlSchemaTypePtr
type)
18135 "Type of %s : %s:%d :",
name,
18136 type->node->doc->URL,
18141 if ((WXS_IS_SIMPLE(
type)) || (WXS_IS_COMPLEX(
type))) {
18142 switch (
type->contentType) {
18143 case XML_SCHEMA_CONTENT_SIMPLE:
18146 case XML_SCHEMA_CONTENT_ELEMENTS:
18149 case XML_SCHEMA_CONTENT_UNKNOWN:
18152 case XML_SCHEMA_CONTENT_EMPTY:
18155 case XML_SCHEMA_CONTENT_MIXED:
18156 if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr)
18159 "mixed as emptiable particle\n");
18169 case XML_SCHEMA_CONTENT_BASIC:
18174 "not registered !!!\n");
18185xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
18186 xmlSchemaTypePtr
type)
18188 int res, olderrs = pctxt->nberrors;
18190 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
18193 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18196 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18197 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
18200 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageTwo",
18201 "missing baseType");
18204 if (WXS_IS_TYPE_NOT_FIXED(
type->baseType))
18205 xmlSchemaTypeFixup(
type->baseType, ACTXT_CAST pctxt);
18212 if ((
type->memberTypes !=
NULL) &&
18213 (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt,
type) == -1))
18225 res = xmlSchemaCheckSTPropsCorrect(pctxt,
type);
18231 res = xmlSchemaCheckCOSSTRestricts(pctxt,
type);
18248 res = xmlSchemaCheckFacetValues(
type, pctxt);
18251 (
type->baseType->facetSet !=
NULL)) {
18252 res = xmlSchemaDeriveAndValidateFacets(pctxt,
type);
18258 res = xmlSchemaTypeFixupWhitespace(
type);
18260 xmlSchemaTypeFixupOptimFacets(
type);
18264 xmlSchemaDebugFixedType(pctxt,
type);
18266 if (olderrs != pctxt->nberrors)
18267 return(pctxt->err);
18272 xmlSchemaDebugFixedType(pctxt,
type);
18278xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
18279 xmlSchemaTypePtr
type)
18281 int res = 0, olderrs = pctxt->nberrors;
18282 xmlSchemaTypePtr baseType =
type->baseType;
18284 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18286 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18287 if (baseType ==
NULL) {
18288 PERROR_INT(
"xmlSchemaFixupComplexType",
18289 "missing baseType");
18295 if (WXS_IS_TYPE_NOT_FIXED(baseType))
18296 xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
18297 if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
18307 res = xmlSchemaCheckSRCCT(pctxt,
type);
18312 if (
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
18316 if ((WXS_IS_COMPLEX(baseType)) &&
18317 (baseType->contentTypeDef !=
NULL) &&
18318 (WXS_IS_RESTRICTION(
type))) {
18319 xmlSchemaTypePtr contentBase,
content;
18320#ifdef ENABLE_NAMED_LOCALS
18328 if (
type->contentTypeDef !=
NULL) {
18336 contentBase =
type->contentTypeDef;
18344 contentBase = baseType->contentTypeDef;
18355#ifdef ENABLE_NAMED_LOCALS
18356 snprintf(
buf, 29,
"#scST%d", ++(pctxt->counter));
18358 content = xmlSchemaAddType(pctxt, pctxt->schema,
18359 XML_SCHEMA_TYPE_SIMPLE, tmpname,
type->targetNamespace,
18362 content = xmlSchemaAddType(pctxt, pctxt->schema,
18363 XML_SCHEMA_TYPE_SIMPLE,
NULL,
type->targetNamespace,
18372 content->type = XML_SCHEMA_TYPE_SIMPLE;
18373 content->baseType = contentBase;
18384 if (WXS_IS_TYPE_NOT_FIXED(contentBase))
18385 xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
18390 res = xmlSchemaFixupSimpleTypeStageOne(pctxt,
content);
18392 res = xmlSchemaFixupSimpleTypeStageTwo(pctxt,
content);
18395 }
else if ((WXS_IS_COMPLEX(baseType)) &&
18396 (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
18397 (WXS_IS_RESTRICTION(
type))) {
18403 if ((
type->contentTypeDef ==
NULL) ||
18404 (
type->contentTypeDef->baseType ==
NULL)) {
18408 xmlSchemaPCustomErr(pctxt,
18411 "Internal error: xmlSchemaTypeFixup, "
18412 "complex type '%s': the <simpleContent><restriction> "
18413 "is missing a <simpleType> child, but was not caught "
18414 "by xmlSchemaCheckSRCCT()",
type->
name);
18417 }
else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(
type)) {
18423 if (baseType->contentTypeDef ==
NULL) {
18428 xmlSchemaPCustomErr(pctxt,
18431 "Internal error: xmlSchemaTypeFixup, "
18432 "complex type '%s': the <extension>ed base type is "
18433 "a complex type with no simple content type",
18437 type->contentTypeDef = baseType->contentTypeDef;
18438 }
else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(
type)) {
18443 type->contentTypeDef = baseType;
18448 xmlSchemaPCustomErr(pctxt,
18451 "Internal error: xmlSchemaTypeFixup, "
18452 "complex type '%s' with <simpleContent>: unhandled "
18457 int dummySequence = 0;
18458 xmlSchemaParticlePtr particle =
18459 (xmlSchemaParticlePtr)
type->subtypes;
18470 if ((particle ==
NULL) ||
18471 ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
18472 ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
18473 (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
18474 ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
18475 (particle->minOccurs == 0))) &&
18476 ( ((xmlSchemaTreeItemPtr) particle->children)->children ==
NULL))) {
18477 if (
type->flags & XML_SCHEMAS_TYPE_MIXED) {
18487 if ((particle ==
NULL) ||
18488 (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
18492 particle = xmlSchemaAddParticle(pctxt,
18494 if (particle ==
NULL)
18499 particle->children = (xmlSchemaTreeItemPtr)
18500 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18501 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18502 if (particle->children ==
NULL)
18505 type->subtypes = (xmlSchemaTypePtr) particle;
18508 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18513 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
18521 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18526 if (WXS_IS_RESTRICTION(
type)) {
18530 if (
type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
18531 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18532 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18538 if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18544 type->contentType = baseType->contentType;
18545 type->subtypes = baseType->subtypes;
18551 type->contentTypeDef = baseType->contentTypeDef;
18555 }
else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18559 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18560 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18565 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18566 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18571 if ((WXS_TYPE_PARTICLE(
type) !=
NULL) &&
18572 (WXS_TYPE_PARTICLE_TERM(
type) !=
NULL) &&
18573 ((WXS_TYPE_PARTICLE_TERM(
type))->type ==
18574 XML_SCHEMA_TYPE_ALL))
18579 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18583 "The type has an 'all' model group in its "
18584 "{content type} and thus cannot be derived from "
18585 "a non-empty type, since this would produce a "
18586 "'sequence' model group containing the 'all' "
18587 "model group; 'all' model groups are not "
18588 "allowed to appear inside other model groups",
18591 }
else if ((WXS_TYPE_PARTICLE(baseType) !=
NULL) &&
18592 (WXS_TYPE_PARTICLE_TERM(baseType) !=
NULL) &&
18593 ((WXS_TYPE_PARTICLE_TERM(baseType))->
type ==
18594 XML_SCHEMA_TYPE_ALL))
18599 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18603 "A type cannot be derived by extension from a type "
18604 "which has an 'all' model group in its "
18605 "{content type}, since this would produce a "
18606 "'sequence' model group containing the 'all' "
18607 "model group; 'all' model groups are not "
18608 "allowed to appear inside other model groups",
18611 }
else if (! dummySequence) {
18612 xmlSchemaTreeItemPtr effectiveContent =
18613 (xmlSchemaTreeItemPtr)
type->subtypes;
18617 particle = xmlSchemaAddParticle(pctxt,
18619 if (particle ==
NULL)
18624 particle->children = (xmlSchemaTreeItemPtr)
18625 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18626 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18627 if (particle->children ==
NULL)
18629 WXS_TYPE_CONTENTTYPE(
type) = (xmlSchemaTypePtr) particle;
18636 particle->children->children =
18637 (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
18639 ((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs,
18640 ((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs);
18641 if (particle->children->children ==
NULL)
18643 particle = (xmlSchemaParticlePtr)
18644 particle->children->children;
18645 particle->children =
18646 ((xmlSchemaParticlePtr) baseType->subtypes)->children;
18650 particle->next = effectiveContent;
18671 particle->children->children =
18672 (xmlSchemaTreeItemPtr) baseType->subtypes;
18685 res = xmlSchemaFixupTypeAttributeUses(pctxt,
type);
18692 res = xmlSchemaCheckCTComponent(pctxt,
type);
18696 xmlSchemaDebugFixedType(pctxt,
type);
18698 if (olderrs != pctxt->nberrors)
18699 return(pctxt->err);
18704 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18706 xmlSchemaDebugFixedType(pctxt,
type);
18708 return(pctxt->err);
18711 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18713 xmlSchemaDebugFixedType(pctxt,
type);
18728xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
18729 xmlSchemaAbstractCtxtPtr actxt)
18733 if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
18734 AERROR_INT(
"xmlSchemaTypeFixup",
18735 "this function needs a parser context");
18738 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18740 if (
type->type == XML_SCHEMA_TYPE_COMPLEX)
18741 return(xmlSchemaFixupComplexType(PCTXT_CAST actxt,
type));
18742 else if (
type->type == XML_SCHEMA_TYPE_SIMPLE)
18743 return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt,
type));
18760xmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
18761 xmlSchemaTypePtr typeDecl,
18762 xmlSchemaParserCtxtPtr pctxt,
18765 int ret = 0, ctxtGiven;
18767 if ((facet ==
NULL) || (typeDecl ==
NULL))
18778 switch (facet->type) {
18779 case XML_SCHEMA_FACET_MININCLUSIVE:
18780 case XML_SCHEMA_FACET_MINEXCLUSIVE:
18781 case XML_SCHEMA_FACET_MAXINCLUSIVE:
18782 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
18783 case XML_SCHEMA_FACET_ENUMERATION: {
18788 xmlSchemaTypePtr
base;
18808 if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
18809 base = typeDecl->baseType;
18811 PERROR_INT(
"xmlSchemaCheckFacet",
18812 "a type user derived type has no base type");
18822 pctxt = xmlSchemaNewParserCtxt(
"*");
18833 ret = xmlSchemaVCheckCVCSimpleType(
18834 ACTXT_CAST pctxt, facet->node,
base,
18835 facet->value, &(facet->val), 1, 1, 0);
18840 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18842 "Internal error: xmlSchemaCheckFacet, "
18843 "failed to validate the value '%s' of the "
18844 "facet '%s' against the base type",
18845 facet->
value, xmlSchemaFacetTypeToString(facet->type));
18847 goto internal_error;
18854 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18855 ret, facet->node, WXS_BASIC_CAST facet,
18856 "The value '%s' of the facet does not validate "
18857 "against the base type '%s'",
18859 xmlSchemaFormatQName(&
str,
18860 base->targetNamespace,
base->name));
18861 FREE_AND_NULL(
str);
18864 }
else if (facet->val ==
NULL) {
18866 PERROR_INT(
"xmlSchemaCheckFacet",
18867 "value was not computed");
18873 case XML_SCHEMA_FACET_PATTERN:
18874 facet->regexp = xmlRegexpCompile(facet->value);
18875 if (facet->regexp ==
NULL) {
18879 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18880 ret, facet->node, WXS_BASIC_CAST typeDecl,
18881 "The value '%s' of the facet 'pattern' is not a "
18882 "valid regular expression",
18883 facet->value,
NULL);
18887 case XML_SCHEMA_FACET_TOTALDIGITS:
18888 case XML_SCHEMA_FACET_FRACTIONDIGITS:
18889 case XML_SCHEMA_FACET_LENGTH:
18890 case XML_SCHEMA_FACET_MAXLENGTH:
18891 case XML_SCHEMA_FACET_MINLENGTH:
18893 if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
18894 ret = xmlSchemaValidatePredefinedType(
18895 xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
18896 facet->value, &(facet->val));
18898 ret = xmlSchemaValidatePredefinedType(
18899 xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
18900 facet->value, &(facet->val));
18906 PERROR_INT(
"xmlSchemaCheckFacet",
18907 "validating facet value");
18909 goto internal_error;
18915 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
18916 ret, facet->node, WXS_BASIC_CAST typeDecl,
18917 "The value '%s' of the facet '%s' is not a valid '%s'",
18919 xmlSchemaFacetTypeToString(facet->type),
18920 (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
18928 case XML_SCHEMA_FACET_WHITESPACE:{
18930 facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
18932 facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
18934 facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
18940 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18941 ret, facet->node, WXS_BASIC_CAST typeDecl,
18942 "The value '%s' of the facet 'whitespace' is not "
18943 "valid", facet->value,
NULL);
18951 if ((! ctxtGiven) && (pctxt !=
NULL))
18952 xmlSchemaFreeParserCtxt(pctxt);
18955 if ((! ctxtGiven) && (pctxt !=
NULL))
18956 xmlSchemaFreeParserCtxt(pctxt);
18968xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
18969 xmlSchemaParserCtxtPtr pctxt)
18971 int res, olderrs = pctxt->nberrors;
18977 if (typeDecl->facets !=
NULL) {
18978 xmlSchemaFacetPtr facet = typeDecl->facets;
18984 if (pctxt->vctxt ==
NULL) {
18985 if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
18988 pctxt->vctxt->schema = pctxt->schema;
18989 while (facet !=
NULL) {
18990 res = xmlSchemaCheckFacet(facet, typeDecl, pctxt,
name);
18992 facet = facet->next;
18994 pctxt->vctxt->schema =
NULL;
18996 if (olderrs != pctxt->nberrors)
18997 return(pctxt->err);
19015static xmlSchemaTreeItemPtr
19016xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
19017 xmlSchemaTreeItemPtr particle)
19019 xmlSchemaTreeItemPtr circ =
NULL;
19020 xmlSchemaTreeItemPtr term;
19021 xmlSchemaModelGroupDefPtr gdef;
19023 for (; particle !=
NULL; particle = particle->
next) {
19024 term = particle->children;
19027 switch (term->type) {
19028 case XML_SCHEMA_TYPE_GROUP:
19029 gdef = (xmlSchemaModelGroupDefPtr) term;
19030 if (gdef == groupDef)
19036 if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
19038 if (gdef->children !=
NULL) {
19039 gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
19040 circ = xmlSchemaGetCircModelGrDefRef(groupDef,
19041 gdef->children->children);
19042 gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
19047 case XML_SCHEMA_TYPE_SEQUENCE:
19048 case XML_SCHEMA_TYPE_CHOICE:
19049 case XML_SCHEMA_TYPE_ALL:
19050 circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
19070xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr
item,
19071 xmlSchemaParserCtxtPtr ctxt)
19080 (
item->type != XML_SCHEMA_TYPE_GROUP) ||
19084 xmlSchemaTreeItemPtr circ;
19086 circ = xmlSchemaGetCircModelGrDefRef(
item,
item->children->children);
19087 if (circ !=
NULL) {
19096 xmlSchemaPCustomErr(ctxt,
19098 NULL, WXS_ITEM_NODE(circ),
19099 "Circular reference to the model group definition '%s' "
19100 "defined", xmlSchemaFormatQName(&
str,
19101 item->targetNamespace,
item->name));
19107 circ->children =
NULL;
19127xmlSchemaModelGroupToModelGroupDefFixup(
19129 xmlSchemaModelGroupPtr mg)
19131 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
19133 while (particle !=
NULL) {
19134 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
19135 ((WXS_PARTICLE_TERM(particle))->
type !=
19136 XML_SCHEMA_TYPE_GROUP))
19138 particle = WXS_PTC_CAST particle->next;
19141 if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) ==
NULL) {
19145 WXS_PARTICLE_TERM(particle) =
NULL;
19146 particle = WXS_PTC_CAST particle->
next;
19152 WXS_PARTICLE_TERM(particle) =
19153 WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
19155 particle = WXS_PTC_CAST particle->next;
19169static xmlSchemaQNameRefPtr
19170xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
19171 xmlSchemaItemListPtr
list)
19173 xmlSchemaAttributeGroupPtr gr;
19174 xmlSchemaQNameRefPtr
ref, circ;
19180 for (
i = 0;
i <
list->nbItems;
i++) {
19182 if ((
ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19183 (
ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
19186 gr = WXS_ATTR_GROUP_CAST
ref->item;
19189 if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
19195 if ((gr->attrUses) &&
19196 (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
19198 gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
19199 circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
19200 (xmlSchemaItemListPtr) gr->attrUses);
19201 gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
19220xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
19221 xmlSchemaParserCtxtPtr ctxt)
19237 if (attrGr->attrUses ==
NULL)
19239 else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
19242 xmlSchemaQNameRefPtr circ;
19244 circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
19245 (xmlSchemaItemListPtr) attrGr->attrUses);
19246 if (circ !=
NULL) {
19251 xmlSchemaPCustomErr(ctxt,
19253 NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
19254 "Circular reference to the attribute group '%s' "
19255 "defined", xmlSchemaGetComponentQName(&
str, attrGr));
19256 FREE_AND_NULL(
str);
19270xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19271 xmlSchemaAttributeGroupPtr attrGr);
19288xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
19289 xmlSchemaBasicItemPtr
item,
19290 xmlSchemaWildcardPtr *completeWild,
19291 xmlSchemaItemListPtr
list,
19292 xmlSchemaItemListPtr prohibs)
19294 xmlSchemaAttributeGroupPtr gr;
19295 xmlSchemaAttributeUsePtr use;
19296 xmlSchemaItemListPtr sublist;
19298 int created = (*completeWild ==
NULL) ? 0 : 1;
19301 prohibs->nbItems = 0;
19303 for (
i = 0;
i <
list->nbItems;
i++) {
19304 use =
list->items[
i];
19306 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
19307 if (prohibs ==
NULL) {
19308 PERROR_INT(
"xmlSchemaExpandAttributeGroupRefs",
19309 "unexpected attr prohibition found");
19315 if (xmlSchemaItemListRemove(
list,
i) == -1)
19325 xmlSchemaItemListAddSize(prohibs, 2, use);
19328 if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19329 ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
19331 if ((WXS_QNAME_CAST use)->
item ==
NULL)
19333 gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
19339 if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
19340 if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
19347 if (gr->attributeWildcard !=
NULL) {
19348 if (*completeWild ==
NULL) {
19349 *completeWild = gr->attributeWildcard;
19352 xmlSchemaWildcardPtr tmpWild;
19362 tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema,
19363 XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
19364 WXS_ITEM_NODE(
item));
19365 if (tmpWild ==
NULL)
19367 if (xmlSchemaCloneWildcardNsConstraints(pctxt,
19368 tmpWild, *completeWild) == -1)
19370 tmpWild->processContents = (*completeWild)->processContents;
19371 *completeWild = tmpWild;
19375 if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
19376 gr->attributeWildcard) == -1)
19384 sublist = ((xmlSchemaItemListPtr) gr->attrUses);
19385 if ((sublist ==
NULL) || sublist->nbItems == 0) {
19386 if (xmlSchemaItemListRemove(
list,
i) == -1)
19394 list->items[
i] = sublist->items[0];
19395 if (sublist->nbItems != 1) {
19396 for (
j = 1;
j < sublist->nbItems;
j++) {
19398 if (xmlSchemaItemListInsert(
list,
19399 sublist->items[
j],
i) == -1)
19409 if (prohibs && (prohibs->nbItems != 0) && (
list->nbItems != 0)) {
19410 xmlSchemaAttributeUseProhibPtr prohib;
19412 for (
i = prohibs->nbItems -1;
i >= 0;
i--) {
19413 prohib = prohibs->items[
i];
19414 for (
j = 0;
j <
list->nbItems;
j++) {
19415 use =
list->items[
j];
19417 if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
19418 (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
19422 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
19424 prohib->node,
NULL,
19425 "Skipping pointless attribute use prohibition "
19426 "'%s', since a corresponding attribute use "
19427 "exists already in the type definition",
19428 xmlSchemaFormatQName(&
str,
19429 prohib->targetNamespace, prohib->name),
19431 FREE_AND_NULL(
str);
19435 if (xmlSchemaItemListRemove(prohibs,
i) == -1)
19458xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19459 xmlSchemaAttributeGroupPtr attrGr)
19461 if ((attrGr->attrUses ==
NULL) ||
19462 (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
19465 attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
19466 if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
19467 &(attrGr->attributeWildcard), attrGr->attrUses,
NULL) == -1)
19484xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19485 xmlSchemaAttributeGroupPtr attrGr)
19495 if ((attrGr->attrUses !=
NULL) &&
19496 (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
19498 xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
19499 xmlSchemaAttributeUsePtr use, tmp;
19500 int i,
j, hasId = 0;
19502 for (
i = uses->nbItems -1;
i >= 0;
i--) {
19503 use = uses->items[
i];
19511 for (
j =
i -1;
j >= 0;
j--) {
19512 tmp = uses->items[
j];
19513 if ((WXS_ATTRUSE_DECL_NAME(use) ==
19514 WXS_ATTRUSE_DECL_NAME(tmp)) &&
19515 (WXS_ATTRUSE_DECL_TNS(use) ==
19516 WXS_ATTRUSE_DECL_TNS(tmp)))
19520 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19522 attrGr->node, WXS_BASIC_CAST attrGr,
19524 xmlSchemaGetComponentDesignation(&
str, use),
19526 FREE_AND_NULL(
str);
19530 if (xmlSchemaItemListRemove(uses,
i) == -1)
19543 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
19544 if (xmlSchemaIsDerivedFromBuiltInType(
19545 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
19550 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19552 attrGr->node, WXS_BASIC_CAST attrGr,
19553 "There must not exist more than one attribute "
19554 "declaration of type 'xs:ID' "
19555 "(or derived from 'xs:ID'). The %s violates this "
19557 xmlSchemaGetComponentDesignation(&
str, use),
19559 FREE_AND_NULL(
str);
19560 if (xmlSchemaItemListRemove(uses,
i) == -1)
19581xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr
ref,
19582 xmlSchemaParserCtxtPtr ctxt)
19584 xmlSchemaAttributeGroupPtr
group;
19588 group = xmlSchemaGetAttributeGroup(ctxt->schema,
19590 ref->targetNamespace);
19592 xmlSchemaPResCompAttrErr(ctxt,
19618xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19619 xmlSchemaAttributePtr
attr)
19630 if (WXS_ATTR_TYPEDEF(
attr) ==
NULL)
19641 if (xmlSchemaIsDerivedFromBuiltInType(
19642 WXS_ATTR_TYPEDEF(
attr), XML_SCHEMAS_ID))
19644 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19647 "Value constraints are not allowed if the type definition "
19648 "is or is derived from xs:ID",
19650 return(pctxt->err);
19660 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
19661 attr->node, WXS_ATTR_TYPEDEF(
attr),
19666 PERROR_INT(
"xmlSchemaCheckAttrPropsCorrect",
19667 "calling xmlSchemaVCheckCVCSimpleType()");
19670 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19673 "The value of the value constraint is not valid",
19675 return(pctxt->err);
19682static xmlSchemaElementPtr
19683xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
19684 xmlSchemaElementPtr ancestor)
19686 xmlSchemaElementPtr
ret;
19688 if (WXS_SUBST_HEAD(ancestor) ==
NULL)
19690 if (WXS_SUBST_HEAD(ancestor) == elemDecl)
19693 if (WXS_SUBST_HEAD(ancestor)->
flags & XML_SCHEMAS_ELEM_CIRCULAR)
19695 WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
19696 ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
19697 WXS_SUBST_HEAD(ancestor));
19698 WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
19716xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19717 xmlSchemaElementPtr elemDecl)
19720 xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
19727 if (WXS_SUBST_HEAD(elemDecl) !=
NULL) {
19728 xmlSchemaElementPtr
head = WXS_SUBST_HEAD(elemDecl), circ;
19730 xmlSchemaCheckElementDeclComponent(
head, pctxt);
19735 if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
19736 xmlSchemaPCustomErr(pctxt,
19738 WXS_BASIC_CAST elemDecl,
NULL,
19739 "Only global element declarations can have a "
19740 "substitution group affiliation",
NULL);
19749 if (
head == elemDecl)
19751 else if (WXS_SUBST_HEAD(
head) !=
NULL)
19752 circ = xmlSchemaCheckSubstGroupCircular(
head,
head);
19755 if (circ !=
NULL) {
19758 xmlSchemaPCustomErrExt(pctxt,
19760 WXS_BASIC_CAST circ,
NULL,
19761 "The element declaration '%s' defines a circular "
19762 "substitution group to element declaration '%s'",
19763 xmlSchemaGetComponentQName(&
strA, circ),
19764 xmlSchemaGetComponentQName(&strB,
head),
19766 FREE_AND_NULL(
strA)
19767 FREE_AND_NULL(strB)
19785 if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
19788 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
19789 set |= SUBSET_EXTENSION;
19790 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
19791 set |= SUBSET_RESTRICTION;
19793 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
19794 WXS_ELEM_TYPEDEF(
head),
set) != 0) {
19798 xmlSchemaPCustomErrExt(pctxt,
19800 WXS_BASIC_CAST elemDecl,
NULL,
19801 "The type definition '%s' was "
19802 "either rejected by the substitution group "
19803 "affiliation '%s', or not validly derived from its type "
19805 xmlSchemaGetComponentQName(&
strA, typeDef),
19806 xmlSchemaGetComponentQName(&strB,
head),
19807 xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(
head)));
19808 FREE_AND_NULL(
strA)
19809 FREE_AND_NULL(strB)
19810 FREE_AND_NULL(strC)
19821 if ((elemDecl->value !=
NULL) &&
19822 ((WXS_IS_SIMPLE(typeDef) &&
19823 xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
19824 (WXS_IS_COMPLEX(typeDef) &&
19825 WXS_HAS_SIMPLE_CONTENT(typeDef) &&
19826 xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
19827 XML_SCHEMAS_ID)))) {
19830 xmlSchemaPCustomErr(pctxt,
19832 WXS_BASIC_CAST elemDecl,
NULL,
19833 "The type definition (or type definition's content type) is or "
19834 "is derived from ID; value constraints are not allowed in "
19835 "conjunction with such a type definition",
NULL);
19836 }
else if (elemDecl->value !=
NULL) {
19846 if (typeDef ==
NULL) {
19847 xmlSchemaPErr(pctxt, elemDecl->node,
19849 "Internal error: xmlSchemaCheckElemPropsCorrect, "
19850 "type is missing... skipping validation of "
19851 "the value constraint",
NULL,
NULL);
19854 if (elemDecl->node !=
NULL) {
19855 if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
19862 vcret = xmlSchemaParseCheckCOSValidDefault(pctxt,
node,
19863 typeDef, elemDecl->value, &(elemDecl->defVal));
19866 PERROR_INT(
"xmlSchemaElemCheckValConstr",
19867 "failed to validate the value constraint of an "
19868 "element declaration");
19898xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
19899 xmlSchemaElementPtr elemDecl)
19901 if ((WXS_SUBST_HEAD(elemDecl) ==
NULL) ||
19903 (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
19906 xmlSchemaElementPtr
head;
19907 xmlSchemaTypePtr headType,
type;
19921 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
19923 headType =
head->subtypes;
19924 type = elemDecl->subtypes;
19925 if (headType ==
type)
19927 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
19928 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19929 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
19930 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19950 if ((WXS_IS_EXTENSION(
type)) &&
19951 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19952 methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19954 if (WXS_IS_RESTRICTION(
type) &&
19955 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19956 methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19964 type = elemDecl->subtypes->baseType;
19966 if (WXS_IS_COMPLEX(
type)) {
19968 XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19969 ((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
19970 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19972 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19973 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19974 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19977 if (
type == headType)
19982 (((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19983 (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
19984 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19985 (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
19989 xmlSchemaAddElementSubstitutionMember(ctxt,
head, elemDecl);
19990 if ((
head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
19991 head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
19996#ifdef WXS_ELEM_DECL_CONS_ENABLED
20007xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
20008 xmlSchemaBasicItemPtr ctxtComponent,
20009 xmlSchemaParticlePtr ctxtParticle,
20010 xmlSchemaParticlePtr searchParticle,
20011 xmlSchemaParticlePtr curParticle,
20017 xmlSchemaParticlePtr
cur = curParticle;
20018 if (curParticle ==
NULL) {
20021 if (WXS_PARTICLE_TERM(curParticle) ==
NULL) {
20029 switch (WXS_PARTICLE_TERM(
cur)->
type) {
20030 case XML_SCHEMA_TYPE_ANY:
20032 case XML_SCHEMA_TYPE_ELEMENT:
20034 ret = xmlSchemaCheckElementDeclConsistent(pctxt,
20035 ctxtComponent, ctxtParticle,
cur, ctxtParticle, 1);
20039 xmlSchemaElementPtr
elem =
20040 WXS_ELEM_CAST(WXS_PARTICLE_TERM(
cur));
20052 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->
name) &&
20054 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
20058 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20060 XML_SCHEMAP_COS_NONAMBIG,
20062 "In the content model of %s, there are multiple "
20063 "element declarations for '%s' with different "
20064 "type definitions",
20065 xmlSchemaGetComponentDesignation(&
strA,
20067 xmlSchemaFormatQName(&strB,
20068 WXS_PARTICLE_TERM_AS_ELEM(
cur)->targetNamespace,
20069 WXS_PARTICLE_TERM_AS_ELEM(
cur)->
name));
20070 FREE_AND_NULL(
strA);
20071 FREE_AND_NULL(strB);
20072 return(XML_SCHEMAP_COS_NONAMBIG);
20076 case XML_SCHEMA_TYPE_SEQUENCE: {
20079 case XML_SCHEMA_TYPE_CHOICE:{
20094 case XML_SCHEMA_TYPE_ALL:
20096 case XML_SCHEMA_TYPE_GROUP:
20099 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
20100 "xmlSchemaCheckElementDeclConsistent",
20101 "found unexpected term of type '%s' in content model",
20102 WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(
cur)),
NULL);
20105 cur = (xmlSchemaParticlePtr)
cur->next;
20123xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
20124 xmlSchemaParserCtxtPtr ctxt)
20126 if (elemDecl ==
NULL)
20128 if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
20130 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
20131 if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
20135 xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
20148xmlSchemaResolveModelGroupParticleReferences(
20149 xmlSchemaParserCtxtPtr ctxt,
20150 xmlSchemaModelGroupPtr mg)
20152 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
20153 xmlSchemaQNameRefPtr
ref;
20154 xmlSchemaBasicItemPtr refItem;
20159 while (particle !=
NULL) {
20160 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
20161 ((WXS_PARTICLE_TERM(particle))->
type !=
20162 XML_SCHEMA_EXTRA_QNAMEREF))
20164 goto next_particle;
20166 ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
20171 particle->children =
NULL;
20173 refItem = xmlSchemaGetNamedComponent(ctxt->schema,
20175 if (refItem ==
NULL) {
20180 goto next_particle;
20182 if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
20183 if (WXS_MODELGROUPDEF_MODEL(refItem) ==
NULL)
20185 goto next_particle;
20193 if ((WXS_MODELGROUPDEF_MODEL(refItem))->
type ==
20194 XML_SCHEMA_TYPE_ALL) {
20205 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20208 WXS_ITEM_NODE(particle),
NULL,
20209 "A model group definition is referenced, but "
20210 "it contains an 'all' model group, which "
20211 "cannot be contained by model groups",
20214 goto next_particle;
20216 particle->children = (xmlSchemaTreeItemPtr) refItem;
20222 particle->children = (xmlSchemaTreeItemPtr) refItem;
20225 particle = WXS_PTC_CAST particle->next;
20230xmlSchemaAreValuesEqual(xmlSchemaValPtr
x,
20233 xmlSchemaTypePtr tx,
ty, ptx, pty;
20236 while (
x !=
NULL) {
20238 tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
x));
20239 ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
y));
20240 ptx = xmlSchemaGetPrimitiveType(tx);
20241 pty = xmlSchemaGetPrimitiveType(
ty);
20257 if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
20258 WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
20260 xmlSchemaValueGetAsString(
x),
20261 xmlSchemaValueGetAsString(
y)))
20264 ret = xmlSchemaCompareValuesWhtsp(
20265 x, XML_SCHEMA_WHITESPACE_PRESERVE,
20266 y, XML_SCHEMA_WHITESPACE_PRESERVE);
20275 x = xmlSchemaValueGetNext(
x);
20277 y = xmlSchemaValueGetNext(
y);
20280 }
else if (xmlSchemaValueGetNext(
y) !=
NULL)
20296xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
20297 xmlSchemaParserCtxtPtr ctxt)
20299 if ((ctxt ==
NULL) || (ause ==
NULL))
20301 if ((ause->attrDecl ==
NULL) ||
20302 (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
20306 xmlSchemaQNameRefPtr
ref = WXS_QNAME_CAST ause->attrDecl;
20312 ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
20314 if (ause->attrDecl ==
NULL) {
20315 xmlSchemaPResCompAttrErr(ctxt,
20317 WXS_BASIC_CAST ause, ause->node,
20319 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20320 return(ctxt->err);;
20336xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
20337 xmlSchemaAttributeUsePtr use)
20339 if ((ctxt ==
NULL) || (use ==
NULL))
20341 if ((use->defValue ==
NULL) || (WXS_ATTRUSE_DECL(use) ==
NULL) ||
20342 ((WXS_ATTRUSE_DECL(use))->
type != XML_SCHEMA_TYPE_ATTRIBUTE))
20353 if (((WXS_ATTRUSE_DECL(use))->defValue !=
NULL) &&
20354 ((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMAS_ATTR_FIXED) &&
20355 ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20357 xmlSchemaPCustomErr(ctxt,
20359 WXS_BASIC_CAST use,
NULL,
20360 "The attribute declaration has a 'fixed' value constraint "
20361 ", thus the attribute use must also have a 'fixed' value "
20369 if ((use->defVal !=
NULL) && (WXS_ATTRUSE_TYPEDEF(use) !=
NULL)) {
20378 if (xmlSchemaIsDerivedFromBuiltInType(
20379 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
20381 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20383 NULL, WXS_BASIC_CAST use,
20384 "Value constraints are not allowed if the type definition "
20385 "is or is derived from xs:ID",
20390 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
20391 use->node, WXS_ATTRUSE_TYPEDEF(use),
20392 use->defValue, &(use->defVal),
20396 PERROR_INT2(
"xmlSchemaCheckAttrUsePropsCorrect",
20397 "calling xmlSchemaVCheckCVCSimpleType()");
20400 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20402 NULL, WXS_BASIC_CAST use,
20403 "The value of the value constraint is not valid",
20415 if (((WXS_ATTRUSE_DECL(use))->defVal !=
NULL) &&
20416 (((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20418 if (! xmlSchemaAreValuesEqual(use->defVal,
20419 (WXS_ATTRUSE_DECL(use))->defVal))
20421 xmlSchemaPCustomErr(ctxt,
20423 WXS_BASIC_CAST use,
NULL,
20424 "The 'fixed' value constraint of the attribute use "
20425 "must match the attribute declaration's value "
20427 (WXS_ATTRUSE_DECL(use))->defValue);
20445xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr
item,
20446 xmlSchemaParserCtxtPtr ctxt)
20454 if (
item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
20456 item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
20460 xmlSchemaTypePtr
type;
20462 type = xmlSchemaGetType(ctxt->schema,
item->typeName,
20465 xmlSchemaPResCompAttrErr(ctxt,
20468 "type",
item->typeName,
item->typeNs,
20469 XML_SCHEMA_TYPE_SIMPLE,
NULL);
20478 item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
20494xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
20495 xmlSchemaParserCtxtPtr pctxt)
20497 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
20499 if (idc->ref->name !=
NULL) {
20500 idc->ref->item = (xmlSchemaBasicItemPtr)
20501 xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
20502 idc->ref->targetNamespace);
20503 if (idc->ref->item ==
NULL) {
20508 xmlSchemaPResCompAttrErr(pctxt,
20510 WXS_BASIC_CAST idc, idc->node,
20511 "refer", idc->ref->name,
20512 idc->ref->targetNamespace,
20513 XML_SCHEMA_TYPE_IDC_KEY,
NULL);
20514 return(pctxt->err);
20515 }
else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
20519 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20521 NULL, WXS_BASIC_CAST idc,
20522 "The keyref references a keyref",
20524 idc->ref->item =
NULL;
20525 return(pctxt->err);
20527 if (idc->nbFields !=
20528 ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
20530 xmlSchemaIDCPtr refer;
20532 refer = (xmlSchemaIDCPtr) idc->ref->item;
20539 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20541 NULL, WXS_BASIC_CAST idc,
20542 "The cardinality of the keyref differs from the "
20543 "cardinality of the referenced key/unique '%s'",
20544 xmlSchemaFormatQName(&
str, refer->targetNamespace,
20548 return(pctxt->err);
20556xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
20557 xmlSchemaParserCtxtPtr pctxt)
20559 if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
20560 prohib->targetNamespace) ==
NULL) {
20562 xmlSchemaPResCompAttrErr(pctxt,
20564 NULL, prohib->node,
20565 "ref", prohib->
name, prohib->targetNamespace,
20566 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20572#define WXS_REDEFINED_TYPE(c) \
20573(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
20575#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
20576(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20578#define WXS_REDEFINED_ATTR_GROUP(c) \
20579(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
20582xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
20585 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20586 xmlSchemaBasicItemPtr prev,
item;
20593 item = redef->item;
20607 prev = xmlSchemaFindRedefCompInGraph(
20608 redef->targetBucket,
item->type,
20609 redef->refName, redef->refTargetNs);
20610 if (prev ==
NULL) {
20629 if (redef->reference)
20630 node = WXS_ITEM_NODE(redef->reference);
20633 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20640 "The %s '%s' to be redefined could not be found in "
20641 "the redefined schema",
20642 WXS_ITEM_TYPE_NAME(
item),
20643 xmlSchemaFormatQName(&
str, redef->refTargetNs,
20645 FREE_AND_NULL(
str);
20647 redef = redef->
next;
20655 switch (
item->type) {
20656 case XML_SCHEMA_TYPE_COMPLEX:
20657 case XML_SCHEMA_TYPE_SIMPLE:
20658 if ((WXS_TYPE_CAST prev)->
flags &
20659 XML_SCHEMAS_TYPE_REDEFINED)
20665 (WXS_TYPE_CAST prev)->
flags |= XML_SCHEMAS_TYPE_REDEFINED;
20671 ((xmlSchemaTypePtr)
item)->baseType =
20672 (xmlSchemaTypePtr) prev;
20674 case XML_SCHEMA_TYPE_GROUP:
20675 if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
20676 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20682 (WXS_MODEL_GROUPDEF_CAST prev)->
flags |=
20683 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
20684 if (redef->reference !=
NULL) {
20689 (WXS_PTC_CAST redef->reference)->children =
20690 WXS_TREE_CAST prev;
20692 redef->target = prev;
20694 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20695 if ((WXS_ATTR_GROUP_CAST prev)->flags &
20696 XML_SCHEMAS_ATTRGROUP_REDEFINED)
20701 (WXS_ATTR_GROUP_CAST prev)->
flags |=
20702 XML_SCHEMAS_ATTRGROUP_REDEFINED;
20703 if (redef->reference !=
NULL) {
20710 (WXS_QNAME_CAST redef->reference)->
item = prev;
20711 redef->target =
NULL;
20720 redef->target = prev;
20724 PERROR_INT(
"xmlSchemaResolveRedefReferences",
20725 "Unexpected redefined component type");
20728 if (wasRedefined) {
20732 if (redef->reference)
20733 node = WXS_ITEM_NODE(redef->reference);
20735 node = WXS_ITEM_NODE(redef->item);
20737 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20741 "The referenced %s was already redefined. Multiple "
20742 "redefinition of the same component is not supported",
20743 xmlSchemaGetComponentDesignation(&
str, prev),
20747 redef = redef->
next;
20750 redef = redef->next;
20751 }
while (redef !=
NULL);
20757xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
20760 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20761 xmlSchemaBasicItemPtr
item;
20767 if (redef->target ==
NULL) {
20768 redef = redef->next;
20771 item = redef->item;
20773 switch (
item->type) {
20774 case XML_SCHEMA_TYPE_SIMPLE:
20775 case XML_SCHEMA_TYPE_COMPLEX:
20780 (WXS_TYPE_CAST redef->target)->
name =
NULL;
20787 case XML_SCHEMA_TYPE_GROUP:
20799 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20813 err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
20814 XML_SCHEMA_ACTION_REDEFINE,
20815 item, redef->target,
20816 (WXS_ATTR_GROUP_CAST
item)->attrUses,
20817 (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
20818 (WXS_ATTR_GROUP_CAST
item)->attributeWildcard,
20819 (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
20826 redef = redef->next;
20827 }
while (redef !=
NULL);
20833xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
20834 xmlSchemaBucketPtr bucket)
20836 xmlSchemaBasicItemPtr
item;
20842#define WXS_GET_GLOBAL_HASH(c, slot) { \
20843 if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
20844 table = &(WXS_IMPBUCKET((c))->schema->slot); \
20846 table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
20860 if (bucket ==
NULL)
20862 if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
20864 bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
20866 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
20867 item = bucket->globals->items[
i];
20869 switch (
item->type) {
20870 case XML_SCHEMA_TYPE_COMPLEX:
20871 case XML_SCHEMA_TYPE_SIMPLE:
20872 if (WXS_REDEFINED_TYPE(
item))
20875 WXS_GET_GLOBAL_HASH(bucket, typeDecl)
20877 case XML_SCHEMA_TYPE_ELEMENT:
20879 WXS_GET_GLOBAL_HASH(bucket, elemDecl)
20881 case XML_SCHEMA_TYPE_ATTRIBUTE:
20883 WXS_GET_GLOBAL_HASH(bucket, attrDecl)
20885 case XML_SCHEMA_TYPE_GROUP:
20886 if (WXS_REDEFINED_MODEL_GROUP_DEF(
item))
20889 WXS_GET_GLOBAL_HASH(bucket, groupDecl)
20891 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20892 if (WXS_REDEFINED_ATTR_GROUP(
item))
20895 WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
20897 case XML_SCHEMA_TYPE_IDC_KEY:
20898 case XML_SCHEMA_TYPE_IDC_UNIQUE:
20899 case XML_SCHEMA_TYPE_IDC_KEYREF:
20901 WXS_GET_GLOBAL_HASH(bucket, idcDef)
20903 case XML_SCHEMA_TYPE_NOTATION:
20905 WXS_GET_GLOBAL_HASH(bucket, notaDecl)
20908 PERROR_INT(
"xmlSchemaAddComponents",
20909 "Unexpected global component type");
20915 PERROR_INT(
"xmlSchemaAddComponents",
20916 "failed to create a component hash table");
20924 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20926 WXS_ITEM_NODE(
item),
20927 WXS_BASIC_CAST
item,
20928 "A global %s '%s' does already exist",
20929 WXS_ITEM_TYPE_NAME(
item),
20930 xmlSchemaGetComponentQName(&
str,
item));
20931 FREE_AND_NULL(
str);
20937 if (bucket->relations !=
NULL) {
20938 xmlSchemaSchemaRelationPtr rel = bucket->relations;
20940 if ((rel->bucket !=
NULL) &&
20941 ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
20942 if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
20946 }
while (rel !=
NULL);
20952xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
20953 xmlSchemaBucketPtr rootBucket)
20955 xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
20957 int nbItems,
i,
ret = 0;
20958 xmlSchemaBucketPtr oldbucket = con->bucket;
20959 xmlSchemaElementPtr elemDecl;
20961#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
20963 if ((con->pending ==
NULL) ||
20964 (con->pending->nbItems == 0))
20974 if (con->bucket ==
NULL)
20975 con->bucket = rootBucket;
20988 xmlSchemaCheckSRCRedefineFirst(pctxt);
20993 xmlSchemaAddComponents(pctxt, rootBucket);
20995 pctxt->ctxtType =
NULL;
20996 items = (xmlSchemaTreeItemPtr *) con->pending->items;
20997 nbItems = con->pending->nbItems;
21024 for (
i = 0;
i < nbItems;
i++) {
21026 switch (
item->type) {
21027 case XML_SCHEMA_TYPE_ELEMENT:
21028 xmlSchemaResolveElementReferences(
21029 (xmlSchemaElementPtr)
item, pctxt);
21032 case XML_SCHEMA_TYPE_COMPLEX:
21033 case XML_SCHEMA_TYPE_SIMPLE:
21034 xmlSchemaResolveTypeReferences(
21035 (xmlSchemaTypePtr)
item, pctxt);
21038 case XML_SCHEMA_TYPE_ATTRIBUTE:
21039 xmlSchemaResolveAttrTypeReferences(
21040 (xmlSchemaAttributePtr)
item, pctxt);
21043 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21044 xmlSchemaResolveAttrUseReferences(
21045 (xmlSchemaAttributeUsePtr)
item, pctxt);
21048 case XML_SCHEMA_EXTRA_QNAMEREF:
21049 if ((WXS_QNAME_CAST
item)->itemType ==
21050 XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
21052 xmlSchemaResolveAttrGroupReferences(
21053 WXS_QNAME_CAST
item, pctxt);
21057 case XML_SCHEMA_TYPE_SEQUENCE:
21058 case XML_SCHEMA_TYPE_CHOICE:
21059 case XML_SCHEMA_TYPE_ALL:
21060 xmlSchemaResolveModelGroupParticleReferences(pctxt,
21061 WXS_MODEL_GROUP_CAST
item);
21064 case XML_SCHEMA_TYPE_IDC_KEY:
21065 case XML_SCHEMA_TYPE_IDC_UNIQUE:
21066 case XML_SCHEMA_TYPE_IDC_KEYREF:
21067 xmlSchemaResolveIDCKeyReferences(
21068 (xmlSchemaIDCPtr)
item, pctxt);
21071 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
21076 xmlSchemaResolveAttrUseProhibReferences(
21077 WXS_ATTR_PROHIB_CAST
item, pctxt);
21084 if (pctxt->nberrors != 0)
21095 for (
i = 0;
i < nbItems;
i++) {
21100 switch (
item->type) {
21101 case XML_SCHEMA_TYPE_COMPLEX:
21102 case XML_SCHEMA_TYPE_SIMPLE:
21103 xmlSchemaCheckTypeDefCircular(
21104 (xmlSchemaTypePtr)
item, pctxt);
21106 if (pctxt->nberrors != 0)
21109 case XML_SCHEMA_TYPE_GROUP:
21110 xmlSchemaCheckGroupDefCircular(
21111 (xmlSchemaModelGroupDefPtr)
item, pctxt);
21113 if (pctxt->nberrors != 0)
21116 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21117 xmlSchemaCheckAttrGroupCircular(
21118 (xmlSchemaAttributeGroupPtr)
item, pctxt);
21120 if (pctxt->nberrors != 0)
21127 if (pctxt->nberrors != 0)
21137 for (
i = 0;
i < nbItems;
i++) {
21139 switch (
item->type) {
21140 case XML_SCHEMA_TYPE_SEQUENCE:
21141 case XML_SCHEMA_TYPE_CHOICE:
21142 xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
21143 WXS_MODEL_GROUP_CAST
item);
21149 if (pctxt->nberrors != 0)
21154 for (
i = 0;
i < nbItems;
i++) {
21156 switch (
item->type) {
21157 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21158 if ((! WXS_ATTR_GROUP_EXPANDED(
item)) &&
21159 WXS_ATTR_GROUP_HAS_REFS(
item))
21161 xmlSchemaAttributeGroupExpandRefs(pctxt,
21162 WXS_ATTR_GROUP_CAST
item);
21170 if (pctxt->nberrors != 0)
21177 for (
i = 0;
i < nbItems;
i++) {
21179 switch (
item->type) {
21180 case XML_SCHEMA_TYPE_SIMPLE:
21181 if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr)
item)) {
21182 xmlSchemaFixupSimpleTypeStageOne(pctxt,
21183 (xmlSchemaTypePtr)
item);
21191 if (pctxt->nberrors != 0)
21197 for (
i = 0;
i < nbItems;
i++) {
21199 switch (
item->type) {
21200 case XML_SCHEMA_TYPE_SIMPLE:
21201 if (((xmlSchemaTypePtr)
item)->memberTypes !=
NULL) {
21202 xmlSchemaCheckUnionTypeDefCircular(pctxt,
21203 (xmlSchemaTypePtr)
item);
21211 if (pctxt->nberrors != 0)
21217 for (
i = 0;
i < nbItems;
i++) {
21219 switch (
item->type) {
21220 case XML_SCHEMA_TYPE_SIMPLE:
21221 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21222 xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST
item);
21230 if (pctxt->nberrors != 0)
21238 for (
i = 0;
i < nbItems;
i++) {
21240 switch (
item->type) {
21241 case XML_SCHEMA_TYPE_ATTRIBUTE:
21242 xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST
item);
21249 if (pctxt->nberrors != 0)
21254 for (
i = 0;
i < nbItems;
i++) {
21256 switch (
item->type) {
21257 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21258 if (((xmlSchemaAttributeUsePtr)
item)->defValue !=
NULL) {
21259 xmlSchemaCheckAttrUsePropsCorrect(pctxt,
21260 WXS_ATTR_USE_CAST
item);
21268 if (pctxt->nberrors != 0)
21274 for (
i = 0;
i < nbItems;
i++) {
21276 switch (
item->type) {
21277 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21278 if (( (WXS_ATTR_GROUP_CAST
item)->attrUses !=
NULL) &&
21279 ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST
item)->attrUses)->nbItems > 1))
21281 xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST
item);
21289 if (pctxt->nberrors != 0)
21295 if (WXS_CONSTRUCTOR(pctxt)->redefs !=
NULL)
21296 xmlSchemaCheckSRCRedefineSecond(pctxt);
21297 if (pctxt->nberrors != 0)
21303 for (
i = 0;
i < nbItems;
i++) {
21304 item = con->pending->items[
i];
21305 switch (
item->type) {
21306 case XML_SCHEMA_TYPE_COMPLEX:
21307 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21308 xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST
item);
21316 if (pctxt->nberrors != 0)
21323 items = (xmlSchemaTreeItemPtr *) con->pending->items;
21324 nbItems = con->pending->nbItems;
21329 for (
i = 0;
i < nbItems;
i++) {
21331 switch (
item->type) {
21332 case XML_SCHEMA_TYPE_ELEMENT:
21333 elemDecl = (xmlSchemaElementPtr)
item;
21335 if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
21337 xmlSchemaCheckElementDeclComponent(
21338 (xmlSchemaElementPtr) elemDecl, pctxt);
21342#ifdef WXS_ELEM_DECL_CONS_ENABLED
21347 if ((WXS_ELEM_TYPEDEF(elemDecl) !=
NULL) &&
21348 (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
21349 (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
21351 xmlSchemaCheckElementDeclConsistent(pctxt,
21352 WXS_BASIC_CAST elemDecl,
21353 WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
21362 if (pctxt->nberrors != 0)
21370 for (
i = 0;
i < nbItems;
i++) {
21372 switch (
item->type) {
21373 case XML_SCHEMA_TYPE_COMPLEX:
21374 xmlSchemaBuildContentModel((xmlSchemaTypePtr)
item, pctxt);
21381 if (pctxt->nberrors != 0)
21401 con->bucket = oldbucket;
21402 con->pending->nbItems = 0;
21403 if (con->substGroups !=
NULL) {
21404 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
21405 con->substGroups =
NULL;
21407 if (con->redefs !=
NULL) {
21408 xmlSchemaRedefListFree(con->redefs);
21409 con->redefs =
NULL;
21424xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
21426 xmlSchemaPtr mainSchema =
NULL;
21427 xmlSchemaBucketPtr bucket =
NULL;
21435 xmlSchemaInitTypes();
21441 ctxt->nberrors = 0;
21446 mainSchema = xmlSchemaNewSchema(ctxt);
21447 if (mainSchema ==
NULL)
21452 if (ctxt->constructor ==
NULL) {
21453 ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
21454 if (ctxt->constructor ==
NULL)
21457 ctxt->ownsConstructor = 1;
21459 ctxt->constructor->mainSchema = mainSchema;
21463 res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
21464 ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size,
NULL,
21471 if (bucket ==
NULL) {
21476 "Failed to locate the main schema resource at '%s'",
21481 "Failed to locate the main schema resource",
21486 if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
21488 if (ctxt->nberrors != 0)
21491 mainSchema->doc = bucket->doc;
21492 mainSchema->preserve = ctxt->preserve;
21494 ctxt->schema = mainSchema;
21496 if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
21504 if (ctxt->nberrors != 0) {
21506 xmlSchemaFree(mainSchema);
21509 if (ctxt->constructor) {
21510 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21511 ctxt->constructor =
NULL;
21512 ctxt->ownsConstructor = 0;
21515 ctxt->schema =
NULL;
21516 return(mainSchema);
21523 xmlSchemaFree(mainSchema);
21526 if (ctxt->constructor) {
21527 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21528 ctxt->constructor =
NULL;
21529 ctxt->ownsConstructor = 0;
21531 PERROR_INT2(
"xmlSchemaParse",
21532 "An internal error occurred");
21533 ctxt->schema =
NULL;
21547xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21548 xmlSchemaValidityErrorFunc
err,
21549 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
21554 ctxt->warning =
warn;
21555 ctxt->errCtxt =
ctx;
21556 if (ctxt->vctxt !=
NULL)
21557 xmlSchemaSetValidErrors(ctxt->vctxt,
err,
warn,
ctx);
21569xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
21575 ctxt->serror = serror;
21576 ctxt->errCtxt =
ctx;
21577 if (ctxt->vctxt !=
NULL)
21578 xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror,
ctx);
21593xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21594 xmlSchemaValidityErrorFunc *
err,
21595 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
21600 *
err = ctxt->error;
21602 *
warn = ctxt->warning;
21604 *
ctx = ctxt->errCtxt;
21618xmlSchemaFacetTypeToString(xmlSchemaTypeType
type)
21621 case XML_SCHEMA_FACET_PATTERN:
21623 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
21625 case XML_SCHEMA_FACET_MAXINCLUSIVE:
21627 case XML_SCHEMA_FACET_MINEXCLUSIVE:
21629 case XML_SCHEMA_FACET_MININCLUSIVE:
21631 case XML_SCHEMA_FACET_WHITESPACE:
21633 case XML_SCHEMA_FACET_ENUMERATION:
21635 case XML_SCHEMA_FACET_LENGTH:
21637 case XML_SCHEMA_FACET_MAXLENGTH:
21639 case XML_SCHEMA_FACET_MINLENGTH:
21641 case XML_SCHEMA_FACET_TOTALDIGITS:
21643 case XML_SCHEMA_FACET_FRACTIONDIGITS:
21644 return (
BAD_CAST "fractionDigits");
21648 return (
BAD_CAST "Internal Error");
21651static xmlSchemaWhitespaceValueType
21652xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type)
21658 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
21662 if ((
type->builtInType == XML_SCHEMAS_STRING) ||
21663 (
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
21664 return(XML_SCHEMA_WHITESPACE_PRESERVE);
21665 else if (
type->builtInType == XML_SCHEMAS_NORMSTRING)
21666 return(XML_SCHEMA_WHITESPACE_REPLACE);
21674 return(XML_SCHEMA_WHITESPACE_COLLAPSE);
21676 }
else if (WXS_IS_LIST(
type)) {
21680 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21681 }
else if (WXS_IS_UNION(
type)) {
21682 return (XML_SCHEMA_WHITESPACE_UNKNOWN);
21683 }
else if (WXS_IS_ATOMIC(
type)) {
21684 if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
21685 return (XML_SCHEMA_WHITESPACE_PRESERVE);
21686 else if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
21687 return (XML_SCHEMA_WHITESPACE_REPLACE);
21689 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21722xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
21729 xmlSchemaParserCtxtPtr pctxt;
21730 xmlSchemaBucketPtr bucket =
NULL;
21735 if (vctxt->pctxt ==
NULL) {
21736 VERROR_INT(
"xmlSchemaAssembleByLocation",
21737 "no parser context available");
21740 pctxt = vctxt->pctxt;
21741 if (pctxt->constructor ==
NULL) {
21742 PERROR_INT(
"xmlSchemaAssembleByLocation",
21749 location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
21756 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
21761 if (bucket ==
NULL) {
21767 "The document at location '%s' could not be acquired",
21775 if ((bucket !=
NULL) &&
21776 (WXS_CONSTRUCTOR(pctxt)->bucket ==
NULL))
21777 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
21782 if ((bucket ==
NULL) || (! CAN_PARSE_SCHEMA(bucket)))
21788 pctxt->nberrors = 0;
21790 pctxt->doc = bucket->doc;
21792 ret = xmlSchemaParseNewDocWithContext(pctxt,
schema, bucket);
21798 if ((
ret == 0) && (pctxt->nberrors != 0))
21800 if (pctxt->nberrors == 0) {
21807 xmlSchemaFixupComponents(pctxt, bucket);
21813 if ((
ret != 0) && (vctxt->err == 0))
21815 vctxt->nberrors += pctxt->nberrors;
21818 vctxt->nberrors += pctxt->nberrors;
21827static xmlSchemaAttrInfoPtr
21828xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
21831 if (vctxt->nbAttrInfos == 0)
21835 xmlSchemaAttrInfoPtr iattr;
21837 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
21838 iattr = vctxt->attrInfos[
i];
21839 if (iattr->metaType == metaType)
21860xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
21866 xmlSchemaAttrInfoPtr iattr;
21876 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21877 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
21879 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21880 XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
21883 cur = iattr->value;
21888 if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
21912 if (iattr->metaType ==
21913 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
21921 "The value must consist of tuples: the target namespace "
21929 ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
21932 VERROR_INT(
"xmlSchemaAssembleByXSI",
21933 "assembling schemata");
21936 }
while (*
cur != 0);
21941xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
21944 if (vctxt->sax !=
NULL) {
21946 xmlSchemaNodeInfoPtr
inode;
21948 for (
i = vctxt->depth;
i >= 0;
i--) {
21949 if (vctxt->elemInfos[
i]->nbNsBindings != 0) {
21950 inode = vctxt->elemInfos[
i];
21951 for (
j = 0;
j <
inode->nbNsBindings * 2;
j += 2) {
21955 inode->nsBindings[
j]))) {
21961 return (
inode->nsBindings[
j+1]);
21967#ifdef LIBXML_READER_ENABLED
21968 }
else if (vctxt->reader !=
NULL) {
21971 nsName = xmlTextReaderLookupNamespace(vctxt->reader,
prefix);
21972 if (nsName !=
NULL) {
21984 if ((vctxt->inode->node ==
NULL) ||
21985 (vctxt->inode->node->doc ==
NULL)) {
21986 VERROR_INT(
"xmlSchemaLookupNamespace",
21987 "no node or node's doc available");
21991 vctxt->inode->node,
prefix);
22002xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
22006 xmlSchemaValPtr *
val,
22011 if (vctxt && (vctxt->schema ==
NULL)) {
22012 VERROR_INT(
"xmlSchemaValidateNotation",
22013 "a schema is needed on the validation context");
22038 if (nsName ==
NULL) {
22043 if (xmlSchemaGetNotation(
schema, localName, nsName) !=
NULL) {
22044 if ((valNeeded) && (
val !=
NULL)) {
22045 (*val) = xmlSchemaNewNOTATIONValue(
xmlStrdup(localName),
22056 if (valNeeded && (
val !=
NULL)) {
22057 (*val) = xmlSchemaNewNOTATIONValue(
22070xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
22079 if (nsname !=
NULL) {
22081 if (nsname ==
NULL)
22084 for (
i = 0;
i < vctxt->nodeQNames->nbItems;
i += 2) {
22085 if ((vctxt->nodeQNames->items [
i] == lname) &&
22086 (vctxt->nodeQNames->items[
i +1] == nsname))
22091 i = vctxt->nodeQNames->nbItems;
22092 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) lname);
22093 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) nsname);
22112xmlSchemaAugmentIDC(
void *payload,
void *
data,
22115 xmlSchemaIDCPtr idcDef = (xmlSchemaIDCPtr) payload;
22116 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
22117 xmlSchemaIDCAugPtr aidc;
22119 aidc = (xmlSchemaIDCAugPtr)
xmlMalloc(
sizeof(xmlSchemaIDCAug));
22120 if (aidc ==
NULL) {
22121 xmlSchemaVErrMemory(vctxt,
22122 "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
22126 aidc->keyrefDepth = -1;
22127 aidc->def = idcDef;
22129 if (vctxt->aidcs ==
NULL)
22130 vctxt->aidcs = aidc;
22132 aidc->
next = vctxt->aidcs;
22133 vctxt->aidcs = aidc;
22138 if ((vctxt->hasKeyrefs == 0) &&
22139 (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
22140 vctxt->hasKeyrefs = 1;
22150xmlSchemaAugmentImportedIDC(
void *payload,
void *
data,
22152 xmlSchemaImportPtr imported = (xmlSchemaImportPtr) payload;
22153 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
22154 if (imported->schema->idcDef !=
NULL) {
22155 xmlHashScan(imported->schema->idcDef, xmlSchemaAugmentIDC, vctxt);
22167static xmlSchemaPSVIIDCBindingPtr
22168xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
22170 xmlSchemaPSVIIDCBindingPtr
ret;
22173 sizeof(xmlSchemaPSVIIDCBinding));
22175 xmlSchemaVErrMemory(
NULL,
22176 "allocating a PSVI IDC binding item",
NULL);
22179 memset(
ret, 0,
sizeof(xmlSchemaPSVIIDCBinding));
22180 ret->definition = idcDef;
22196xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
22197 xmlSchemaPSVIIDCNodePtr
item)
22202 if (vctxt->idcNodes ==
NULL) {
22203 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22204 xmlMalloc(20 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22205 if (vctxt->idcNodes ==
NULL) {
22206 xmlSchemaVErrMemory(vctxt,
22207 "allocating the IDC node table item list",
NULL);
22210 vctxt->sizeIdcNodes = 20;
22211 }
else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
22212 vctxt->sizeIdcNodes *= 2;
22213 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22214 xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
22215 sizeof(xmlSchemaPSVIIDCNodePtr));
22216 if (vctxt->idcNodes ==
NULL) {
22217 xmlSchemaVErrMemory(vctxt,
22218 "re-allocating the IDC node table item list",
NULL);
22222 vctxt->idcNodes[vctxt->nbIdcNodes++] =
item;
22237xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
22238 xmlSchemaPSVIIDCKeyPtr
key)
22243 if (vctxt->idcKeys ==
NULL) {
22244 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22245 xmlMalloc(40 *
sizeof(xmlSchemaPSVIIDCKeyPtr));
22246 if (vctxt->idcKeys ==
NULL) {
22247 xmlSchemaVErrMemory(vctxt,
22248 "allocating the IDC key storage list",
NULL);
22251 vctxt->sizeIdcKeys = 40;
22252 }
else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
22253 vctxt->sizeIdcKeys *= 2;
22254 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22255 xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
22256 sizeof(xmlSchemaPSVIIDCKeyPtr));
22257 if (vctxt->idcKeys ==
NULL) {
22258 xmlSchemaVErrMemory(vctxt,
22259 "re-allocating the IDC key storage list",
NULL);
22263 vctxt->idcKeys[vctxt->nbIdcKeys++] =
key;
22278xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr
bind,
22279 xmlSchemaPSVIIDCNodePtr ntItem)
22282 bind->sizeNodes = 10;
22283 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22284 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22286 xmlSchemaVErrMemory(
NULL,
22287 "allocating an array of IDC node-table items",
NULL);
22290 }
else if (
bind->sizeNodes <=
bind->nbNodes) {
22291 bind->sizeNodes *= 2;
22292 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22294 sizeof(xmlSchemaPSVIIDCNodePtr));
22296 xmlSchemaVErrMemory(
NULL,
22297 "re-allocating an array of IDC node-table items",
NULL);
22301 bind->nodeTable[
bind->nbNodes++] = ntItem;
22316static xmlSchemaPSVIIDCBindingPtr
22317xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
22318 xmlSchemaIDCMatcherPtr matcher)
22320 xmlSchemaNodeInfoPtr ielem;
22322 ielem = vctxt->elemInfos[matcher->depth];
22324 if (ielem->idcTable ==
NULL) {
22325 ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
22326 if (ielem->idcTable ==
NULL)
22328 return(ielem->idcTable);
22330 xmlSchemaPSVIIDCBindingPtr
bind =
NULL;
22332 bind = ielem->idcTable;
22334 if (
bind->definition == matcher->aidc->def)
22337 bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
22340 return(
bind->next);
22348static xmlSchemaItemListPtr
22349xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt
ATTRIBUTE_UNUSED,
22350 xmlSchemaIDCMatcherPtr matcher)
22352 if (matcher->targets ==
NULL)
22353 matcher->targets = xmlSchemaItemListCreate();
22354 return(matcher->targets);
22364xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr
key)
22367 xmlSchemaFreeValue(
key->val);
22378xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr
bind)
22383 xmlSchemaItemListFree(
bind->dupls);
22394xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr
bind)
22396 xmlSchemaPSVIIDCBindingPtr prev;
22401 xmlSchemaIDCFreeBinding(prev);
22408 xmlIDCHashEntryPtr
e = payload,
n;
22423xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
22425 xmlSchemaIDCMatcherPtr
next;
22427 while (matcher !=
NULL) {
22428 next = matcher->next;
22429 if (matcher->keySeqs !=
NULL) {
22431 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22432 if (matcher->keySeqs[
i] !=
NULL)
22436 if (matcher->targets !=
NULL) {
22437 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22439 xmlSchemaPSVIIDCNodePtr idcNode;
22445 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22447 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22452 xmlSchemaItemListFree(matcher->targets);
22454 if (matcher->htab !=
NULL)
22469xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
22470 xmlSchemaIDCMatcherPtr matcher)
22472 xmlSchemaIDCMatcherPtr
next;
22474 while (matcher !=
NULL) {
22475 next = matcher->next;
22476 if (matcher->keySeqs !=
NULL) {
22481 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22482 if (matcher->keySeqs[
i] !=
NULL) {
22484 matcher->keySeqs[
i] =
NULL;
22487 if (matcher->targets) {
22488 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22490 xmlSchemaPSVIIDCNodePtr idcNode;
22496 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22498 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22503 xmlSchemaItemListFree(matcher->targets);
22504 matcher->targets =
NULL;
22506 if (matcher->htab !=
NULL) {
22508 matcher->htab =
NULL;
22514 if (vctxt->idcMatcherCache !=
NULL)
22515 matcher->nextCached = vctxt->idcMatcherCache;
22516 vctxt->idcMatcherCache = matcher;
22537xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
22538 xmlSchemaIDCMatcherPtr matcher,
22539 xmlSchemaIDCSelectPtr sel,
22542 xmlSchemaIDCStateObjPtr sto;
22547 if (vctxt->xpathStatePool !=
NULL) {
22548 sto = vctxt->xpathStatePool;
22549 vctxt->xpathStatePool = sto->next;
22555 sto = (xmlSchemaIDCStateObjPtr)
xmlMalloc(
sizeof(xmlSchemaIDCStateObj));
22557 xmlSchemaVErrMemory(
NULL,
22558 "allocating an IDC state object",
NULL);
22561 memset(sto, 0,
sizeof(xmlSchemaIDCStateObj));
22566 if (vctxt->xpathStates !=
NULL)
22567 sto->next = vctxt->xpathStates;
22568 vctxt->xpathStates = sto;
22573 if (sto->xpathCtxt !=
NULL)
22574 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
22579 sto->xpathCtxt = (
void *) xmlPatternGetStreamCtxt(
22580 (xmlPatternPtr) sel->xpathComp);
22581 if (sto->xpathCtxt ==
NULL) {
22582 VERROR_INT(
"xmlSchemaIDCAddStateObject",
22583 "failed to create an XPath validation context");
22587 sto->depth = vctxt->depth;
22588 sto->matcher = matcher;
22590 sto->nbHistory = 0;
22610xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
22614 int res, resolved = 0,
depth = vctxt->depth;
22616 if (vctxt->xpathStates ==
NULL)
22625 "IDC: EVAL on %s, depth %d, type %d\n",
22626 xmlSchemaFormatQName(&
str, vctxt->inode->nsName,
22627 vctxt->inode->localName),
depth, nodeType);
22634 first = vctxt->xpathStates;
22636 while (sto !=
head) {
22638 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR)
22640 sto->matcher->aidc->def->name, sto->sel->xpath);
22643 sto->matcher->aidc->def->name, sto->sel->xpath);
22646 res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
22647 vctxt->inode->localName, vctxt->inode->nsName);
22649 res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
22650 vctxt->inode->localName, vctxt->inode->nsName);
22653 VERROR_INT(
"xmlSchemaXPathEvaluate",
22654 "calling xmlStreamPush()");
22669 if (sto->history ==
NULL) {
22670 sto->history = (
int *)
xmlMalloc(5 *
sizeof(
int));
22671 if (sto->history ==
NULL) {
22672 xmlSchemaVErrMemory(
NULL,
22673 "allocating the state object history",
NULL);
22676 sto->sizeHistory = 5;
22677 }
else if (sto->sizeHistory <= sto->nbHistory) {
22678 sto->sizeHistory *= 2;
22679 sto->history = (
int *)
xmlRealloc(sto->history,
22680 sto->sizeHistory *
sizeof(
int));
22681 if (sto->history ==
NULL) {
22682 xmlSchemaVErrMemory(
NULL,
22683 "re-allocating the state object history",
NULL);
22687 sto->history[sto->nbHistory++] =
depth;
22694 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22695 xmlSchemaIDCSelectPtr sel;
22702 "activating field states\n");
22704 sel = sto->matcher->aidc->def->fields;
22705 while (sel !=
NULL) {
22706 if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
22707 sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
22711 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22717 "IDC: key found\n");
22723 if (resolved == 0) {
22724 if ((vctxt->inode->flags &
22725 XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
22726 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
22731 if (sto->next ==
NULL) {
22736 sto = vctxt->xpathStates;
22744xmlSchemaFormatIDCKeySequence_1(xmlSchemaValidCtxtPtr vctxt,
22746 xmlSchemaPSVIIDCKeyPtr *seq,
22747 int count,
int for_hash)
22756 res = xmlSchemaGetCanonValueWhtspExt(seq[
i]->
val,
22757 xmlSchemaGetWhiteSpaceFacetValue(seq[
i]->
type),
22760 res = xmlSchemaGetCanonValueHash(seq[
i]->
val, &
value);
22765 VERROR_INT(
"xmlSchemaFormatIDCKeySequence",
22766 "failed to compute a canonical value");
22784xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
22786 xmlSchemaPSVIIDCKeyPtr *seq,
22789 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 0);
22793xmlSchemaHashKeySequence(xmlSchemaValidCtxtPtr vctxt,
22795 xmlSchemaPSVIIDCKeyPtr *seq,
22798 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 1);
22810xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
22812 xmlSchemaIDCStateObjPtr sto;
22815 if (vctxt->xpathStates ==
NULL)
22817 sto = vctxt->xpathStates;
22819 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22823 }
while (sto !=
NULL);
22839xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
22842 xmlSchemaIDCStateObjPtr sto, nextsto;
22843 int res, matchDepth;
22844 xmlSchemaPSVIIDCKeyPtr
key =
NULL;
22845 xmlSchemaTypePtr
type = vctxt->inode->typeDef, simpleType =
NULL;
22847 if (vctxt->xpathStates ==
NULL)
22849 sto = vctxt->xpathStates;
22855 "IDC: BACK on %s, depth %d\n",
22856 xmlSchemaFormatQName(&
str, vctxt->inode->nsName,
22857 vctxt->inode->localName), vctxt->depth);
22864 while (sto !=
NULL) {
22865 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22867 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22868 "calling xmlStreamPop()");
22875 if (sto->nbHistory == 0)
22876 goto deregister_check;
22878 matchDepth = sto->history[sto->nbHistory -1];
22883 if (matchDepth !=
depth) {
22887 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22894 if (WXS_IS_COMPLEX(
type)) {
22895 if (WXS_HAS_SIMPLE_CONTENT(
type)) {
22899 simpleType =
type->contentTypeDef;
22900 if (simpleType ==
NULL) {
22901 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22902 "field resolves to a CT with simple content "
22903 "but the CT is missing the ST definition");
22910 if (simpleType ==
NULL) {
22917 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22919 WXS_BASIC_CAST sto->matcher->aidc->def,
22920 "The XPath '%s' of a field of %s does evaluate to a node of "
22923 xmlSchemaGetIDCDesignation(&
str, sto->matcher->aidc->def));
22924 FREE_AND_NULL(
str);
22926 goto deregister_check;
22929 if ((
key ==
NULL) && (vctxt->inode->val ==
NULL)) {
22935 WXS_BASIC_CAST sto->matcher->aidc->def,
22936 "Warning: No precomputed value available, the value "
22937 "was either invalid or something strange happened");
22939 goto deregister_check;
22941 xmlSchemaIDCMatcherPtr matcher = sto->matcher;
22942 xmlSchemaPSVIIDCKeyPtr *keySeq;
22963 pos = sto->depth - matcher->depth;
22964 idx = sto->sel->index;
22969 if (matcher->keySeqs ==
NULL) {
22971 matcher->sizeKeySeqs =
pos * 2;
22973 matcher->sizeKeySeqs = 10;
22974 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22976 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22977 if (matcher->keySeqs ==
NULL) {
22978 xmlSchemaVErrMemory(
NULL,
22979 "allocating an array of key-sequences",
22983 memset(matcher->keySeqs, 0,
22984 matcher->sizeKeySeqs *
22985 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22986 }
else if (
pos >= matcher->sizeKeySeqs) {
22987 int i = matcher->sizeKeySeqs;
22989 matcher->sizeKeySeqs *= 2;
22990 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22992 matcher->sizeKeySeqs *
22993 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22994 if (matcher->keySeqs ==
NULL) {
22995 xmlSchemaVErrMemory(
NULL,
22996 "reallocating an array of key-sequences",
23004 for (;
i < matcher->sizeKeySeqs;
i++)
23005 matcher->keySeqs[
i] =
NULL;
23011 keySeq = matcher->keySeqs[
pos];
23012 if (keySeq ==
NULL) {
23013 goto create_sequence;
23014 }
else if (keySeq[
idx] !=
NULL) {
23026 xmlSchemaCustomErr(ACTXT_CAST vctxt,
23028 WXS_BASIC_CAST matcher->aidc->def,
23029 "The XPath '%s' of a field of %s evaluates to a "
23030 "node-set with more than one member",
23032 xmlSchemaGetIDCDesignation(&
str, matcher->aidc->def));
23033 FREE_AND_NULL(
str);
23035 goto deregister_check;
23043 keySeq = (xmlSchemaPSVIIDCKeyPtr *)
xmlMalloc(
23044 matcher->aidc->def->nbFields *
23045 sizeof(xmlSchemaPSVIIDCKeyPtr));
23046 if (keySeq ==
NULL) {
23047 xmlSchemaVErrMemory(
NULL,
23048 "allocating an IDC key-sequence",
NULL);
23051 memset(keySeq, 0, matcher->aidc->def->nbFields *
23052 sizeof(xmlSchemaPSVIIDCKeyPtr));
23053 matcher->keySeqs[
pos] = keySeq;
23060 sizeof(xmlSchemaPSVIIDCKey));
23062 xmlSchemaVErrMemory(
NULL,
23063 "allocating a IDC key",
NULL);
23065 matcher->keySeqs[
pos] =
NULL;
23071 key->type = simpleType;
23072 key->val = vctxt->inode->val;
23073 vctxt->inode->val =
NULL;
23077 if (xmlSchemaIDCStoreKey(vctxt,
key) == -1) {
23078 xmlSchemaIDCFreeKey(
key);
23084 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
23086 xmlSchemaPSVIIDCKeyPtr **keySeq =
NULL;
23088 xmlSchemaPSVIIDCNodePtr ntItem;
23089 xmlSchemaIDCMatcherPtr matcher;
23090 xmlSchemaIDCPtr idc;
23091 xmlSchemaItemListPtr targets;
23092 int pos,
i,
j, nbKeys;
23104 matcher = sto->matcher;
23105 idc = matcher->aidc->def;
23106 nbKeys = idc->nbFields;
23112 if ((matcher->keySeqs ==
NULL) ||
23113 (matcher->sizeKeySeqs <=
pos)) {
23114 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
23115 goto selector_key_error;
23117 goto selector_leave;
23120 keySeq = &(matcher->keySeqs[
pos]);
23121 if (*keySeq ==
NULL) {
23122 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
23123 goto selector_key_error;
23125 goto selector_leave;
23128 for (
i = 0;
i < nbKeys;
i++) {
23129 if ((*keySeq)[
i] ==
NULL) {
23133 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
23137 goto selector_key_error;
23139 goto selector_leave;
23156 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23158 targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
23159 if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
23160 (targets->nbItems != 0)) {
23161 xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
23162 xmlIDCHashEntryPtr
e;
23166 if (!matcher->htab)
23170 xmlSchemaHashKeySequence(vctxt, &
value, *keySeq, nbKeys);
23172 FREE_AND_NULL(
value);
23180 ((xmlSchemaPSVIIDCNodePtr) targets->items[
e->index])->keys;
23181 for (
j = 0;
j < nbKeys;
j++) {
23182 ckey = (*keySeq)[
j];
23184 res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
23187 }
else if (
res == 0) {
23207 xmlSchemaCustomErr(ACTXT_CAST vctxt,
23209 WXS_BASIC_CAST idc,
23210 "Duplicate key-sequence %s in %s",
23211 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
23212 (*keySeq), nbKeys),
23213 xmlSchemaGetIDCDesignation(&strB, idc));
23214 FREE_AND_NULL(
str);
23215 FREE_AND_NULL(strB);
23216 goto selector_leave;
23222 ntItem = (xmlSchemaPSVIIDCNodePtr)
xmlMalloc(
23223 sizeof(xmlSchemaPSVIIDCNode));
23224 if (ntItem ==
NULL) {
23225 xmlSchemaVErrMemory(
NULL,
23226 "allocating an IDC node-table item",
NULL);
23231 memset(ntItem, 0,
sizeof(xmlSchemaPSVIIDCNode));
23236 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23237 if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
23243 ntItem->nodeQNameID = -1;
23249 ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
23250 vctxt->inode->localName, vctxt->inode->nsName);
23251 if (ntItem->nodeQNameID == -1) {
23262 ntItem->node = vctxt->node;
23263 ntItem->nodeLine = vctxt->inode->nodeLine;
23264 ntItem->keys = *keySeq;
23267 if (xmlSchemaIDCAppendNodeTableItem(
bind, ntItem) == -1)
23269 if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
23270 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23280 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23282 xmlIDCHashEntryPtr
r,
e;
23283 if (!matcher->htab)
23285 xmlSchemaHashKeySequence(vctxt, &
value, ntItem->keys, nbKeys);
23287 e->index = targets->nbItems - 1;
23296 FREE_AND_NULL(
value);
23299 goto selector_leave;
23309 xmlSchemaCustomErr(ACTXT_CAST vctxt,
23311 WXS_BASIC_CAST idc,
23312 "Not all fields of %s evaluate to a node",
23313 xmlSchemaGetIDCDesignation(&
str, idc),
NULL);
23314 FREE_AND_NULL(
str);
23320 if ((keySeq !=
NULL) && (*keySeq !=
NULL)) {
23332 if ((sto->nbHistory == 0) && (sto->depth ==
depth)) {
23337 if (vctxt->xpathStates != sto) {
23338 VERROR_INT(
"xmlSchemaXPathProcessHistory",
23339 "The state object to be removed is not the first "
23342 nextsto = sto->next;
23346 vctxt->xpathStates = sto->next;
23347 sto->next = vctxt->xpathStatePool;
23351 vctxt->xpathStatePool = sto;
23370xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
23371 xmlSchemaElementPtr elemDecl)
23373 xmlSchemaIDCMatcherPtr matcher,
last =
NULL;
23374 xmlSchemaIDCPtr idc, refIdc;
23375 xmlSchemaIDCAugPtr aidc;
23377 idc = (xmlSchemaIDCPtr) elemDecl->idcs;
23385 "IDC: REGISTER on %s, depth %d\n",
23386 (
char *) xmlSchemaFormatQName(&
str, vctxt->inode->nsName,
23387 vctxt->inode->localName), vctxt->depth);
23391 if (vctxt->inode->idcMatchers !=
NULL) {
23392 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23393 "The chain of IDC matchers is expected to be empty");
23397 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23405 refIdc = (xmlSchemaIDCPtr) idc->ref->item;
23410 vctxt->inode->hasKeyrefs = 1;
23414 aidc = vctxt->aidcs;
23415 while (aidc !=
NULL) {
23416 if (aidc->def == refIdc)
23420 if (aidc ==
NULL) {
23421 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23422 "Could not find an augmented IDC item for an IDC "
23426 if ((aidc->keyrefDepth == -1) ||
23427 (vctxt->depth < aidc->keyrefDepth))
23428 aidc->keyrefDepth = vctxt->depth;
23434 aidc = vctxt->aidcs;
23435 while (aidc !=
NULL) {
23436 if (aidc->def == idc)
23440 if (aidc ==
NULL) {
23441 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23442 "Could not find an augmented IDC item for an IDC definition");
23448 if (vctxt->idcMatcherCache !=
NULL) {
23452 matcher = vctxt->idcMatcherCache;
23453 vctxt->idcMatcherCache = matcher->nextCached;
23454 matcher->nextCached =
NULL;
23456 matcher = (xmlSchemaIDCMatcherPtr)
23457 xmlMalloc(
sizeof(xmlSchemaIDCMatcher));
23458 if (matcher ==
NULL) {
23459 xmlSchemaVErrMemory(vctxt,
23460 "allocating an IDC matcher",
NULL);
23463 memset(matcher, 0,
sizeof(xmlSchemaIDCMatcher));
23466 vctxt->inode->idcMatchers = matcher;
23468 last->next = matcher;
23471 matcher->type = IDC_MATCHER;
23472 matcher->depth = vctxt->depth;
23473 matcher->aidc = aidc;
23474 matcher->idcType = aidc->def->type;
23481 if (xmlSchemaIDCAddStateObject(vctxt, matcher,
23482 idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
23486 }
while (idc !=
NULL);
23491xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
23492 xmlSchemaNodeInfoPtr ielem)
23494 xmlSchemaPSVIIDCBindingPtr
bind;
23495 int res,
i,
j,
k, nbTargets, nbFields, nbDupls, nbNodeTable;
23496 xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys;
23497 xmlSchemaPSVIIDCNodePtr *targets, *dupls;
23499 xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
23501 while (matcher !=
NULL) {
23505 if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
23506 WXS_ILIST_IS_EMPTY(matcher->targets))
23508 matcher = matcher->next;
23515 if ((! vctxt->createIDCNodeTables) &&
23516 ((matcher->aidc->keyrefDepth == -1) ||
23517 (matcher->aidc->keyrefDepth > vctxt->depth)))
23519 matcher = matcher->next;
23525 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23527 goto internal_error;
23529 if (! WXS_ILIST_IS_EMPTY(
bind->dupls)) {
23530 dupls = (xmlSchemaPSVIIDCNodePtr *)
bind->dupls->items;
23531 nbDupls =
bind->dupls->nbItems;
23537 nbNodeTable =
bind->nbNodes;
23542 if ((nbNodeTable == 0) && (nbDupls == 0)) {
23547 (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23548 bind->sizeNodes = matcher->targets->sizeItems;
23549 bind->nbNodes = matcher->targets->nbItems;
23551 matcher->targets->items =
NULL;
23552 matcher->targets->sizeItems = 0;
23553 matcher->targets->nbItems = 0;
23554 if (matcher->htab) {
23556 matcher->htab =
NULL;
23562 nbTargets = matcher->targets->nbItems;
23563 targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23564 nbFields = matcher->aidc->def->nbFields;
23567 keys = targets[
i]->keys;
23574 if (nbFields == 1) {
23575 res = xmlSchemaAreValuesEqual(keys[0]->
val,
23576 dupls[
j]->keys[0]->
val);
23578 goto internal_error;
23587 ntkeys = dupls[
j]->keys;
23588 for (
k = 0;
k < nbFields;
k++) {
23589 res = xmlSchemaAreValuesEqual(keys[
k]->
val,
23592 goto internal_error;
23608 }
while (
j < nbDupls);
23613 if (nbFields == 1) {
23614 res = xmlSchemaAreValuesEqual(keys[0]->
val,
23615 bind->nodeTable[
j]->keys[0]->val);
23617 goto internal_error;
23622 goto next_node_table_entry;
23626 ntkeys =
bind->nodeTable[
j]->keys;
23627 for (
k = 0;
k < nbFields;
k++) {
23628 res = xmlSchemaAreValuesEqual(keys[
k]->
val,
23631 goto internal_error;
23636 goto next_node_table_entry;
23644 bind->dupls = xmlSchemaItemListCreate();
23646 goto internal_error;
23648 if (xmlSchemaItemListAdd(
bind->dupls,
bind->nodeTable[
j]) == -1)
23649 goto internal_error;
23658next_node_table_entry:
23660 }
while (
j < nbNodeTable);
23666 if (xmlSchemaIDCAppendNodeTableItem(
bind, targets[
i]) == -1)
23667 goto internal_error;
23671 }
while (
i < nbTargets);
23673 matcher = matcher->next;
23693xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
23695 xmlSchemaPSVIIDCBindingPtr
bind;
23696 xmlSchemaPSVIIDCBindingPtr *parTable, parBind =
NULL;
23697 xmlSchemaPSVIIDCNodePtr
node, parNode =
NULL, *dupls, *parNodes;
23698 xmlSchemaIDCAugPtr aidc;
23699 int i,
j,
k,
ret = 0, nbFields, oldNum, oldDupls;
23701 bind = vctxt->inode->idcTable;
23707 parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
23714 if ((
bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(
bind->dupls))
23719 if (! vctxt->createIDCNodeTables) {
23720 aidc = vctxt->aidcs;
23722 if (aidc->def ==
bind->definition) {
23723 if ((aidc->keyrefDepth == -1) ||
23724 (aidc->keyrefDepth >= vctxt->depth)) {
23730 }
while (aidc !=
NULL);
23733 if (parTable !=
NULL)
23734 parBind = *parTable;
23739 while (parBind !=
NULL) {
23740 if (parBind->definition ==
bind->definition)
23742 parBind = parBind->next;
23745 if (parBind !=
NULL) {
23750 oldNum = parBind->nbNodes;
23752 if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
23753 oldDupls = parBind->dupls->nbItems;
23754 dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
23760 parNodes = parBind->nodeTable;
23761 nbFields =
bind->definition->nbFields;
23763 for (
i = 0;
i <
bind->nbNodes;
i++) {
23773 while (
j < oldDupls) {
23774 if (nbFields == 1) {
23775 ret = xmlSchemaAreValuesEqual(
23776 node->keys[0]->val,
23777 dupls[
j]->keys[0]->val);
23779 goto internal_error;
23785 parNode = dupls[
j];
23786 for (
k = 0;
k < nbFields;
k++) {
23787 ret = xmlSchemaAreValuesEqual(
23788 node->keys[
k]->val,
23789 parNode->keys[
k]->val);
23791 goto internal_error;
23801 if (
j != oldDupls) {
23811 while (
j < oldNum) {
23812 parNode = parNodes[
j];
23813 if (nbFields == 1) {
23814 ret = xmlSchemaAreValuesEqual(
23815 node->keys[0]->val,
23816 parNode->keys[0]->val);
23818 goto internal_error;
23824 for (
k = 0;
k < nbFields;
k++) {
23825 ret = xmlSchemaAreValuesEqual(
23826 node->keys[
k]->val,
23827 parNode->keys[
k]->val);
23829 goto internal_error;
23846 parBind->nbNodes--;
23850 parNodes[
j] = parNodes[oldNum];
23852 if (parBind->nbNodes != oldNum) {
23858 parNodes[parBind->nbNodes];
23860 if (parBind->dupls ==
NULL) {
23861 parBind->dupls = xmlSchemaItemListCreate();
23862 if (parBind->dupls ==
NULL)
23863 goto internal_error;
23865 xmlSchemaItemListAdd(parBind->dupls, parNode);
23871 if (parBind->nodeTable ==
NULL) {
23872 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23873 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
23874 if (parBind->nodeTable ==
NULL) {
23875 xmlSchemaVErrMemory(
NULL,
23876 "allocating IDC list of node-table items",
NULL);
23877 goto internal_error;
23879 parBind->sizeNodes = 1;
23880 }
else if (parBind->nbNodes >= parBind->sizeNodes) {
23881 parBind->sizeNodes *= 2;
23882 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23883 xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
23884 sizeof(xmlSchemaPSVIIDCNodePtr));
23885 if (parBind->nodeTable ==
NULL) {
23886 xmlSchemaVErrMemory(
NULL,
23887 "re-allocating IDC list of node-table items",
NULL);
23888 goto internal_error;
23891 parNodes = parBind->nodeTable;
23896 parNodes[parBind->nbNodes++] =
node;
23907 parBind = xmlSchemaIDCNewBinding(
bind->definition);
23908 if (parBind ==
NULL)
23909 goto internal_error;
23915 if (
bind->nbNodes != 0) {
23919 if (! vctxt->psviExposeIDCNodeTables) {
23926 parBind->nodeTable =
bind->nodeTable;
23928 parBind->sizeNodes =
bind->sizeNodes;
23929 bind->sizeNodes = 0;
23930 parBind->nbNodes =
bind->nbNodes;
23936 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23938 sizeof(xmlSchemaPSVIIDCNodePtr));
23939 if (parBind->nodeTable ==
NULL) {
23940 xmlSchemaVErrMemory(
NULL,
23941 "allocating an array of IDC node-table "
23943 xmlSchemaIDCFreeBinding(parBind);
23944 goto internal_error;
23946 parBind->sizeNodes =
bind->nbNodes;
23947 parBind->nbNodes =
bind->nbNodes;
23949 bind->nbNodes *
sizeof(xmlSchemaPSVIIDCNodePtr));
23956 if (parBind->dupls !=
NULL)
23957 xmlSchemaItemListFree(parBind->dupls);
23958 parBind->dupls =
bind->dupls;
23961 if (parTable !=
NULL) {
23962 if (*parTable ==
NULL)
23963 *parTable = parBind;
23965 parBind->
next = *parTable;
23966 *parTable = parBind;
23988xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
23990 xmlSchemaIDCMatcherPtr matcher;
23991 xmlSchemaPSVIIDCBindingPtr
bind;
23993 matcher = vctxt->inode->idcMatchers;
23997 while (matcher !=
NULL) {
23998 if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
23999 matcher->targets &&
24000 matcher->targets->nbItems)
24002 int i,
j,
k,
res, nbFields, hasDupls;
24003 xmlSchemaPSVIIDCKeyPtr *refKeys, *keys;
24004 xmlSchemaPSVIIDCNodePtr refNode =
NULL;
24007 nbFields = matcher->aidc->def->nbFields;
24012 bind = vctxt->inode->idcTable;
24014 if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
24019 hasDupls = (
bind &&
bind->dupls &&
bind->dupls->nbItems) ? 1 : 0;
24025 for (
j = 0;
j <
bind->nbNodes;
j++) {
24027 xmlIDCHashEntryPtr
r,
e;
24028 keys =
bind->nodeTable[
j]->keys;
24029 xmlSchemaHashKeySequence(vctxt, &
value, keys, nbFields);
24040 FREE_AND_NULL(
value);
24043 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
24045 refNode = matcher->targets->items[
i];
24048 xmlIDCHashEntryPtr
e;
24049 refKeys = refNode->keys;
24050 xmlSchemaHashKeySequence(vctxt, &
value, refKeys, nbFields);
24052 FREE_AND_NULL(
value);
24055 keys =
bind->nodeTable[
e->index]->keys;
24056 for (
k = 0;
k < nbFields;
k++) {
24057 res = xmlSchemaAreValuesEqual(keys[
k]->
val,
24061 else if (
res == -1) {
24072 if ((
res == 0) && hasDupls) {
24076 for (
j = 0;
j <
bind->dupls->nbItems;
j++) {
24077 keys = ((xmlSchemaPSVIIDCNodePtr)
24078 bind->dupls->items[
j])->keys;
24079 for (
k = 0;
k < nbFields;
k++) {
24080 res = xmlSchemaAreValuesEqual(keys[
k]->
val,
24084 else if (
res == -1) {
24093 xmlSchemaKeyrefErr(vctxt,
24095 (xmlSchemaTypePtr) matcher->aidc->def,
24096 "More than one match found for "
24097 "key-sequence %s of keyref '%s'",
24098 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
24099 refNode->keys, nbFields),
24100 xmlSchemaGetComponentQName(&strB,
24101 matcher->aidc->def));
24102 FREE_AND_NULL(
str);
24103 FREE_AND_NULL(strB);
24112 xmlSchemaKeyrefErr(vctxt,
24114 (xmlSchemaTypePtr) matcher->aidc->def,
24115 "No match found for key-sequence %s of keyref '%s'",
24116 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
24117 refNode->keys, nbFields),
24118 xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
24119 FREE_AND_NULL(
str);
24120 FREE_AND_NULL(strB);
24127 matcher = matcher->next;
24139static xmlSchemaAttrInfoPtr
24140xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
24142 xmlSchemaAttrInfoPtr iattr;
24146 if (vctxt->attrInfos ==
NULL) {
24147 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
24148 xmlMalloc(
sizeof(xmlSchemaAttrInfoPtr));
24149 vctxt->sizeAttrInfos = 1;
24150 if (vctxt->attrInfos ==
NULL) {
24151 xmlSchemaVErrMemory(vctxt,
24152 "allocating attribute info list",
NULL);
24155 }
else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
24156 vctxt->sizeAttrInfos++;
24157 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
24159 vctxt->sizeAttrInfos *
sizeof(xmlSchemaAttrInfoPtr));
24160 if (vctxt->attrInfos ==
NULL) {
24161 xmlSchemaVErrMemory(vctxt,
24162 "re-allocating attribute info list",
NULL);
24166 iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
24167 if (iattr->localName !=
NULL) {
24168 VERROR_INT(
"xmlSchemaGetFreshAttrInfo",
24169 "attr info not cleared");
24178 iattr = (xmlSchemaAttrInfoPtr)
24180 if (iattr ==
NULL) {
24181 xmlSchemaVErrMemory(vctxt,
"creating new attribute info",
NULL);
24184 memset(iattr, 0,
sizeof(xmlSchemaAttrInfo));
24186 vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
24192xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
24201 xmlSchemaAttrInfoPtr
attr;
24203 attr = xmlSchemaGetFreshAttrInfo(vctxt);
24205 VERROR_INT(
"xmlSchemaPushAttribute",
24206 "calling xmlSchemaGetFreshAttrInfo()");
24209 attr->node = attrNode;
24210 attr->nodeLine = nodeLine;
24211 attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
24212 attr->localName = localName;
24213 attr->nsName = nsName;
24215 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
24219 if (nsName !=
NULL) {
24222 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
24226 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
24230 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
24234 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
24237 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
24242 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
24243 if (
attr->metaType != 0)
24244 attr->state = XML_SCHEMAS_ATTR_META;
24254xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
24255 xmlSchemaNodeInfoPtr ielem)
24257 ielem->hasKeyrefs = 0;
24258 ielem->appliedXPath = 0;
24259 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
24260 FREE_AND_NULL(ielem->localName);
24261 FREE_AND_NULL(ielem->nsName);
24263 ielem->localName =
NULL;
24264 ielem->nsName =
NULL;
24266 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
24267 FREE_AND_NULL(ielem->value);
24269 ielem->value =
NULL;
24271 if (ielem->val !=
NULL) {
24276 xmlSchemaFreeValue(ielem->val);
24279 if (ielem->idcMatchers !=
NULL) {
24284 xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
24286 xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
24288 ielem->idcMatchers =
NULL;
24290 if (ielem->idcTable !=
NULL) {
24294 xmlSchemaIDCFreeIDCTable(ielem->idcTable);
24295 ielem->idcTable =
NULL;
24297 if (ielem->regexCtxt !=
NULL) {
24298 xmlRegFreeExecCtxt(ielem->regexCtxt);
24299 ielem->regexCtxt =
NULL;
24301 if (ielem->nsBindings !=
NULL) {
24303 ielem->nsBindings =
NULL;
24304 ielem->nbNsBindings = 0;
24305 ielem->sizeNsBindings = 0;
24318static xmlSchemaNodeInfoPtr
24319xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
24323 if (vctxt->depth > vctxt->sizeElemInfos) {
24324 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24325 "inconsistent depth encountered");
24328 if (vctxt->elemInfos ==
NULL) {
24329 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24330 xmlMalloc(10 *
sizeof(xmlSchemaNodeInfoPtr));
24331 if (vctxt->elemInfos ==
NULL) {
24332 xmlSchemaVErrMemory(vctxt,
24333 "allocating the element info array",
NULL);
24336 memset(vctxt->elemInfos, 0, 10 *
sizeof(xmlSchemaNodeInfoPtr));
24337 vctxt->sizeElemInfos = 10;
24338 }
else if (vctxt->sizeElemInfos <= vctxt->depth) {
24339 int i = vctxt->sizeElemInfos;
24341 vctxt->sizeElemInfos *= 2;
24342 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24343 xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
24344 sizeof(xmlSchemaNodeInfoPtr));
24345 if (vctxt->elemInfos ==
NULL) {
24346 xmlSchemaVErrMemory(vctxt,
24347 "re-allocating the element info array",
NULL);
24354 for (;
i < vctxt->sizeElemInfos;
i++)
24355 vctxt->elemInfos[
i] =
NULL;
24357 info = vctxt->elemInfos[vctxt->depth];
24360 info = (xmlSchemaNodeInfoPtr)
24363 xmlSchemaVErrMemory(vctxt,
24364 "allocating an element info",
NULL);
24367 vctxt->elemInfos[vctxt->depth] =
info;
24370 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24371 "elem info has not been cleared");
24377 info->depth = vctxt->depth;
24382#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
24383#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
24384#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
24387xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
24389 xmlSchemaTypePtr
type,
24390 xmlSchemaValType valType,
24392 xmlSchemaValPtr
val,
24398 xmlSchemaTypePtr tmpType;
24399 xmlSchemaFacetLinkPtr facetLink;
24400 xmlSchemaFacetPtr facet;
24401 unsigned long len = 0;
24402 xmlSchemaWhitespaceValueType
ws;
24407 if (
type->type == XML_SCHEMA_TYPE_BASIC)
24416 goto pattern_and_enum;
24418 if (! WXS_IS_ATOMIC(
type)) {
24419 if (WXS_IS_LIST(
type))
24422 goto pattern_and_enum;
24429 tmpType = xmlSchemaGetPrimitiveType(
type);
24430 if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
24431 WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
24432 ws = xmlSchemaGetWhiteSpaceFacetValue(
type);
24434 ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
24442 valType = xmlSchemaGetValType(
val);
24445 for (facetLink =
type->facetSet; facetLink !=
NULL;
24446 facetLink = facetLink->
next) {
24451 switch (facetLink->facet->type) {
24452 case XML_SCHEMA_FACET_WHITESPACE:
24453 case XML_SCHEMA_FACET_PATTERN:
24454 case XML_SCHEMA_FACET_ENUMERATION:
24456 case XML_SCHEMA_FACET_LENGTH:
24457 case XML_SCHEMA_FACET_MINLENGTH:
24458 case XML_SCHEMA_FACET_MAXLENGTH:
24459 ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
24463 ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
24468 AERROR_INT(
"xmlSchemaValidateFacets",
24469 "validating against a atomic type facet");
24471 }
else if (
ret > 0) {
24473 xmlSchemaFacetErr(actxt,
ret,
node,
24484 if (! WXS_IS_LIST(
type))
24485 goto pattern_and_enum;
24490 for (facetLink =
type->facetSet; facetLink !=
NULL;
24491 facetLink = facetLink->
next) {
24493 switch (facetLink->facet->type) {
24494 case XML_SCHEMA_FACET_LENGTH:
24495 case XML_SCHEMA_FACET_MINLENGTH:
24496 case XML_SCHEMA_FACET_MAXLENGTH:
24497 ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
24504 AERROR_INT(
"xmlSchemaValidateFacets",
24505 "validating against a list type facet");
24507 }
else if (
ret > 0) {
24509 xmlSchemaFacetErr(actxt,
ret,
node,
24531 for (facet = tmpType->facets; facet !=
NULL; facet = facet->
next) {
24532 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
24535 ret = xmlSchemaAreValuesEqual(facet->val,
val);
24538 else if (
ret < 0) {
24539 AERROR_INT(
"xmlSchemaValidateFacets",
24540 "validating against an enumeration facet");
24554 tmpType = tmpType->baseType;
24555 }
while ((tmpType !=
NULL) &&
24556 (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24557 if (found && (
ret == 0)) {
24560 xmlSchemaFacetErr(actxt,
ret,
node,
24576 for (facetLink = tmpType->facetSet; facetLink !=
NULL;
24577 facetLink = facetLink->
next) {
24578 if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
24585 ret = xmlRegexpExec(facetLink->facet->regexp,
value);
24588 else if (
ret < 0) {
24589 AERROR_INT(
"xmlSchemaValidateFacets",
24590 "validating against a pattern facet");
24596 facet = facetLink->facet;
24599 if (found && (
ret != 1)) {
24602 xmlSchemaFacetErr(actxt,
ret,
node,
24610 tmpType = tmpType->baseType;
24611 }
while ((tmpType !=
NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24617xmlSchemaNormalizeValue(xmlSchemaTypePtr
type,
24620 switch (xmlSchemaGetWhiteSpaceFacetValue(
type)) {
24621 case XML_SCHEMA_WHITESPACE_COLLAPSE:
24622 return (xmlSchemaCollapseString(
value));
24623 case XML_SCHEMA_WHITESPACE_REPLACE:
24624 return (xmlSchemaWhiteSpaceReplace(
value));
24631xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
24633 xmlSchemaValPtr *
val,
24644 VERROR_INT(
"xmlSchemaValidateQName",
24645 "calling xmlValidateQName()");
24655 stripped = xmlSchemaCollapseString(
value);
24665 nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
24673 if (nsName ==
NULL) {
24675 xmlSchemaCustomErr(ACTXT_CAST vctxt,
ret,
NULL,
24676 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24677 "The QName value '%s' has no "
24678 "corresponding namespace declaration in "
24685 if (valNeeded &&
val) {
24686 if (nsName !=
NULL)
24687 *
val = xmlSchemaNewQNameValue(
24690 *
val = xmlSchemaNewQNameValue(
NULL,
24701xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
24703 xmlSchemaTypePtr
type,
24705 xmlSchemaValPtr *retVal,
24710 int ret = 0, valNeeded = (retVal) ? 1 : 0;
24715#define NORMALIZE(atype) \
24716 if ((! isNormalized) && \
24717 (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
24718 normValue = xmlSchemaNormalizeValue(atype, value); \
24719 if (normValue != NULL) \
24720 value = normValue; \
24721 isNormalized = 1; \
24724 if ((retVal !=
NULL) && (*retVal !=
NULL)) {
24725 xmlSchemaFreeValue(*retVal);
24750 if ((! valNeeded) && (
type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
24754 if (WXS_IS_ANY_SIMPLE_TYPE(
type) || WXS_IS_ATOMIC(
type)) {
24755 xmlSchemaTypePtr biType;
24764 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
24768 biType =
type->baseType;
24769 while ((biType !=
NULL) &&
24770 (biType->type != XML_SCHEMA_TYPE_BASIC))
24771 biType = biType->baseType;
24773 if (biType ==
NULL) {
24774 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24775 "could not get the built-in type");
24776 goto internal_error;
24784 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
24785 switch (biType->builtInType) {
24786 case XML_SCHEMAS_NOTATION:
24787 ret = xmlSchemaValidateNotation(
24788 (xmlSchemaValidCtxtPtr) actxt,
24789 ((xmlSchemaValidCtxtPtr) actxt)->
schema,
24792 case XML_SCHEMAS_QNAME:
24793 ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
24799 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24802 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24806 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
24807 switch (biType->builtInType) {
24808 case XML_SCHEMAS_NOTATION:
24809 ret = xmlSchemaValidateNotation(
NULL,
24810 ((xmlSchemaParserCtxtPtr) actxt)->
schema,
node,
24816 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24819 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24828 goto internal_error;
24832 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24833 "validating against a built-in type");
24834 goto internal_error;
24836 if (WXS_IS_LIST(
type))
24841 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24846 (xmlSchemaValType) biType->builtInType,
value,
val,
24850 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24851 "validating facets of atomic simple type");
24852 goto internal_error;
24854 if (WXS_IS_LIST(
type))
24860 else if (fireErrors && (
ret > 0))
24862 }
else if (WXS_IS_LIST(
type)) {
24864 xmlSchemaTypePtr itemType;
24867 unsigned long len = 0;
24868 xmlSchemaValPtr prevVal =
NULL, curVal =
NULL;
24882 itemType = WXS_LIST_ITEMTYPE(
type);
24896 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24897 tmpValue, &curVal, fireErrors, 0, 1);
24899 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24900 tmpValue,
NULL, fireErrors, 0, 1);
24901 FREE_AND_NULL(tmpValue);
24902 if (curVal !=
NULL) {
24909 xmlSchemaValueAppend(prevVal, curVal);
24915 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24916 "validating an item of list simple type");
24917 goto internal_error;
24923 }
while (*
cur != 0);
24924 FREE_AND_NULL(tmpValue);
24925 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24934 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24935 "validating facets of list simple type");
24936 goto internal_error;
24941 if (fireErrors && (
ret > 0)) {
24949 }
else if (WXS_IS_UNION(
type)) {
24950 xmlSchemaTypeLinkPtr memberLink;
24967 memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
type);
24968 if (memberLink ==
NULL) {
24969 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24970 "union simple type has no member types");
24971 goto internal_error;
24979 while (memberLink !=
NULL) {
24981 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24982 memberLink->type,
value, &
val, 0, 1, 0);
24984 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24985 memberLink->type,
value,
NULL, 0, 1, 0);
24988 memberLink = memberLink->next;
24992 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24993 "validating members of union simple type");
24994 goto internal_error;
25001 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
25013 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
25014 "validating facets of union simple type");
25015 goto internal_error;
25020 if (fireErrors && (
ret > 0))
25024 if (normValue !=
NULL)
25027 if (retVal !=
NULL)
25030 xmlSchemaFreeValue(
val);
25032 xmlSchemaFreeValue(
val);
25035 if (normValue !=
NULL)
25038 xmlSchemaFreeValue(
val);
25043xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
25050 if ((nsName ==
NULL) || (localName ==
NULL))
25059 xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
25061 value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
25080 *nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
25087 if (*nsName ==
NULL) {
25088 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25090 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
25091 "The QName value '%s' has no "
25092 "corresponding namespace declaration in scope",
25102xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
25103 xmlSchemaAttrInfoPtr iattr,
25104 xmlSchemaTypePtr *localType,
25105 xmlSchemaElementPtr elemDecl)
25115 if (localType ==
NULL)
25126 ACTIVATE_ATTRIBUTE(iattr);
25131 ret = xmlSchemaVExpandQName(vctxt, iattr->value,
25135 VERROR_INT(
"xmlSchemaValidateElementByDeclaration",
25136 "calling xmlSchemaQNameExpand() to validate the "
25137 "attribute 'xsi:type'");
25138 goto internal_error;
25146 *localType = xmlSchemaGetType(vctxt->schema,
local, nsName);
25147 if (*localType ==
NULL) {
25150 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25152 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
25153 "The QName value '%s' of the xsi:type attribute does not "
25154 "resolve to a type definition",
25156 FREE_AND_NULL(
str);
25160 if (elemDecl !=
NULL) {
25183 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
25184 (elemDecl->subtypes->flags &
25185 XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
25186 set |= SUBSET_EXTENSION;
25188 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
25189 (elemDecl->subtypes->flags &
25190 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
25191 set |= SUBSET_RESTRICTION;
25204 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
25205 elemDecl->subtypes,
set) != 0) {
25208 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25210 "The type definition '%s', specified by xsi:type, is "
25211 "blocked or not validly derived from the type definition "
25212 "of the element declaration",
25213 xmlSchemaFormatQName(&
str,
25214 (*localType)->targetNamespace,
25215 (*localType)->name),
25217 FREE_AND_NULL(
str);
25232xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
25234 xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
25235 xmlSchemaTypePtr actualType;
25240 if (elemDecl ==
NULL) {
25242 "No matching declaration available");
25243 return (vctxt->err);
25245 actualType = WXS_ELEM_TYPEDEF(elemDecl);
25249 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
25251 "The element declaration is abstract");
25252 return (vctxt->err);
25254 if (actualType ==
NULL) {
25256 "The type definition is absent");
25259 if (vctxt->nbAttrInfos != 0) {
25261 xmlSchemaAttrInfoPtr iattr;
25266 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25267 XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
25269 ACTIVATE_ATTRIBUTE(iattr);
25273 ret = xmlSchemaVCheckCVCSimpleType(
25274 ACTXT_CAST vctxt,
NULL,
25275 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
25276 iattr->
value, &(iattr->val), 1, 0, 0);
25279 VERROR_INT(
"xmlSchemaValidateElemDecl",
25280 "calling xmlSchemaVCheckCVCSimpleType() to "
25281 "validate the attribute 'xsi:nil'");
25285 if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
25290 "The element is not 'nillable'");
25293 if (xmlSchemaValueGetAsBoolean(iattr->val)) {
25297 if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
25298 (elemDecl->value !=
NULL)) {
25300 "The element cannot be 'nilled' because "
25301 "there is a fixed value constraint defined "
25305 vctxt->inode->flags |=
25306 XML_SCHEMA_ELEM_INFO_NILLED;
25315 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25316 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25318 xmlSchemaTypePtr localType =
NULL;
25320 ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
25324 VERROR_INT(
"xmlSchemaValidateElemDecl",
25325 "calling xmlSchemaProcessXSIType() to "
25326 "process the attribute 'xsi:type'");
25331 if (localType !=
NULL) {
25332 vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
25333 actualType = localType;
25340 if ((elemDecl->idcs !=
NULL) &&
25341 (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
25346 if (actualType ==
NULL) {
25348 "The type definition is absent");
25354 vctxt->inode->typeDef = actualType;
25360xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
25362 xmlSchemaAttrInfoPtr iattr;
25372 if (vctxt->nbAttrInfos == 0)
25374 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25375 iattr = vctxt->attrInfos[
i];
25376 if (! iattr->metaType) {
25377 ACTIVATE_ATTRIBUTE(iattr)
25378 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25391xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
25394 xmlSchemaAttrInfoPtr
attr;
25396 if (vctxt->nbAttrInfos == 0)
25398 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25399 attr = vctxt->attrInfos[
i];
25400 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
25406 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
25411 xmlSchemaFreeValue(
attr->val);
25416 vctxt->nbAttrInfos = 0;
25430xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
25432 xmlSchemaTypePtr
type = vctxt->inode->typeDef;
25433 xmlSchemaItemListPtr attrUseList;
25434 xmlSchemaAttributeUsePtr attrUse =
NULL;
25435 xmlSchemaAttributePtr attrDecl =
NULL;
25436 xmlSchemaAttrInfoPtr iattr, tmpiattr;
25437 int i,
j, found, nbAttrs, nbUses;
25438 int xpathRes = 0,
res, wildIDs = 0,
fixed;
25460 attrUseList = (xmlSchemaItemListPtr)
type->attrUses;
25464 nbAttrs = vctxt->nbAttrInfos;
25465 if (attrUseList !=
NULL)
25466 nbUses = attrUseList->nbItems;
25469 for (
i = 0;
i < nbUses;
i++) {
25471 attrUse = attrUseList->items[
i];
25472 attrDecl = WXS_ATTRUSE_DECL(attrUse);
25473 for (
j = 0;
j < nbAttrs;
j++) {
25474 iattr = vctxt->attrInfos[
j];
25479 if (iattr->metaType)
25481 if (iattr->localName[0] != attrDecl->name[0])
25483 if (!
xmlStrEqual(iattr->localName, attrDecl->name))
25485 if (!
xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
25504 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25505 iattr->use = attrUse;
25509 iattr->decl = attrDecl;
25510 iattr->typeDef = attrDecl->subtypes;
25517 if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
25527 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25528 if (tmpiattr ==
NULL) {
25530 "xmlSchemaVAttributesComplex",
25531 "calling xmlSchemaGetFreshAttrInfo()");
25534 tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
25535 tmpiattr->use = attrUse;
25536 tmpiattr->decl = attrDecl;
25537 }
else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
25538 ((attrUse->defValue !=
NULL) ||
25539 (attrDecl->defValue !=
NULL))) {
25543 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25544 if (tmpiattr ==
NULL) {
25546 "xmlSchemaVAttributesComplex",
25547 "calling xmlSchemaGetFreshAttrInfo()");
25550 tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
25551 tmpiattr->use = attrUse;
25552 tmpiattr->decl = attrDecl;
25553 tmpiattr->typeDef = attrDecl->subtypes;
25554 tmpiattr->localName = attrDecl->name;
25555 tmpiattr->nsName = attrDecl->targetNamespace;
25559 if (vctxt->nbAttrInfos == 0)
25564 if (
type->attributeWildcard !=
NULL) {
25569 for (
i = 0;
i < nbAttrs;
i++) {
25570 iattr = vctxt->attrInfos[
i];
25575 if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
25587 if (xmlSchemaCheckCVCWildcardNamespace(
type->attributeWildcard,
25588 iattr->nsName) == 0) {
25598 if (
type->attributeWildcard->processContents ==
25599 XML_SCHEMAS_ANY_SKIP) {
25607 iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
25613 iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
25614 iattr->localName, iattr->nsName);
25615 if (iattr->decl !=
NULL) {
25616 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25630 iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
25631 if (xmlSchemaIsDerivedFromBuiltInType(
25632 iattr->typeDef, XML_SCHEMAS_ID)) {
25637 if (wildIDs != 0) {
25639 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
25651 if (attrUseList !=
NULL) {
25652 for (
j = 0;
j < attrUseList->nbItems;
j++) {
25653 if (xmlSchemaIsDerivedFromBuiltInType(
25654 WXS_ATTRUSE_TYPEDEF(attrUseList->items[
j]),
25657 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
25664 }
else if (
type->attributeWildcard->processContents ==
25665 XML_SCHEMAS_ANY_LAX) {
25666 iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
25673 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
25679 if (vctxt->nbAttrInfos == 0)
25686 if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
25687 xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
25688 if (ielem && ielem->node && ielem->node->doc)
25689 defAttrOwnerElem = ielem->node;
25694 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25695 iattr = vctxt->attrInfos[
i];
25701 if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
25702 (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
25707 if (iattr->typeDef ==
NULL) {
25708 iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
25712 ACTIVATE_ATTRIBUTE(iattr);
25716 if (vctxt->xpathStates !=
NULL) {
25720 xpathRes = xmlSchemaXPathEvaluate(vctxt,
25722 if (xpathRes == -1) {
25723 VERROR_INT(
"xmlSchemaVAttributesComplex",
25724 "calling xmlSchemaXPathEvaluate()");
25725 goto internal_error;
25729 if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
25735 if ((xpathRes) || (defAttrOwnerElem)) {
25736 if (iattr->use->defValue !=
NULL) {
25737 iattr->value = (
xmlChar *) iattr->use->defValue;
25738 iattr->val = iattr->use->defVal;
25740 iattr->value = (
xmlChar *) iattr->decl->defValue;
25741 iattr->val = iattr->decl->defVal;
25747 if (iattr->val ==
NULL) {
25748 VERROR_INT(
"xmlSchemaVAttributesComplex",
25749 "default/fixed value on an attribute use was "
25750 "not precomputed");
25751 goto internal_error;
25753 iattr->val = xmlSchemaCopyValue(iattr->val);
25754 if (iattr->val ==
NULL) {
25755 VERROR_INT(
"xmlSchemaVAttributesComplex",
25756 "calling xmlSchemaCopyValue()");
25757 goto internal_error;
25766 if (defAttrOwnerElem) {
25770 value = iattr->value;
25774 normValue = xmlSchemaNormalizeValue(iattr->typeDef,
25776 if (normValue !=
NULL)
25779 if (iattr->nsName ==
NULL) {
25780 if (xmlNewProp(defAttrOwnerElem,
25782 VERROR_INT(
"xmlSchemaVAttributesComplex",
25783 "calling xmlNewProp()");
25784 if (normValue !=
NULL)
25786 goto internal_error;
25792 defAttrOwnerElem, iattr->nsName);
25807 "xmlSchemaVAttributesComplex",
25808 "could not compute a ns prefix for a "
25809 "default/fixed attribute");
25810 if (normValue !=
NULL)
25812 goto internal_error;
25826 if (normValue !=
NULL)
25837 if (vctxt->value !=
NULL) {
25841 xmlSchemaFreeValue(vctxt->value);
25842 vctxt->value =
NULL;
25848 if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
25849 ((iattr->use !=
NULL) &&
25850 (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
25863 if (xpathRes ||
fixed) {
25864 iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
25868 res = xmlSchemaVCheckCVCSimpleType(
25870 iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
25873 res = xmlSchemaVCheckCVCSimpleType(
25875 iattr->node, iattr->typeDef, iattr->value,
NULL,
25881 VERROR_INT(
"xmlSchemaVAttributesComplex",
25882 "calling xmlSchemaStreamValidateSimpleTypeValue()");
25883 goto internal_error;
25885 iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
25910 if (iattr->val ==
NULL) {
25915 if ((iattr->use !=
NULL) &&
25916 (iattr->use->defValue !=
NULL)) {
25917 if (iattr->use->defVal ==
NULL) {
25922 iattr->vcValue = iattr->use->defValue;
25929 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
25930 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25932 if (iattr->decl->defVal ==
NULL) {
25937 iattr->vcValue = iattr->decl->defValue;
25944 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
25945 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25956 if (xmlSchemaXPathProcessHistory(vctxt,
25957 vctxt->depth +1) == -1) {
25958 VERROR_INT(
"xmlSchemaVAttributesComplex",
25959 "calling xmlSchemaXPathEvaluate()");
25960 goto internal_error;
25962 }
else if (vctxt->xpathStates !=
NULL)
25963 xmlSchemaXPathPop(vctxt);
25969 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25970 iattr = vctxt->attrInfos[
i];
25971 if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
25972 (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
25973 (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
25974 (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
25976 ACTIVATE_ATTRIBUTE(iattr);
25977 switch (iattr->state) {
25978 case XML_SCHEMAS_ATTR_ERR_MISSING: {
25981 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25983 "The attribute '%s' is required but missing",
25984 xmlSchemaFormatQName(&
str,
25985 iattr->decl->targetNamespace,
25986 iattr->decl->name),
25991 case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
25993 "The type definition is absent");
25995 case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
25996 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25998 "The value '%s' does not match the fixed "
25999 "value constraint '%s'",
26000 iattr->
value, iattr->vcValue);
26002 case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
26004 "No matching global attribute declaration available, but "
26005 "demanded by the strict wildcard");
26007 case XML_SCHEMAS_ATTR_UNKNOWN:
26008 if (iattr->metaType)
26014 if (
type->attributeWildcard ==
NULL) {
26015 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
26018 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
26035xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
26038 xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
26044 (wild->type != XML_SCHEMA_TYPE_ANY)) {
26045 VERROR_INT(
"xmlSchemaValidateElemWildcard",
26050 if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
26059 xmlSchemaElementPtr decl =
NULL;
26061 decl = xmlSchemaGetElem(vctxt->schema,
26062 vctxt->inode->localName, vctxt->inode->nsName);
26063 if (decl !=
NULL) {
26064 vctxt->inode->decl = decl;
26068 if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
26071 "No matching global element declaration available, but "
26072 "demanded by the strict wildcard");
26073 return (vctxt->err);
26075 if (vctxt->nbAttrInfos != 0) {
26076 xmlSchemaAttrInfoPtr iattr;
26083 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26084 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26085 if (iattr !=
NULL) {
26086 if (xmlSchemaProcessXSIType(vctxt, iattr,
26087 &(vctxt->inode->typeDef),
NULL) == -1) {
26088 VERROR_INT(
"xmlSchemaValidateElemWildcard",
26089 "calling xmlSchemaProcessXSIType() to "
26090 "process the attribute 'xsi:nil'");
26104 vctxt->inode->typeDef =
26105 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26117xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
26119 xmlSchemaValPtr *
val)
26122 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
26130 if WXS_IS_COMPLEX(
inode->typeDef) {
26140 if ((! WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) &&
26141 ((! WXS_HAS_MIXED_CONTENT(
inode->typeDef)) ||
26142 (! WXS_EMPTIABLE(
inode->typeDef)))) {
26146 "For a string to be a valid default, the type definition "
26147 "must be a simple type or a complex type with simple content "
26148 "or mixed content and a particle emptiable");
26163 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26165 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
26168 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26170 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
26174 VERROR_INT(
"xmlSchemaCheckCOSValidDefault",
26175 "calling xmlSchemaVCheckCVCSimpleType()");
26183 void *transdata,
void *inputdata)
26185 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) transdata;
26186 xmlSchemaNodeInfoPtr
inode = (xmlSchemaNodeInfoPtr) inputdata;
26188#ifdef DEBUG_CONTENT
26192 if (
item->type == XML_SCHEMA_TYPE_ELEMENT) {
26194 "AUTOMATON callback for '%s' [declaration]\n",
26195 xmlSchemaFormatQName(&
str,
26199 "AUTOMATON callback for '%s' [wildcard]\n",
26200 xmlSchemaFormatQName(&
str,
26210xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
26212 vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
26213 if (vctxt->inode ==
NULL) {
26214 VERROR_INT(
"xmlSchemaValidatorPushElem",
26215 "calling xmlSchemaGetFreshElemInfo()");
26218 vctxt->nbAttrInfos = 0;
26223xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
26224 xmlSchemaNodeInfoPtr
inode,
26225 xmlSchemaTypePtr
type,
26228 if (
inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
26229 return (xmlSchemaVCheckCVCSimpleType(
26230 ACTXT_CAST vctxt,
NULL,
26233 return (xmlSchemaVCheckCVCSimpleType(
26234 ACTXT_CAST vctxt,
NULL,
26244xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
26247 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
26249 if (vctxt->nbAttrInfos != 0)
26250 xmlSchemaClearAttrInfos(vctxt);
26251 if (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
26257 vctxt->skipDepth = vctxt->depth -1;
26261 (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
26272 if ((
inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
26273 (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
26278 if (
inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
26279 goto character_content;
26281 if ((
inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
26283 int terminal, nbval = 10, nbneg;
26290 xmlRegNewExecCtxt(
inode->typeDef->contModel,
26291 xmlSchemaVContentModelCallback, vctxt);
26293 VERROR_INT(
"xmlSchemaValidatorPopElem",
26294 "failed to create a regex context");
26295 goto internal_error;
26297#ifdef DEBUG_AUTOMATA
26299 "AUTOMATON create on '%s'\n",
inode->localName);
26306 if (INODE_NILLED(
inode)) {
26308#ifdef DEBUG_AUTOMATA
26310 "AUTOMATON succeeded on nilled '%s'\n",
26320 xmlRegExecNextValues(
inode->regexCtxt,
26321 &nbval, &nbneg, &
values[0], &terminal);
26323 if ((
ret<0) || ((
ret==0) && (!INODE_NILLED(
inode)))) {
26329 XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26330 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26332 "Missing child element(s)",
26334#ifdef DEBUG_AUTOMATA
26336 "AUTOMATON missing ERROR on '%s'\n",
26344#ifdef DEBUG_AUTOMATA
26346 "AUTOMATON succeeded on '%s'\n",
26356 if (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
26361 if (vctxt->value !=
NULL) {
26362 xmlSchemaFreeValue(vctxt->value);
26363 vctxt->value =
NULL;
26372 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26373 ret = xmlSchemaVCheckINodeDataType(vctxt,
26375 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26376 ret = xmlSchemaVCheckINodeDataType(vctxt,
26381 VERROR_INT(
"xmlSchemaValidatorPopElem",
26382 "calling xmlSchemaVCheckCVCSimpleType()");
26383 goto internal_error;
26398 (
inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
26399 (! INODE_NILLED(
inode))) {
26413 if (
inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
26415 ret = xmlSchemaCheckCOSValidDefault(vctxt,
26419 VERROR_INT(
"xmlSchemaValidatorPopElem",
26420 "calling xmlSchemaCheckCOSValidDefault()");
26421 goto internal_error;
26439 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26440 ret = xmlSchemaVCheckINodeDataType(vctxt,
26442 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26443 ret = xmlSchemaVCheckINodeDataType(vctxt,
26445 inode->decl->value);
26449 VERROR_INT(
"xmlSchemaValidatorPopElem",
26450 "calling xmlSchemaVCheckCVCSimpleType()");
26451 goto internal_error;
26460 if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
26467 normValue = xmlSchemaNormalizeValue(
inode->typeDef,
26468 inode->decl->value);
26469 if (normValue !=
NULL) {
26475 inode->decl->value);
26476 if (textChild ==
NULL) {
26477 VERROR_INT(
"xmlSchemaValidatorPopElem",
26478 "calling xmlNewDocText()");
26479 goto internal_error;
26484 }
else if (! INODE_NILLED(
inode)) {
26490 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26499 ret = xmlSchemaVCheckINodeDataType(vctxt,
26501 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26514 ret = xmlSchemaVCheckINodeDataType(vctxt,
26519 VERROR_INT(
"xmlSchemaValidatorPopElem",
26520 "calling xmlSchemaVCheckCVCSimpleType()");
26521 goto internal_error;
26530 (
inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
26541 XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
26544 "The content must not contain element nodes since "
26545 "there is a fixed value constraint");
26552 if (WXS_HAS_MIXED_CONTENT(
inode->typeDef)) {
26570 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26572 "The initial value '%s' does not match the fixed "
26573 "value constraint '%s'",
26577 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26591 inode->decl->value)) {
26593 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26595 "The actual value '%s' does not match the fixed "
26596 "value constraint '%s'",
26598 inode->decl->value);
26607 if (vctxt->depth < 0) {
26611 if (vctxt->depth == vctxt->skipDepth)
26612 vctxt->skipDepth = -1;
26616 if (
inode->appliedXPath &&
26617 (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
26618 goto internal_error;
26636 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26638 if (xmlSchemaIDCFillNodeTables(vctxt,
inode) == -1)
26639 goto internal_error;
26644 if (vctxt->inode->hasKeyrefs)
26645 if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
26646 goto internal_error;
26651#ifdef DEBUG_IDC_NODE_TABLE
26652 xmlSchemaDebugDumpIDCTable(
stdout,
26657 if ((vctxt->depth > 0) &&
26658 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26663 if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
26664 goto internal_error;
26672 xmlSchemaClearElemInfo(vctxt,
inode);
26676 if (vctxt->depth == 0) {
26678 vctxt->inode =
NULL;
26684 if (vctxt->aidcs !=
NULL) {
26685 xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
26687 if (aidc->keyrefDepth == vctxt->depth) {
26693 aidc->keyrefDepth = -1;
26696 }
while (aidc !=
NULL);
26699 vctxt->inode = vctxt->elemInfos[vctxt->depth];
26716xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
26718 xmlSchemaNodeInfoPtr pielem;
26719 xmlSchemaTypePtr ptype;
26722 if (vctxt->depth <= 0) {
26723 VERROR_INT(
"xmlSchemaValidateChildElem",
26724 "not intended for the validation root");
26727 pielem = vctxt->elemInfos[vctxt->depth -1];
26728 if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
26729 pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
26733 if (INODE_NILLED(pielem)) {
26737 ACTIVATE_PARENT_ELEM;
26740 "Neither character nor element content is allowed, "
26741 "because the element was 'nilled'");
26743 goto unexpected_elem;
26746 ptype = pielem->typeDef;
26748 if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
26754 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26755 vctxt->inode->localName,
26756 vctxt->inode->nsName);
26758 if (vctxt->inode->decl ==
NULL) {
26759 xmlSchemaAttrInfoPtr iattr;
26764 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26765 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26766 if (iattr !=
NULL) {
26767 ret = xmlSchemaProcessXSIType(vctxt, iattr,
26768 &(vctxt->inode->typeDef),
NULL);
26771 VERROR_INT(
"xmlSchemaValidateChildElem",
26772 "calling xmlSchemaProcessXSIType() to "
26773 "process the attribute 'xsi:nil'");
26789 vctxt->inode->typeDef =
26790 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26796 switch (ptype->contentType) {
26797 case XML_SCHEMA_CONTENT_EMPTY:
26803 ACTIVATE_PARENT_ELEM
26806 "Element content is not allowed, "
26807 "because the content type is empty");
26809 goto unexpected_elem;
26812 case XML_SCHEMA_CONTENT_MIXED:
26813 case XML_SCHEMA_CONTENT_ELEMENTS: {
26814 xmlRegExecCtxtPtr regexCtxt;
26816 int terminal, nbval = 10, nbneg;
26820 if (ptype->contModel ==
NULL) {
26821 VERROR_INT(
"xmlSchemaValidateChildElem",
26822 "type has elem content but no content model");
26829 if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
26830 VERROR_INT(
"xmlSchemaValidateChildElem",
26831 "validating elem, but elem content is already invalid");
26835 regexCtxt = pielem->regexCtxt;
26836 if (regexCtxt ==
NULL) {
26840 regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
26841 xmlSchemaVContentModelCallback, vctxt);
26842 if (regexCtxt ==
NULL) {
26843 VERROR_INT(
"xmlSchemaValidateChildElem",
26844 "failed to create a regex context");
26847 pielem->regexCtxt = regexCtxt;
26848#ifdef DEBUG_AUTOMATA
26850 pielem->localName);
26862 ret = xmlRegExecPushString2(regexCtxt,
26863 vctxt->inode->localName,
26864 vctxt->inode->nsName,
26866#ifdef DEBUG_AUTOMATA
26869 "AUTOMATON push ERROR for '%s' on '%s'\n",
26870 vctxt->inode->localName, pielem->localName);
26873 "AUTOMATON push OK for '%s' on '%s'\n",
26874 vctxt->inode->localName, pielem->localName);
26877 VERROR_INT(
"xmlSchemaValidateChildElem",
26878 "calling xmlRegExecPushString2()");
26882 xmlRegExecErrInfo(regexCtxt,
NULL, &nbval, &nbneg,
26884 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26886 "This element is not expected",
26889 goto unexpected_elem;
26894 case XML_SCHEMA_CONTENT_SIMPLE:
26895 case XML_SCHEMA_CONTENT_BASIC:
26896 ACTIVATE_PARENT_ELEM
26897 if (WXS_IS_COMPLEX(ptype)) {
26905 VERROR(
ret,
NULL,
"Element content is not allowed, "
26906 "because the content type is a simple type definition");
26913 VERROR(
ret,
NULL,
"Element content is not allowed, "
26914 "because the type definition is simple");
26918 goto unexpected_elem;
26930 vctxt->skipDepth = vctxt->depth;
26931 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
26932 pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26936#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
26937#define XML_SCHEMA_PUSH_TEXT_CREATED 2
26938#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
26941xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
26956 if (INODE_NILLED(vctxt->inode)) {
26963 "Neither character nor element content is allowed "
26964 "because the element is 'nilled'");
26965 return (vctxt->err);
26972 if (vctxt->inode->typeDef->contentType ==
26973 XML_SCHEMA_CONTENT_EMPTY) {
26975 "Character content is not allowed, "
26976 "because the content type is empty");
26977 return (vctxt->err);
26980 if (vctxt->inode->typeDef->contentType ==
26981 XML_SCHEMA_CONTENT_ELEMENTS) {
26993 "Character content other than whitespace is not allowed "
26994 "because the content type is 'element-only'");
26995 return (vctxt->err);
27007 if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
27008 ((vctxt->inode->decl ==
NULL) ||
27009 (vctxt->inode->decl->value ==
NULL)))
27012 if (vctxt->inode->value ==
NULL) {
27017 case XML_SCHEMA_PUSH_TEXT_PERSIST:
27021 vctxt->inode->value =
value;
27023 case XML_SCHEMA_PUSH_TEXT_CREATED:
27028 vctxt->inode->value =
value;
27031 vctxt->inode->flags |=
27032 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
27034 case XML_SCHEMA_PUSH_TEXT_VOLATILE:
27043 vctxt->inode->flags |=
27044 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
27055 if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
27059 vctxt->inode->value =
27061 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
27069xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
27073 if ((vctxt->skipDepth != -1) &&
27074 (vctxt->depth >= vctxt->skipDepth)) {
27075 VERROR_INT(
"xmlSchemaValidateElem",
27077 goto internal_error;
27079 if (vctxt->xsiAssemble) {
27090 ret = xmlSchemaAssembleByXSI(vctxt);
27093 goto internal_error;
27094 vctxt->skipDepth = 0;
27101 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
27104 if (vctxt->depth > 0) {
27109 ret = xmlSchemaValidateChildElem(vctxt);
27112 VERROR_INT(
"xmlSchemaValidateElem",
27113 "calling xmlSchemaStreamValidateChildElement()");
27114 goto internal_error;
27118 if (vctxt->depth == vctxt->skipDepth)
27120 if ((vctxt->inode->decl ==
NULL) &&
27121 (vctxt->inode->typeDef ==
NULL)) {
27122 VERROR_INT(
"xmlSchemaValidateElem",
27123 "the child element was valid but neither the "
27124 "declaration nor the type was set");
27125 goto internal_error;
27131 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
27132 vctxt->inode->localName,
27133 vctxt->inode->nsName);
27134 if (vctxt->inode->decl ==
NULL) {
27137 "No matching global declaration available "
27138 "for the validation root");
27143 if (vctxt->inode->decl ==
NULL)
27144 goto type_validation;
27146 if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
27151 ret = xmlSchemaValidateElemWildcard(vctxt, &
skip);
27154 VERROR_INT(
"xmlSchemaValidateElem",
27155 "calling xmlSchemaValidateElemWildcard()");
27156 goto internal_error;
27161 vctxt->skipDepth = vctxt->depth;
27168 if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
27172 vctxt->inode->decl =
NULL;
27173 goto type_validation;
27179 ret = xmlSchemaValidateElemDecl(vctxt);
27182 VERROR_INT(
"xmlSchemaValidateElem",
27183 "calling xmlSchemaValidateElemDecl()");
27184 goto internal_error;
27193 if (vctxt->inode->typeDef ==
NULL) {
27194 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
27197 "The type definition is absent");
27200 if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
27201 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
27204 "The type definition is abstract");
27212 if (vctxt->xpathStates !=
NULL) {
27214 vctxt->inode->appliedXPath = 1;
27216 VERROR_INT(
"xmlSchemaValidateElem",
27217 "calling xmlSchemaXPathEvaluate()");
27218 goto internal_error;
27224 if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
27225 if ((vctxt->nbAttrInfos != 0) ||
27226 (vctxt->inode->typeDef->attrUses !=
NULL)) {
27228 ret = xmlSchemaVAttributesComplex(vctxt);
27230 }
else if (vctxt->nbAttrInfos != 0) {
27232 ret = xmlSchemaVAttributesSimple(vctxt);
27237 if (vctxt->nbAttrInfos != 0)
27238 xmlSchemaClearAttrInfos(vctxt);
27240 VERROR_INT(
"xmlSchemaValidateElem",
27241 "calling attributes validation");
27242 goto internal_error;
27251 vctxt->skipDepth = vctxt->depth;
27257#ifdef XML_SCHEMA_READER_ENABLED
27259xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
27261 const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
27263 xmlSchemaNodeInfoPtr ielem;
27266 ret = xmlTextReaderRead(vctxt->reader);
27271 nodeType = xmlTextReaderNodeType(vctxt->reader);
27274 ret = xmlTextReaderRead(vctxt->reader);
27281 depth = xmlTextReaderDepth(vctxt->reader);
27282 nodeType = xmlTextReaderNodeType(vctxt->reader);
27287 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27288 VERROR_INT(
"xmlSchemaVReaderWalk",
27289 "calling xmlSchemaValidatorPushElem()");
27290 goto internal_error;
27292 ielem = vctxt->inode;
27293 ielem->localName = xmlTextReaderLocalName(vctxt->reader);
27294 ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
27295 ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
27299 ret = xmlTextReaderIsEmptyElement(vctxt->reader);
27301 VERROR_INT(
"xmlSchemaVReaderWalk",
27302 "calling xmlTextReaderIsEmptyElement()");
27303 goto internal_error;
27306 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27311 vctxt->nbAttrInfos = 0;
27312 ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
27314 VERROR_INT(
"xmlSchemaVReaderWalk",
27315 "calling xmlTextReaderMoveToFirstAttribute()");
27316 goto internal_error;
27324 if (xmlSchemaValidatorPushAttribute(vctxt,
NULL,
27325 (
const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
27326 xmlTextReaderNamespaceUri(vctxt->reader), 1,
27327 xmlTextReaderValue(vctxt->reader), 1) == -1) {
27329 VERROR_INT(
"xmlSchemaVReaderWalk",
27330 "calling xmlSchemaValidatorPushAttribute()");
27331 goto internal_error;
27333 ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
27335 VERROR_INT(
"xmlSchemaVReaderWalk",
27336 "calling xmlTextReaderMoveToFirstAttribute()");
27337 goto internal_error;
27339 }
while (
ret == 1);
27343 ret = xmlTextReaderMoveToElement(vctxt->reader);
27345 VERROR_INT(
"xmlSchemaVReaderWalk",
27346 "calling xmlTextReaderMoveToElement()");
27347 goto internal_error;
27353 ret= xmlSchemaValidateElem(vctxt);
27356 VERROR_INT(
"xmlSchemaVReaderWalk",
27357 "calling xmlSchemaValidateElem()");
27358 goto internal_error;
27362 if (vctxt->depth == vctxt->skipDepth) {
27367 if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
27368 ret = xmlTextReaderRead(vctxt->reader);
27369 curDepth = xmlTextReaderDepth(vctxt->reader);
27370 while ((
ret == 1) && (curDepth !=
depth)) {
27371 ret = xmlTextReaderRead(vctxt->reader);
27372 curDepth = xmlTextReaderDepth(vctxt->reader);
27388 if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27390 }
else if (nodeType == END_ELEM) {
27395 ret = xmlSchemaValidatorPopElem(vctxt);
27398 VERROR_INT(
"xmlSchemaVReaderWalk",
27399 "calling xmlSchemaValidatorPopElem()");
27400 goto internal_error;
27404 if (vctxt->depth >= 0)
27405 ielem = vctxt->inode;
27410 (nodeType == WHTSP) ||
27411 (nodeType == SIGN_WHTSP)) {
27417 if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
27420 value = xmlTextReaderValue(vctxt->reader);
27422 -1, XML_SCHEMA_PUSH_TEXT_CREATED, &
consumed);
27426 VERROR_INT(
"xmlSchemaVReaderWalk",
27427 "calling xmlSchemaVPushText()");
27428 goto internal_error;
27440 ret = xmlTextReaderRead(vctxt->reader);
27441 }
while (
ret == 1);
27460xmlSchemaSAXHandleText(
void *
ctx,
27464 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27466 if (vctxt->depth < 0)
27468 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27470 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27471 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27473 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27474 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27475 "calling xmlSchemaVPushText()");
27485xmlSchemaSAXHandleCDataSection(
void *
ctx,
27489 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27491 if (vctxt->depth < 0)
27493 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27495 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27496 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27498 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27499 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27500 "calling xmlSchemaVPushText()");
27510 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27512 if (vctxt->depth < 0)
27514 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27521xmlSchemaSAXHandleStartElementNs(
void *
ctx,
27531 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27533 xmlSchemaNodeInfoPtr ielem;
27543 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27548 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27549 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27550 "calling xmlSchemaValidatorPushElem()");
27551 goto internal_error;
27553 ielem = vctxt->inode;
27558 ielem->localName = localname;
27559 ielem->nsName = URI;
27560 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27564 if (nb_namespaces != 0) {
27569 for (
i = 0,
j = 0;
i < nb_namespaces;
i++,
j += 2) {
27573 if (ielem->nsBindings ==
NULL) {
27574 ielem->nsBindings =
27577 if (ielem->nsBindings ==
NULL) {
27578 xmlSchemaVErrMemory(vctxt,
27579 "allocating namespace bindings for SAX validation",
27581 goto internal_error;
27583 ielem->nbNsBindings = 0;
27584 ielem->sizeNsBindings = 5;
27585 }
else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
27586 ielem->sizeNsBindings *= 2;
27587 ielem->nsBindings =
27589 (
void *) ielem->nsBindings,
27590 ielem->sizeNsBindings * 2 *
sizeof(
const xmlChar *));
27591 if (ielem->nsBindings ==
NULL) {
27592 xmlSchemaVErrMemory(vctxt,
27593 "re-allocating namespace bindings for SAX validation",
27595 goto internal_error;
27599 ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[
j];
27600 if (namespaces[
j+1][0] == 0) {
27604 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
NULL;
27606 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
27608 ielem->nbNsBindings++;
27616 if (nb_attributes != 0) {
27617 int valueLen,
k,
l;
27620 for (
j = 0,
i = 0;
i < nb_attributes;
i++,
j += 5) {
27629 valueLen = attributes[
j+4] - attributes[
j+3];
27632 xmlSchemaVErrMemory(vctxt,
27633 "allocating string for decoded attribute",
27635 goto internal_error;
27637 for (
k = 0,
l = 0;
k < valueLen;
l++) {
27638 if (
k < valueLen - 4 &&
27639 attributes[
j+3][
k+0] ==
'&' &&
27640 attributes[
j+3][
k+1] ==
'#' &&
27641 attributes[
j+3][
k+2] ==
'3' &&
27642 attributes[
j+3][
k+3] ==
'8' &&
27643 attributes[
j+3][
k+4] ==
';') {
27655 ret = xmlSchemaValidatorPushAttribute(vctxt,
27656 NULL, ielem->nodeLine, attributes[
j], attributes[
j+2], 0,
27659 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27660 "calling xmlSchemaValidatorPushAttribute()");
27661 goto internal_error;
27668 ret = xmlSchemaValidateElem(vctxt);
27671 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27672 "calling xmlSchemaValidateElem()");
27673 goto internal_error;
27687xmlSchemaSAXHandleEndElementNs(
void *
ctx,
27692 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27698 if (vctxt->skipDepth != -1) {
27699 if (vctxt->depth > vctxt->skipDepth) {
27703 vctxt->skipDepth = -1;
27708 if ((!
xmlStrEqual(vctxt->inode->localName, localname)) ||
27710 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27711 "elem pop mismatch");
27713 res = xmlSchemaValidatorPopElem(vctxt);
27716 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27717 "calling xmlSchemaValidatorPopElem()");
27718 goto internal_error;
27744xmlSchemaValidCtxtPtr
27745xmlSchemaNewValidCtxt(xmlSchemaPtr
schema)
27747 xmlSchemaValidCtxtPtr
ret;
27749 ret = (xmlSchemaValidCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaValidCtxt));
27751 xmlSchemaVErrMemory(
NULL,
"allocating validation context",
NULL);
27754 memset(
ret, 0,
sizeof(xmlSchemaValidCtxt));
27755 ret->type = XML_SCHEMA_CTXT_VALIDATOR;
27757 ret->nodeQNames = xmlSchemaItemListCreate();
27771xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt,
const char *
filename) {
27774 if (vctxt->filename !=
NULL)
27779 vctxt->filename =
NULL;
27790xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
27801 vctxt->validationRoot =
NULL;
27803#ifdef LIBXML_READER_ENABLED
27804 vctxt->reader =
NULL;
27806 vctxt->hasKeyrefs = 0;
27808 if (vctxt->value !=
NULL) {
27809 xmlSchemaFreeValue(vctxt->value);
27810 vctxt->value =
NULL;
27815 if (vctxt->aidcs !=
NULL) {
27816 xmlSchemaIDCAugPtr
cur = vctxt->aidcs,
next;
27822 vctxt->aidcs =
NULL;
27825 if (vctxt->idcNodes !=
NULL) {
27827 xmlSchemaPSVIIDCNodePtr
item;
27829 for (
i = 0;
i < vctxt->nbIdcNodes;
i++) {
27830 item = vctxt->idcNodes[
i];
27835 vctxt->idcNodes =
NULL;
27836 vctxt->nbIdcNodes = 0;
27837 vctxt->sizeIdcNodes = 0;
27840 if (vctxt->idcKeys !=
NULL) {
27842 for (
i = 0;
i < vctxt->nbIdcKeys;
i++)
27843 xmlSchemaIDCFreeKey(vctxt->idcKeys[
i]);
27845 vctxt->idcKeys =
NULL;
27846 vctxt->nbIdcKeys = 0;
27847 vctxt->sizeIdcKeys = 0;
27853 if (vctxt->xpathStates !=
NULL) {
27854 xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
27855 vctxt->xpathStates =
NULL;
27860 if (vctxt->nbAttrInfos != 0) {
27861 xmlSchemaClearAttrInfos(vctxt);
27866 if (vctxt->elemInfos !=
NULL) {
27868 xmlSchemaNodeInfoPtr ei;
27870 for (
i = 0;
i < vctxt->sizeElemInfos;
i++) {
27871 ei = vctxt->elemInfos[
i];
27874 xmlSchemaClearElemInfo(vctxt, ei);
27877 xmlSchemaItemListClear(vctxt->nodeQNames);
27886 if (vctxt->filename !=
NULL) {
27888 vctxt->filename =
NULL;
27895 if (vctxt->idcMatcherCache !=
NULL) {
27896 xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
27900 matcher = matcher->nextCached;
27901 xmlSchemaIDCFreeMatcherList(tmp);
27903 vctxt->idcMatcherCache =
NULL;
27914xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
27918 if (ctxt->value !=
NULL)
27919 xmlSchemaFreeValue(ctxt->value);
27920 if (ctxt->pctxt !=
NULL)
27921 xmlSchemaFreeParserCtxt(ctxt->pctxt);
27922 if (ctxt->idcNodes !=
NULL) {
27924 xmlSchemaPSVIIDCNodePtr
item;
27926 for (
i = 0;
i < ctxt->nbIdcNodes;
i++) {
27927 item = ctxt->idcNodes[
i];
27933 if (ctxt->idcKeys !=
NULL) {
27935 for (
i = 0;
i < ctxt->nbIdcKeys;
i++)
27936 xmlSchemaIDCFreeKey(ctxt->idcKeys[
i]);
27940 if (ctxt->xpathStates !=
NULL) {
27941 xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
27942 ctxt->xpathStates =
NULL;
27944 if (ctxt->xpathStatePool !=
NULL) {
27945 xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
27946 ctxt->xpathStatePool =
NULL;
27952 if (ctxt->aidcs !=
NULL) {
27953 xmlSchemaIDCAugPtr
cur = ctxt->aidcs,
next;
27960 if (ctxt->attrInfos !=
NULL) {
27962 xmlSchemaAttrInfoPtr
attr;
27965 if (ctxt->nbAttrInfos != 0)
27966 xmlSchemaClearAttrInfos(ctxt);
27967 for (
i = 0;
i < ctxt->sizeAttrInfos;
i++) {
27968 attr = ctxt->attrInfos[
i];
27973 if (ctxt->elemInfos !=
NULL) {
27975 xmlSchemaNodeInfoPtr ei;
27977 for (
i = 0;
i < ctxt->sizeElemInfos;
i++) {
27978 ei = ctxt->elemInfos[
i];
27981 xmlSchemaClearElemInfo(ctxt, ei);
27986 if (ctxt->nodeQNames !=
NULL)
27987 xmlSchemaItemListFree(ctxt->nodeQNames);
27988 if (ctxt->dict !=
NULL)
27990 if (ctxt->filename !=
NULL)
28005xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
28009 return(ctxt->err == 0);
28022xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
28023 xmlSchemaValidityErrorFunc
err,
28024 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
28029 ctxt->warning =
warn;
28030 ctxt->errCtxt =
ctx;
28031 if (ctxt->pctxt !=
NULL)
28032 xmlSchemaSetParserErrors(ctxt->pctxt,
err,
warn,
ctx);
28044xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
28049 ctxt->serror = serror;
28050 ctxt->error =
NULL;
28051 ctxt->warning =
NULL;
28052 ctxt->errCtxt =
ctx;
28053 if (ctxt->pctxt !=
NULL)
28054 xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror,
ctx);
28069xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
28070 xmlSchemaValidityErrorFunc *
err,
28071 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
28076 *
err = ctxt->error;
28078 *
warn = ctxt->warning;
28080 *
ctx = ctxt->errCtxt;
28096xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
28110 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
28127xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
28133 return (ctxt->options);
28137xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
28141 xmlSchemaNodeInfoPtr ielem =
NULL;
28146 if (vctxt->validationRoot !=
NULL)
28147 valRoot = vctxt->validationRoot;
28150 if (valRoot ==
NULL) {
28152 VERROR(1,
NULL,
"The document has no document element");
28156 vctxt->validationRoot = valRoot;
28159 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
28167 if (xmlSchemaValidatorPushElem(vctxt) == -1)
28168 goto internal_error;
28169 ielem = vctxt->inode;
28170 ielem->node =
node;
28171 ielem->nodeLine =
node->line;
28172 ielem->localName =
node->name;
28174 ielem->nsName =
node->ns->href;
28175 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
28181 vctxt->nbAttrInfos = 0;
28186 nsName =
attr->ns->href;
28189 ret = xmlSchemaValidatorPushAttribute(vctxt,
28199 VERROR_INT(
"xmlSchemaDocWalk",
28200 "calling xmlSchemaValidatorPushAttribute()");
28201 goto internal_error;
28209 ret = xmlSchemaValidateElem(vctxt);
28212 VERROR_INT(
"xmlSchemaDocWalk",
28213 "calling xmlSchemaValidateElem()");
28214 goto internal_error;
28222 if ((vctxt->skipDepth != -1) &&
28223 (vctxt->depth >= vctxt->skipDepth))
28230 if ((ielem !=
NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
28231 ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
28232 ret = xmlSchemaVPushText(vctxt,
node->type,
node->content,
28233 -1, XML_SCHEMA_PUSH_TEXT_PERSIST,
NULL);
28235 VERROR_INT(
"xmlSchemaVDocWalk",
28236 "calling xmlSchemaVPushText()");
28237 goto internal_error;
28248 VERROR_INT(
"xmlSchemaVDocWalk",
28249 "there is at least one entity reference in the node-tree "
28250 "currently being validated. Processing of entities with "
28251 "this XML Schema processor is not supported (yet). Please "
28252 "substitute entities before validation.");
28253 goto internal_error;
28272 if (
node != vctxt->inode->node) {
28273 VERROR_INT(
"xmlSchemaVDocWalk",
28274 "element position mismatch");
28275 goto internal_error;
28277 ret = xmlSchemaValidatorPopElem(vctxt);
28280 VERROR_INT(
"xmlSchemaVDocWalk",
28281 "calling xmlSchemaValidatorPopElem()");
28282 goto internal_error;
28285 if (
node == valRoot)
28304xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
28309 vctxt->nberrors = 0;
28311 vctxt->skipDepth = -1;
28312 vctxt->hasKeyrefs = 0;
28313#ifdef ENABLE_IDC_NODE_TABLES_TEST
28314 vctxt->createIDCNodeTables = 1;
28316 vctxt->createIDCNodeTables = 0;
28321 if (vctxt->schema ==
NULL) {
28322 xmlSchemaParserCtxtPtr pctxt;
28324 vctxt->xsiAssemble = 1;
28331 if ((vctxt->pctxt ==
NULL) &&
28332 (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
28334 pctxt = vctxt->pctxt;
28335 pctxt->xsiAssemble = 1;
28339 vctxt->schema = xmlSchemaNewSchema(pctxt);
28340 if (vctxt->schema ==
NULL)
28345 pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
28346 if (pctxt->constructor ==
NULL)
28348 pctxt->constructor->mainSchema = vctxt->schema;
28352 pctxt->ownsConstructor = 1;
28358 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
28365xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
28366 if (vctxt->xsiAssemble) {
28367 if (vctxt->schema !=
NULL) {
28368 xmlSchemaFree(vctxt->schema);
28369 vctxt->schema =
NULL;
28372 xmlSchemaClearValidCtxt(vctxt);
28376xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
28380 if (xmlSchemaPreRun(vctxt) < 0)
28383 if (vctxt->doc !=
NULL) {
28387 ret = xmlSchemaVDocWalk(vctxt);
28388#ifdef LIBXML_READER_ENABLED
28389 }
else if (vctxt->reader !=
NULL) {
28393#ifdef XML_SCHEMA_READER_ENABLED
28394 ret = xmlSchemaVReaderWalk(vctxt);
28397 }
else if ((vctxt->sax !=
NULL) && (vctxt->parserCtxt !=
NULL)) {
28403 VERROR_INT(
"xmlSchemaVStart",
28404 "no instance to validate");
28408 xmlSchemaPostRun(vctxt);
28425xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt,
xmlNodePtr elem)
28430 if (ctxt->schema ==
NULL)
28433 ctxt->doc =
elem->doc;
28435 ctxt->validationRoot =
elem;
28436 return(xmlSchemaVStart(ctxt));
28450xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt,
xmlDocPtr doc)
28452 if ((ctxt ==
NULL) || (doc ==
NULL))
28457 if (ctxt->node ==
NULL) {
28458 xmlSchemaCustomErr(ACTXT_CAST ctxt,
28461 "The document has no document element",
NULL,
NULL);
28462 return (ctxt->err);
28464 ctxt->validationRoot = ctxt->node;
28465 return (xmlSchemaVStart(ctxt));
28474typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
28475typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
28477struct _xmlSchemaSplitSAXData {
28480 xmlSchemaValidCtxtPtr ctxt;
28484#define XML_SAX_PLUG_MAGIC 0xdc43ba21
28486struct _xmlSchemaSAXPlug {
28487 unsigned int magic;
28492 void **user_data_ptr;
28497 xmlSchemaValidCtxtPtr ctxt;
28505 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28506 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28507 (ctxt->user_sax->internalSubset !=
NULL))
28508 ctxt->user_sax->internalSubset(ctxt->user_data,
name, ExternalID,
28513isStandaloneSplit(
void *
ctx)
28515 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28516 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28517 (ctxt->user_sax->isStandalone !=
NULL))
28518 return(ctxt->user_sax->isStandalone(ctxt->user_data));
28523hasInternalSubsetSplit(
void *
ctx)
28525 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28526 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28527 (ctxt->user_sax->hasInternalSubset !=
NULL))
28528 return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
28533hasExternalSubsetSplit(
void *
ctx)
28535 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28536 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28537 (ctxt->user_sax->hasExternalSubset !=
NULL))
28538 return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
28546 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28547 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28548 (ctxt->user_sax->externalSubset !=
NULL))
28549 ctxt->user_sax->externalSubset(ctxt->user_data,
name, ExternalID,
28556 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28557 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28558 (ctxt->user_sax->resolveEntity !=
NULL))
28559 return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
28567 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28568 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28569 (ctxt->user_sax->getEntity !=
NULL))
28570 return(ctxt->user_sax->getEntity(ctxt->user_data,
name));
28577 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28578 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28579 (ctxt->user_sax->getParameterEntity !=
NULL))
28580 return(ctxt->user_sax->getParameterEntity(ctxt->user_data,
name));
28589 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28590 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28591 (ctxt->user_sax->entityDecl !=
NULL))
28592 ctxt->user_sax->entityDecl(ctxt->user_data,
name,
type, publicId,
28601 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28602 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28603 (ctxt->user_sax->attributeDecl !=
NULL)) {
28604 ctxt->user_sax->attributeDecl(ctxt->user_data,
elem,
name,
type,
28605 def, defaultValue,
tree);
28615 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28616 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28617 (ctxt->user_sax->elementDecl !=
NULL))
28625 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28626 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28627 (ctxt->user_sax->notationDecl !=
NULL))
28628 ctxt->user_sax->notationDecl(ctxt->user_data,
name, publicId,
28637 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28638 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28639 (ctxt->user_sax->unparsedEntityDecl !=
NULL))
28640 ctxt->user_sax->unparsedEntityDecl(ctxt->user_data,
name, publicId,
28641 systemId, notationName);
28647 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28648 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28649 (ctxt->user_sax->setDocumentLocator !=
NULL))
28650 ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
28654startDocumentSplit(
void *
ctx)
28656 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28657 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28658 (ctxt->user_sax->startDocument !=
NULL))
28659 ctxt->user_sax->startDocument(ctxt->user_data);
28663endDocumentSplit(
void *
ctx)
28665 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28666 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28667 (ctxt->user_sax->endDocument !=
NULL))
28668 ctxt->user_sax->endDocument(ctxt->user_data);
28675 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28676 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28677 (ctxt->user_sax->processingInstruction !=
NULL))
28678 ctxt->user_sax->processingInstruction(ctxt->user_data,
target,
data);
28684 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28685 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28686 (ctxt->user_sax->comment !=
NULL))
28687 ctxt->user_sax->comment(ctxt->user_data,
value);
28696 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28697 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28698 (ctxt->user_sax->warning !=
NULL)) {
28704 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28705 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28706 (ctxt->user_sax->error !=
NULL)) {
28712 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28713 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28714 (ctxt->user_sax->fatalError !=
NULL)) {
28726 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28729 if ((ctxt->user_sax !=
NULL) && (ctxt->user_sax->characters !=
NULL))
28730 ctxt->user_sax->characters(ctxt->user_data, ch,
len);
28731 if (ctxt->ctxt !=
NULL)
28732 xmlSchemaSAXHandleText(ctxt->ctxt, ch,
len);
28736ignorableWhitespaceSplit(
void *
ctx,
const xmlChar *ch,
int len)
28738 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28741 if ((ctxt->user_sax !=
NULL) &&
28742 (ctxt->user_sax->ignorableWhitespace !=
NULL))
28743 ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch,
len);
28744 if (ctxt->ctxt !=
NULL)
28745 xmlSchemaSAXHandleText(ctxt->ctxt, ch,
len);
28751 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28754 if ((ctxt->user_sax !=
NULL) &&
28755 (ctxt->user_sax->cdataBlock !=
NULL))
28756 ctxt->user_sax->cdataBlock(ctxt->user_data,
value,
len);
28757 if (ctxt->ctxt !=
NULL)
28758 xmlSchemaSAXHandleCDataSection(ctxt->ctxt,
value,
len);
28764 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28767 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28768 (ctxt->user_sax->reference !=
NULL))
28769 ctxt->user_sax->reference(ctxt->user_data,
name);
28770 if (ctxt->ctxt !=
NULL)
28771 xmlSchemaSAXHandleReference(ctxt->user_data,
name);
28775startElementNsSplit(
void *
ctx,
const xmlChar * localname,
28777 int nb_namespaces,
const xmlChar ** namespaces,
28778 int nb_attributes,
int nb_defaulted,
28779 const xmlChar ** attributes) {
28780 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28783 if ((ctxt->user_sax !=
NULL) &&
28784 (ctxt->user_sax->startElementNs !=
NULL))
28785 ctxt->user_sax->startElementNs(ctxt->user_data, localname,
prefix,
28786 URI, nb_namespaces, namespaces,
28787 nb_attributes, nb_defaulted,
28789 if (ctxt->ctxt !=
NULL)
28790 xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname,
prefix,
28791 URI, nb_namespaces, namespaces,
28792 nb_attributes, nb_defaulted,
28797endElementNsSplit(
void *
ctx,
const xmlChar * localname,
28799 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28802 if ((ctxt->user_sax !=
NULL) &&
28803 (ctxt->user_sax->endElementNs !=
NULL))
28804 ctxt->user_sax->endElementNs(ctxt->user_data, localname,
prefix, URI);
28805 if (ctxt->ctxt !=
NULL)
28806 xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname,
prefix, URI);
28823xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
28826 xmlSchemaSAXPlugPtr
ret;
28838 if ((old_sax !=
NULL) &&
28846 ret = (xmlSchemaSAXPlugPtr)
xmlMalloc(
sizeof(xmlSchemaSAXPlugStruct));
28850 memset(
ret, 0,
sizeof(xmlSchemaSAXPlugStruct));
28851 ret->magic = XML_SAX_PLUG_MAGIC;
28854 ret->user_sax_ptr =
sax;
28855 ret->user_sax = old_sax;
28856 if (old_sax ==
NULL) {
28860 ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
28861 ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
28866 ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
28867 ret->schemas_sax.characters = xmlSchemaSAXHandleText;
28869 ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
28870 ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
28872 ret->user_data = ctxt;
28881 ret->schemas_sax.internalSubset = internalSubsetSplit;
28883 ret->schemas_sax.isStandalone = isStandaloneSplit;
28885 ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
28887 ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
28889 ret->schemas_sax.resolveEntity = resolveEntitySplit;
28891 ret->schemas_sax.getEntity = getEntitySplit;
28893 ret->schemas_sax.entityDecl = entityDeclSplit;
28895 ret->schemas_sax.notationDecl = notationDeclSplit;
28897 ret->schemas_sax.attributeDecl = attributeDeclSplit;
28899 ret->schemas_sax.elementDecl = elementDeclSplit;
28901 ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
28903 ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
28905 ret->schemas_sax.startDocument = startDocumentSplit;
28907 ret->schemas_sax.endDocument = endDocumentSplit;
28909 ret->schemas_sax.processingInstruction = processingInstructionSplit;
28911 ret->schemas_sax.comment = commentSplit;
28913 ret->schemas_sax.warning = warningSplit;
28915 ret->schemas_sax.error = errorSplit;
28917 ret->schemas_sax.fatalError = fatalErrorSplit;
28919 ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
28921 ret->schemas_sax.externalSubset = externalSubsetSplit;
28929 ret->schemas_sax.characters = charactersSplit;
28932 ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
28934 ret->schemas_sax.ignorableWhitespace = charactersSplit;
28935 ret->schemas_sax.cdataBlock = cdataBlockSplit;
28936 ret->schemas_sax.reference = referenceSplit;
28937 ret->schemas_sax.startElementNs = startElementNsSplit;
28938 ret->schemas_sax.endElementNs = endElementNsSplit;
28940 ret->user_data_ptr = user_data;
28941 ret->user_data = *user_data;
28948 *
sax = &(
ret->schemas_sax);
28950 ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28951 xmlSchemaPreRun(ctxt);
28965xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
28970 if ((plug ==
NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
28974 xmlSchemaPostRun(plug->ctxt);
28976 sax = plug->user_sax_ptr;
28977 *
sax = plug->user_sax;
28978 if (plug->user_sax !=
NULL) {
28979 user_data = plug->user_data_ptr;
28980 *user_data = plug->user_data;
29001xmlSchemaValidateSetLocator(xmlSchemaValidCtxtPtr vctxt,
29002 xmlSchemaValidityLocatorFunc
f,
29005 if (vctxt ==
NULL)
return;
29006 vctxt->locFunc =
f;
29007 vctxt->locCtxt = ctxt;
29022xmlSchemaValidateStreamLocator(
void *
ctx,
const char **
file,
29023 unsigned long *
line) {
29061xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
29065 xmlSchemaSAXPlugPtr plug =
NULL;
29080 old_sax = pctxt->
sax;
29088 xmlSchemaValidateSetLocator(ctxt, xmlSchemaValidateStreamLocator, pctxt);
29091 if (inputStream ==
NULL) {
29096 ctxt->parserCtxt = pctxt;
29102 plug = xmlSchemaSAXPlug(ctxt, &(pctxt->
sax), &(pctxt->
userData));
29103 if (plug ==
NULL) {
29107 ctxt->input =
input;
29109 ctxt->sax = pctxt->
sax;
29110 ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
29111 ret = xmlSchemaVStart(ctxt);
29113 if ((
ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
29114 ret = ctxt->parserCtxt->errNo;
29120 ctxt->parserCtxt =
NULL;
29122 ctxt->input =
NULL;
29123 if (plug !=
NULL) {
29124 xmlSchemaSAXUnplug(plug);
29127 if (pctxt !=
NULL) {
29128 pctxt->
sax = old_sax;
29147xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
29176xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
29180 return (ctxt->parserCtxt);
XMLPUBFUN int XMLCALL xmlSAX2GetLineNumber(void *ctx)
char * strchr(const char *String, int ch)
struct outqueuenode * head
static void normalize(float vec[3])
static NTSTATUS create_key(HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES *attr)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
static struct netconfig_info ni
GLint GLint GLsizei GLsizei GLsizei depth
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLboolean GLenum GLenum GLvoid * values
GLuint GLsizei GLsizei * length
GLuint GLsizei const GLvoid GLenum preserve
GLenum GLenum GLenum input
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define location(file, line)
XMLPUBFUN xmlChar *XMLCALL xmlEscapeFormatString(xmlChar **msg)
#define memcpy(s1, s2, n)
static short search(int val, const short *table, int size)
XMLPUBFUN int XMLCALL inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
#define NORMALIZE(x, addr)
static int sum(int x_, int y_)
static unsigned __int64 next
XMLPUBFUN const xmlChar *XMLCALL xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len)
XMLPUBFUN xmlDictPtr XMLCALL xmlDictCreate(void)
XMLPUBFUN void XMLCALL xmlDictFree(xmlDictPtr dict)
XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict)
XMLPUBVAR xmlMallocFunc xmlMallocAtomic
XMLPUBVAR xmlMallocFunc xmlMalloc
XMLPUBVAR xmlFreeFunc xmlFree
XMLPUBVAR void * xmlGenericErrorContext
XMLPUBVAR xmlReallocFunc xmlRealloc
XMLPUBVAR xmlGenericErrorFunc xmlGenericError
XMLPUBFUN int XMLCALL xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata)
XMLPUBFUN void XMLCALL xmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f)
XMLPUBFUN void *XMLCALL xmlHashLookup(xmlHashTablePtr table, const xmlChar *name)
XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreate(int size)
XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreateDict(int size, xmlDictPtr dict)
XMLPUBFUN void XMLCALL xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data)
XMLPUBFUN int XMLCALL xmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata)
XMLPUBFUN void *XMLCALL xmlHashLookup2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2)
XMLPUBFUN void XMLCALL xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data)
XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc)
XMLPUBFUN void XMLCALL xmlStopParser(xmlParserCtxtPtr ctxt)
XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size, const char *URL, const char *encoding, int options)
XMLPUBFUN int XMLCALL xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options)
XMLPUBFUN void XMLCALL xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
XMLPUBFUN int XMLCALL xmlParseDocument(xmlParserCtxtPtr ctxt)
XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadFile(xmlParserCtxtPtr ctxt, const char *filename, const char *encoding, int options)
XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlNewParserCtxt(void)
XMLPUBFUN xmlNodePtr XMLCALL xmlAddChild(xmlNodePtr parent, xmlNodePtr cur)
XMLPUBFUN xmlChar *XMLCALL xmlNodeGetContent(const xmlNode *cur)
XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement(const xmlDoc *doc)
XMLPUBFUN void XMLCALL xmlFreeDoc(xmlDocPtr cur)
XMLPUBFUN xmlAttrPtr XMLCALL xmlHasProp(const xmlNode *node, const xmlChar *name)
XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNs(xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace)
XMLPUBFUN int XMLCALL xmlNodeGetSpacePreserve(const xmlNode *cur)
XMLPUBFUN xmlChar *XMLCALL xmlGetNoNsProp(const xmlNode *node, const xmlChar *name)
XMLPUBFUN void XMLCALL xmlUnlinkNode(xmlNodePtr cur)
XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node, const xmlChar *href)
XMLPUBFUN xmlChar *XMLCALL xmlNodeGetBase(const xmlDoc *doc, const xmlNode *cur)
xmlParserCtxt * xmlParserCtxtPtr
#define XML_XML_NAMESPACE
XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocText(const xmlDoc *doc, const xmlChar *content)
XMLPUBFUN long XMLCALL xmlGetLineNo(const xmlNode *node)
XMLPUBFUN void XMLCALL xmlFreeNode(xmlNodePtr cur)
XMLPUBFUN const xmlChar *XMLCALL xmlSplitQName3(const xmlChar *name, int *len)
XMLPUBFUN xmlNsPtr XMLCALL xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix)
XMLPUBFUN xmlChar *XMLCALL xmlSplitQName2(const xmlChar *name, xmlChar **prefix)
XMLPUBFUN xmlAttrPtr XMLCALL xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value)
XMLPUBFUN xmlChar *XMLCALL xmlNodeListGetString(xmlDocPtr doc, const xmlNode *list, int inLine)
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
struct _xmlDictEntry * dict
struct _xmlSAXHandler * sax
unparsedEntityDeclSAXFunc unparsedEntityDecl
hasExternalSubsetSAXFunc hasExternalSubset
setDocumentLocatorSAXFunc setDocumentLocator
getEntitySAXFunc getEntity
attributeDeclSAXFunc attributeDecl
startElementNsSAX2Func startElementNs
externalSubsetSAXFunc externalSubset
internalSubsetSAXFunc internalSubset
endElementSAXFunc endElement
isStandaloneSAXFunc isStandalone
endDocumentSAXFunc endDocument
fatalErrorSAXFunc fatalError
hasInternalSubsetSAXFunc hasInternalSubset
notationDeclSAXFunc notationDecl
resolveEntitySAXFunc resolveEntity
getParameterEntitySAXFunc getParameterEntity
endElementNsSAX2Func endElementNs
startElementSAXFunc startElement
entityDeclSAXFunc entityDecl
processingInstructionSAXFunc processingInstruction
charactersSAXFunc characters
startDocumentSAXFunc startDocument
elementDeclSAXFunc elementDecl
ignorableWhitespaceSAXFunc ignorableWhitespace
Character const *const prefix
XMLPUBFUN xmlChar *XMLCALL xmlBuildURI(const xmlChar *URI, const xmlChar *base)
XMLPUBFUN xmlIDPtr XMLCALL xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr)
XMLPUBFUN void XMLCALL xmlFreeEnumeration(xmlEnumerationPtr cur)
static HRESULT return_null(VARIANT *res)
static struct wctab tab[]
XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc)
void(XMLCDECL * xmlGenericErrorFunc)(void *ctx, const char *msg,...) LIBXML_ATTR_FORMAT(2
XMLPUBFUN xmlErrorPtr XMLCALL xmlGetLastError(void)
void(XMLCDECL *) typedef void(XMLCALL * xmlStructuredErrorFunc)(void *userData, xmlErrorPtr error)
@ XML_SCHEMAV_CVC_WILDCARD
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_4
@ XML_SCHEMAP_SRC_ATTRIBUTE_1
@ XML_SCHEMAP_SRC_ELEMENT_2_1
@ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3
@ XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1
@ XML_SCHEMAV_CVC_ELT_3_2_2
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2
@ XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1
@ XML_SCHEMAP_AU_PROPS_CORRECT
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3
@ XML_SCHEMAV_CVC_TYPE_3_1_1
@ XML_SCHEMAP_SRC_ATTRIBUTE_2
@ XML_SCHEMAP_A_PROPS_CORRECT_3
@ XML_SCHEMAP_NOT_DETERMINISTIC
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2
@ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1
@ XML_SCHEMAP_COS_ST_RESTRICTS_1_2
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2
@ XML_SCHEMAV_CVC_ELT_5_2_2_2_2
@ XML_SCHEMAP_UNKNOWN_FACET_CHILD
@ XML_SCHEMAP_FAILED_LOAD
@ XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4
@ XML_SCHEMAP_S4S_ATTR_MISSING
@ XML_SCHEMAP_COS_ALL_LIMITED
@ XML_SCHEMAP_ATTRFORMDEFAULT_VALUE
@ XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED
@ XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE
@ XML_SCHEMAP_NOTHING_TO_PARSE
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_1
@ XML_SCHEMAV_CVC_ELT_5_2_2_2_1
@ XML_SCHEMAV_CVC_ELT_5_2_2_1
@ XML_SCHEMAP_COS_ST_DERIVED_OK_2_1
@ XML_SCHEMAP_COS_VALID_DEFAULT_2_1
@ XML_SCHEMAP_SRC_RESOLVE
@ XML_SCHEMAV_CVC_ELT_3_2_1
@ XML_SCHEMAP_C_PROPS_CORRECT
@ XML_SCHEMAP_COS_CT_EXTENDS_1_2
@ XML_SCHEMAP_REDEFINED_TYPE
@ XML_SCHEMAP_S4S_ATTR_INVALID_VALUE
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1
@ XML_SCHEMAP_SRC_INCLUDE
@ XML_SCHEMAP_E_PROPS_CORRECT_3
@ XML_SCHEMAP_SRC_IMPORT_1_2
@ XML_SCHEMAP_NOTATION_NO_NAME
@ XML_SCHEMAP_MG_PROPS_CORRECT_2
@ XML_SCHEMAP_COS_CT_EXTENDS_1_3
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1
@ XML_SCHEMAP_SRC_ELEMENT_1
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2
@ XML_SCHEMAP_UNKNOWN_FACET_TYPE
@ XML_SCHEMAP_SRC_ELEMENT_3
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1
@ XML_SCHEMAV_ELEMENT_CONTENT
@ XML_SCHEMAP_SRC_ELEMENT_2_2
@ XML_SCHEMAP_E_PROPS_CORRECT_4
@ XML_SCHEMAP_A_PROPS_CORRECT_2
@ XML_SCHEMAP_FACET_NO_VALUE
@ XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING
@ XML_SCHEMAP_ST_PROPS_CORRECT_3
@ XML_SCHEMAP_COS_CT_EXTENDS_1_1
@ XML_SCHEMAP_INVALID_FACET_VALUE
@ XML_SCHEMAV_CVC_TYPE_3_1_2
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3
@ XML_SCHEMAP_SRC_ATTRIBUTE_4
@ XML_SCHEMAP_SRC_ATTRIBUTE_3_2
@ XML_SCHEMAP_SRC_REDEFINE
@ XML_SCHEMAP_INVALID_ATTR_USE
@ XML_SCHEMAP_ST_PROPS_CORRECT_2
@ XML_SCHEMAV_CVC_ENUMERATION_VALID
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2
@ XML_SCHEMAP_INVALID_BOOLEAN
@ XML_SCHEMAP_UNION_NOT_EXPRESSIBLE
@ XML_SCHEMAP_COS_ST_RESTRICTS_1_1
@ XML_SCHEMAP_ST_PROPS_CORRECT_1
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3
@ XML_SCHEMAV_CVC_ELT_4_3
@ XML_SCHEMAP_P_PROPS_CORRECT_2_2
@ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1
@ XML_SCHEMAP_ELEMFORMDEFAULT_VALUE
@ XML_SCHEMAP_SRC_SIMPLE_TYPE_4
@ XML_SCHEMAP_COS_ST_DERIVED_OK_2_2
@ XML_SCHEMAP_COS_ST_RESTRICTS_3_1
@ XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE
@ XML_SCHEMAV_CVC_ATTRIBUTE_2
@ XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES
@ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1
@ XML_SCHEMAP_SRC_SIMPLE_TYPE_1
@ XML_SCHEMAP_REGEXP_INVALID
@ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2
@ XML_SCHEMAP_WARN_SKIP_SCHEMA
@ XML_SCHEMAP_E_PROPS_CORRECT_6
@ XML_SCHEMAP_AU_PROPS_CORRECT_2
@ XML_SCHEMAV_CVC_ELT_4_2
@ XML_SCHEMAP_P_PROPS_CORRECT_2_1
@ XML_SCHEMAP_AG_PROPS_CORRECT
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2
@ XML_SCHEMAP_S4S_ELEM_MISSING
@ XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER
@ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3
@ XML_SCHEMAV_CVC_PATTERN_VALID
@ XML_SCHEMAV_CVC_ELT_3_1
@ XML_SCHEMAP_SRC_IMPORT_2_1
@ XML_SCHEMAP_E_PROPS_CORRECT_5
@ XML_SCHEMAP_SRC_IMPORT_1_1
@ XML_SCHEMAP_WARN_UNLOCATED_SCHEMA
@ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4
static unsigned int block
XMLPUBFUN xmlChar *XMLCALL xmlStrndup(const xmlChar *cur, int len)
XMLPUBFUN xmlChar *XMLCALL xmlStrcat(xmlChar *cur, const xmlChar *add)
XMLPUBFUN xmlChar *XMLCALL xmlStrncat(xmlChar *cur, const xmlChar *add, int len)
XMLPUBFUN xmlChar *XMLCALL xmlStrdup(const xmlChar *cur)
XMLPUBFUN xmlChar *XMLCALL xmlCharStrdup(const char *cur)
XMLPUBFUN xmlChar *XMLCALL xmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len)
XMLPUBFUN int XMLCALL xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN int XMLCALL xmlStrlen(const xmlChar *str)
#define LIBXML_ATTR_FORMAT(fmt, args)