50#pragma convert("ISO8859-1")
56#ifdef LIBXML_SCHEMAS_ENABLED
72#ifdef LIBXML_PATTERN_ENABLED
75#ifdef LIBXML_READER_ENABLED
86#define ENABLE_REDEFINE
92#define DUMP_CONTENT_MODEL
94#ifdef LIBXML_READER_ENABLED
98#define UNBOUNDED (1 << 30)
100 xmlGenericError(xmlGenericErrorContext, \
101 "Unimplemented block at %s:%d\n", \
104#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
110 "http://www.w3.org/2001/XMLSchema";
113 "http://www.w3.org/2001/XMLSchema-instance";
116 "http://www.w3.org/2000/xmlns/";
121#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
122#define PCTXT_CAST (xmlSchemaParserCtxtPtr)
123#define VCTXT_CAST (xmlSchemaValidCtxtPtr)
124#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
125#define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
126#define WXS_PTC_CAST (xmlSchemaParticlePtr)
127#define WXS_TYPE_CAST (xmlSchemaTypePtr)
128#define WXS_ELEM_CAST (xmlSchemaElementPtr)
129#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
130#define WXS_ATTR_CAST (xmlSchemaAttributePtr)
131#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
132#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
133#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
134#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
135#define WXS_IDC_CAST (xmlSchemaIDCPtr)
136#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
137#define WXS_LIST_CAST (xmlSchemaItemListPtr)
142#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
144#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
148#define WXS_ELEM_TYPEDEF(e) (e)->subtypes
150#define WXS_SUBST_HEAD(item) (item)->refDecl
154#define WXS_ATTR_TYPEDEF(a) (a)->subtypes
158#define WXS_ATTRUSE_DECL(au) (WXS_ATTR_USE_CAST (au))->attrDecl
160#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
162#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
164#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
168#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
169#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
173#define WXS_PARTICLE(p) WXS_PTC_CAST (p)
175#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
177#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
179#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
183#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
187#define WXS_IS_MODEL_GROUP(i) \
188 (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
189 ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
190 ((i)->type == XML_SCHEMA_TYPE_ALL))
192#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
196#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
197 ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
199#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
200 ((t) == XML_SCHEMA_SCHEMA_IMPORT))
202#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
204#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
208#define WXS_IS_ANYTYPE(i) \
209 (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
210 ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
212#define WXS_IS_COMPLEX(i) \
213 (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
214 ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
216#define WXS_IS_SIMPLE(item) \
217 ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
218 ((item->type == XML_SCHEMA_TYPE_BASIC) && \
219 (item->builtInType != XML_SCHEMAS_ANYTYPE)))
221#define WXS_IS_ANY_SIMPLE_TYPE(i) \
222 (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
223 ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
225#define WXS_IS_RESTRICTION(t) \
226 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
228#define WXS_IS_EXTENSION(t) \
229 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
231#define WXS_IS_TYPE_NOT_FIXED(i) \
232 (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
233 (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
235#define WXS_IS_TYPE_NOT_FIXED_1(item) \
236 (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
237 (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
239#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
241#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
245#define WXS_HAS_COMPLEX_CONTENT(item) \
246 ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
247 (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
248 (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
250#define WXS_HAS_SIMPLE_CONTENT(item) \
251 ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
252 (item->contentType == XML_SCHEMA_CONTENT_BASIC))
254#define WXS_HAS_MIXED_CONTENT(item) \
255 (item->contentType == XML_SCHEMA_CONTENT_MIXED)
257#define WXS_EMPTIABLE(t) \
258 (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
260#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
262#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
264#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
268#define WXS_LIST_ITEMTYPE(t) (t)->subtypes
270#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
272#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
274#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
278#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
280#define WXS_HAS_BUCKETS(ctx) \
281( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
282(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
284#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
286#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
288#define WXS_SCHEMA(ctx) (ctx)->schema
290#define WXS_ADD_LOCAL(ctx, item) \
292 if (xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item) < 0) { \
298#define WXS_ADD_GLOBAL(ctx, item) \
300 if (xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item) < 0) { \
306#define WXS_ADD_PENDING(ctx, item) \
307 xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
311#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
315#define IS_SCHEMA(node, type) \
316 ((node != NULL) && (node->ns != NULL) && \
317 (xmlStrEqual(node->name, (const xmlChar *) type)) && \
318 (xmlStrEqual(node->ns->href, xmlSchemaNs)))
320#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
327#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
329#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
331#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
333#define HFAILURE if (res == -1) goto exit_failure;
335#define HERROR if (res != 0) goto exit_error;
337#define HSTOP(ctx) if ((ctx)->stop) goto exit;
341#define SUBSET_RESTRICTION 1<<0
342#define SUBSET_EXTENSION 1<<1
343#define SUBSET_SUBSTITUTION 1<<2
344#define SUBSET_LIST 1<<3
345#define SUBSET_UNION 1<<4
347typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
348typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
350typedef struct _xmlSchemaItemList xmlSchemaItemList;
351typedef xmlSchemaItemList *xmlSchemaItemListPtr;
352struct _xmlSchemaItemList {
358#define XML_SCHEMA_CTXT_PARSER 1
359#define XML_SCHEMA_CTXT_VALIDATOR 2
361typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
362typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
363struct _xmlSchemaAbstractCtxt {
368typedef struct _xmlSchemaBucket xmlSchemaBucket;
369typedef xmlSchemaBucket *xmlSchemaBucketPtr;
371#define XML_SCHEMA_SCHEMA_MAIN 0
372#define XML_SCHEMA_SCHEMA_IMPORT 1
373#define XML_SCHEMA_SCHEMA_INCLUDE 2
374#define XML_SCHEMA_SCHEMA_REDEFINE 3
381typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
382typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
383struct _xmlSchemaSchemaRelation {
384 xmlSchemaSchemaRelationPtr
next;
386 const xmlChar *importNamespace;
387 xmlSchemaBucketPtr bucket;
390#define XML_SCHEMA_BUCKET_MARKED 1<<0
391#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
393struct _xmlSchemaBucket {
397 const xmlChar *origTargetNamespace;
398 const xmlChar *targetNamespace;
400 xmlSchemaSchemaRelationPtr relations;
405 xmlSchemaItemListPtr globals;
406 xmlSchemaItemListPtr locals;
417typedef struct _xmlSchemaImport xmlSchemaImport;
418typedef xmlSchemaImport *xmlSchemaImportPtr;
419struct _xmlSchemaImport {
424 const xmlChar *origTargetNamespace;
429 const xmlChar *targetNamespace;
432 xmlSchemaSchemaRelationPtr relations;
437 xmlSchemaItemListPtr globals;
438 xmlSchemaItemListPtr locals;
446typedef struct _xmlSchemaInclude xmlSchemaInclude;
447typedef xmlSchemaInclude *xmlSchemaIncludePtr;
448struct _xmlSchemaInclude {
452 const xmlChar *origTargetNamespace;
453 const xmlChar *targetNamespace;
455 xmlSchemaSchemaRelationPtr relations;
460 xmlSchemaItemListPtr globals;
461 xmlSchemaItemListPtr locals;
464 xmlSchemaImportPtr ownerImport;
472typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
473typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
474struct _xmlSchemaBasicItem {
475 xmlSchemaTypeType
type;
485typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
486typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
487struct _xmlSchemaAnnotItem {
488 xmlSchemaTypeType
type;
489 xmlSchemaAnnotPtr annot;
498typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
499typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
500struct _xmlSchemaTreeItem {
501 xmlSchemaTypeType
type;
502 xmlSchemaAnnotPtr annot;
503 xmlSchemaTreeItemPtr
next;
504 xmlSchemaTreeItemPtr children;
508#define XML_SCHEMA_ATTR_USE_FIXED 1<<0
515typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
516typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
517struct _xmlSchemaAttributeUse {
518 xmlSchemaTypeType
type;
519 xmlSchemaAnnotPtr annot;
520 xmlSchemaAttributeUsePtr
next;
525 xmlSchemaAttributePtr attrDecl;
531 xmlSchemaValPtr defVal;
540typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
541typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
542struct _xmlSchemaAttributeUseProhib {
543 xmlSchemaTypeType
type;
546 const xmlChar *targetNamespace;
553typedef struct _xmlSchemaRedef xmlSchemaRedef;
554typedef xmlSchemaRedef *xmlSchemaRedefPtr;
555struct _xmlSchemaRedef {
556 xmlSchemaRedefPtr
next;
557 xmlSchemaBasicItemPtr
item;
559 xmlSchemaBasicItemPtr
target;
563 xmlSchemaBucketPtr targetBucket;
569typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
570typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
571struct _xmlSchemaConstructionCtxt {
572 xmlSchemaPtr mainSchema;
573 xmlSchemaBucketPtr mainBucket;
577 xmlSchemaBucketPtr bucket;
578 xmlSchemaItemListPtr pending;
581 xmlSchemaRedefPtr redefs;
582 xmlSchemaRedefPtr lastRedef;
585#define XML_SCHEMAS_PARSE_ERROR 1
586#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
588struct _xmlSchemaParserCtxt {
591 xmlSchemaValidityErrorFunc
error;
592 xmlSchemaValidityWarningFunc
warning;
597 xmlSchemaConstructionCtxtPtr constructor;
617 xmlAutomataStatePtr
start;
618 xmlAutomataStatePtr
end;
619 xmlAutomataStatePtr
state;
622 xmlSchemaTypePtr ctxtType;
624 xmlSchemaValidCtxtPtr vctxt;
629 const xmlChar *targetNamespace;
630 xmlSchemaBucketPtr redefined;
632 xmlSchemaRedefPtr redef;
634 xmlSchemaItemListPtr attrProhibs;
643typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
644typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
645struct _xmlSchemaQNameRef {
646 xmlSchemaTypeType
type;
647 xmlSchemaBasicItemPtr
item;
648 xmlSchemaTypeType itemType;
650 const xmlChar *targetNamespace;
660typedef struct _xmlSchemaParticle xmlSchemaParticle;
661typedef xmlSchemaParticle *xmlSchemaParticlePtr;
662struct _xmlSchemaParticle {
663 xmlSchemaTypeType
type;
664 xmlSchemaAnnotPtr annot;
665 xmlSchemaTreeItemPtr
next;
666 xmlSchemaTreeItemPtr children;
680typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
681typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
682struct _xmlSchemaModelGroup {
683 xmlSchemaTypeType
type;
684 xmlSchemaAnnotPtr annot;
685 xmlSchemaTreeItemPtr
next;
686 xmlSchemaTreeItemPtr children;
690#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
691#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
698typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
699typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
700struct _xmlSchemaModelGroupDef {
701 xmlSchemaTypeType
type;
702 xmlSchemaAnnotPtr annot;
703 xmlSchemaTreeItemPtr
next;
704 xmlSchemaTreeItemPtr children;
706 const xmlChar *targetNamespace;
711typedef struct _xmlSchemaIDC xmlSchemaIDC;
712typedef xmlSchemaIDC *xmlSchemaIDCPtr;
720typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
721typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
722struct _xmlSchemaIDCSelect {
723 xmlSchemaIDCSelectPtr
next;
737struct _xmlSchemaIDC {
738 xmlSchemaTypeType
type;
739 xmlSchemaAnnotPtr annot;
740 xmlSchemaIDCPtr
next;
743 const xmlChar *targetNamespace;
744 xmlSchemaIDCSelectPtr selector;
745 xmlSchemaIDCSelectPtr
fields;
747 xmlSchemaQNameRefPtr
ref;
755typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
756typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
757struct _xmlSchemaIDCAug {
758 xmlSchemaIDCAugPtr
next;
769typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
770typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
771struct _xmlSchemaPSVIIDCKey {
772 xmlSchemaTypePtr
type;
781typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
782typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
783struct _xmlSchemaPSVIIDCNode {
785 xmlSchemaPSVIIDCKeyPtr *
keys;
796typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
797typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
798struct _xmlSchemaPSVIIDCBinding {
799 xmlSchemaPSVIIDCBindingPtr
next;
800 xmlSchemaIDCPtr definition;
801 xmlSchemaPSVIIDCNodePtr *nodeTable;
804 xmlSchemaItemListPtr dupls;
808#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
809#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
811#define XPATH_STATE_OBJ_MATCHES -2
812#define XPATH_STATE_OBJ_BLOCKED -3
814typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
815typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
822typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
823typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
824struct _xmlSchemaIDCStateObj {
826 xmlSchemaIDCStateObjPtr
next;
831 xmlSchemaIDCMatcherPtr matcher;
833 xmlSchemaIDCSelectPtr sel;
844struct _xmlSchemaIDCMatcher {
847 xmlSchemaIDCMatcherPtr
next;
848 xmlSchemaIDCMatcherPtr nextCached;
849 xmlSchemaIDCAugPtr aidc;
851 xmlSchemaPSVIIDCKeyPtr **keySeqs;
854 xmlSchemaItemListPtr targets;
862#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0
863#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
864#define XML_SCHEMA_ELEM_INFO_NILLED 1<<2
865#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3
867#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4
868#define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5
869#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6
871#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7
872#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8
873#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9
874#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10
881struct _xmlSchemaNodeInfo {
889 xmlSchemaTypePtr typeDef;
896 xmlSchemaElementPtr decl;
898 xmlSchemaPSVIIDCBindingPtr idcTable;
900 xmlSchemaIDCMatcherPtr idcMatchers;
902 xmlRegExecCtxtPtr regexCtxt;
912#define XML_SCHEMAS_ATTR_UNKNOWN 1
913#define XML_SCHEMAS_ATTR_ASSESSED 2
914#define XML_SCHEMAS_ATTR_PROHIBITED 3
915#define XML_SCHEMAS_ATTR_ERR_MISSING 4
916#define XML_SCHEMAS_ATTR_INVALID_VALUE 5
917#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
918#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
919#define XML_SCHEMAS_ATTR_DEFAULT 8
920#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
921#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
922#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
923#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
924#define XML_SCHEMAS_ATTR_WILD_SKIP 13
925#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
926#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
927#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
928#define XML_SCHEMAS_ATTR_META 17
932#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
933#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
934#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
935#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
936#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
938typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
939typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
940struct _xmlSchemaAttrInfo {
948 xmlSchemaTypePtr typeDef;
951 xmlSchemaAttributePtr decl;
952 xmlSchemaAttributeUsePtr use;
956 xmlSchemaNodeInfoPtr
parent;
960#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
966struct _xmlSchemaValidCtxt {
969 xmlSchemaValidityErrorFunc
error;
970 xmlSchemaValidityWarningFunc
warning;
975 xmlParserInputBufferPtr
input;
977 xmlSAXHandlerPtr sax;
978 xmlParserCtxtPtr parserCtxt;
989 xmlRegExecCtxtPtr regexp;
990 xmlSchemaValPtr
value;
994 xmlNodePtr validationRoot;
995 xmlSchemaParserCtxtPtr pctxt;
999 xmlSchemaNodeInfoPtr *elemInfos;
1001 xmlSchemaNodeInfoPtr
inode;
1003 xmlSchemaIDCAugPtr aidcs;
1005 xmlSchemaIDCStateObjPtr xpathStates;
1006 xmlSchemaIDCStateObjPtr xpathStatePool;
1007 xmlSchemaIDCMatcherPtr idcMatcherCache;
1009 xmlSchemaPSVIIDCNodePtr *idcNodes;
1013 xmlSchemaPSVIIDCKeyPtr *idcKeys;
1021#ifdef LIBXML_READER_ENABLED
1025 xmlSchemaAttrInfoPtr *attrInfos;
1030 xmlSchemaItemListPtr nodeQNames;
1032 int createIDCNodeTables;
1033 int psviExposeIDCNodeTables;
1036 xmlSchemaValidityLocatorFunc locFunc;
1045typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
1046typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
1047struct _xmlSchemaSubstGroup {
1048 xmlSchemaElementPtr
head;
1049 xmlSchemaItemListPtr members;
1057typedef struct _xmlIDCHashEntry xmlIDCHashEntry;
1058typedef xmlIDCHashEntry *xmlIDCHashEntryPtr;
1059struct _xmlIDCHashEntry {
1060 xmlIDCHashEntryPtr
next;
1070static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
1073static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
1077xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
1078 xmlSchemaAbstractCtxtPtr ctxt);
1080xmlSchemaFacetTypeToString(xmlSchemaTypeType
type);
1082xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1085xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
1086 xmlSchemaParserCtxtPtr ctxt);
1088xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
1089static xmlSchemaWhitespaceValueType
1090xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type);
1091static xmlSchemaTreeItemPtr
1092xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1093 xmlNodePtr
node, xmlSchemaTypeType
type,
1096xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item);
1097static xmlSchemaTypeLinkPtr
1098xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type);
1100xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
1101 const char *funcName,
1104xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
1105 xmlSchemaTypePtr
type,
1106 xmlSchemaTypePtr baseType,
1109xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
1110 xmlSchemaParserCtxtPtr ctxt);
1112xmlSchemaComponentListFree(xmlSchemaItemListPtr
list);
1113static xmlSchemaQNameRefPtr
1114xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
1131xmlSchemaItemTypeToStr(xmlSchemaTypeType
type)
1134 case XML_SCHEMA_TYPE_BASIC:
1135 return(
BAD_CAST "simple type definition");
1136 case XML_SCHEMA_TYPE_SIMPLE:
1137 return(
BAD_CAST "simple type definition");
1138 case XML_SCHEMA_TYPE_COMPLEX:
1139 return(
BAD_CAST "complex type definition");
1140 case XML_SCHEMA_TYPE_ELEMENT:
1141 return(
BAD_CAST "element declaration");
1142 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1144 case XML_SCHEMA_TYPE_ATTRIBUTE:
1145 return(
BAD_CAST "attribute declaration");
1146 case XML_SCHEMA_TYPE_GROUP:
1147 return(
BAD_CAST "model group definition");
1148 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1149 return(
BAD_CAST "attribute group definition");
1150 case XML_SCHEMA_TYPE_NOTATION:
1151 return(
BAD_CAST "notation declaration");
1152 case XML_SCHEMA_TYPE_SEQUENCE:
1153 return(
BAD_CAST "model group (sequence)");
1154 case XML_SCHEMA_TYPE_CHOICE:
1155 return(
BAD_CAST "model group (choice)");
1156 case XML_SCHEMA_TYPE_ALL:
1157 return(
BAD_CAST "model group (all)");
1158 case XML_SCHEMA_TYPE_PARTICLE:
1160 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1161 return(
BAD_CAST "unique identity-constraint");
1163 case XML_SCHEMA_TYPE_IDC_KEY:
1164 return(
BAD_CAST "key identity-constraint");
1166 case XML_SCHEMA_TYPE_IDC_KEYREF:
1167 return(
BAD_CAST "keyref identity-constraint");
1169 case XML_SCHEMA_TYPE_ANY:
1171 case XML_SCHEMA_EXTRA_QNAMEREF:
1172 return(
BAD_CAST "[helper component] QName reference");
1173 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
1174 return(
BAD_CAST "[helper component] attribute use prohibition");
1176 return(
BAD_CAST "Not a schema component");
1187xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item)
1190 case XML_SCHEMA_TYPE_BASIC:
1191 if (WXS_IS_COMPLEX(WXS_TYPE_CAST
item))
1192 return(
BAD_CAST "complex type definition");
1194 return(
BAD_CAST "simple type definition");
1196 return(xmlSchemaItemTypeToStr(
item->
type));
1211xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr
item)
1214 case XML_SCHEMA_TYPE_ELEMENT:
1215 return (((xmlSchemaElementPtr)
item)->
node);
1216 case XML_SCHEMA_TYPE_ATTRIBUTE:
1217 return (((xmlSchemaAttributePtr)
item)->
node);
1218 case XML_SCHEMA_TYPE_COMPLEX:
1219 case XML_SCHEMA_TYPE_SIMPLE:
1220 return (((xmlSchemaTypePtr)
item)->
node);
1221 case XML_SCHEMA_TYPE_ANY:
1222 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1223 return (((xmlSchemaWildcardPtr)
item)->
node);
1224 case XML_SCHEMA_TYPE_PARTICLE:
1225 return (((xmlSchemaParticlePtr)
item)->
node);
1226 case XML_SCHEMA_TYPE_SEQUENCE:
1227 case XML_SCHEMA_TYPE_CHOICE:
1228 case XML_SCHEMA_TYPE_ALL:
1229 return (((xmlSchemaModelGroupPtr)
item)->
node);
1230 case XML_SCHEMA_TYPE_GROUP:
1231 return (((xmlSchemaModelGroupDefPtr)
item)->
node);
1232 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1233 return (((xmlSchemaAttributeGroupPtr)
item)->
node);
1234 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1235 case XML_SCHEMA_TYPE_IDC_KEY:
1236 case XML_SCHEMA_TYPE_IDC_KEYREF:
1237 return (((xmlSchemaIDCPtr)
item)->
node);
1238 case XML_SCHEMA_EXTRA_QNAMEREF:
1239 return(((xmlSchemaQNameRefPtr)
item)->
node);
1244 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1245 return (((xmlSchemaAttributeUsePtr)
item)->
node);
1258static xmlSchemaBasicItemPtr
1259xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr
item)
1262 case XML_SCHEMA_TYPE_ELEMENT:
1263 return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr)
item)->
next);
1264 case XML_SCHEMA_TYPE_ATTRIBUTE:
1265 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr)
item)->
next);
1266 case XML_SCHEMA_TYPE_COMPLEX:
1267 case XML_SCHEMA_TYPE_SIMPLE:
1268 return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr)
item)->
next);
1269 case XML_SCHEMA_TYPE_ANY:
1270 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1272 case XML_SCHEMA_TYPE_PARTICLE:
1273 return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr)
item)->
next);
1274 case XML_SCHEMA_TYPE_SEQUENCE:
1275 case XML_SCHEMA_TYPE_CHOICE:
1276 case XML_SCHEMA_TYPE_ALL:
1278 case XML_SCHEMA_TYPE_GROUP:
1280 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1281 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr)
item)->
next);
1282 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1283 case XML_SCHEMA_TYPE_IDC_KEY:
1284 case XML_SCHEMA_TYPE_IDC_KEYREF:
1285 return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr)
item)->
next);
1311 if (namespaceName !=
NULL) {
1316 if (localName !=
NULL) {
1317 if (namespaceName ==
NULL)
1330 return (xmlSchemaFormatQName(
buf,
ns->href, localName));
1332 return (xmlSchemaFormatQName(
buf,
NULL, localName));
1336xmlSchemaGetComponentName(xmlSchemaBasicItemPtr
item)
1342 case XML_SCHEMA_TYPE_ELEMENT:
1343 return (((xmlSchemaElementPtr)
item)->
name);
1344 case XML_SCHEMA_TYPE_ATTRIBUTE:
1345 return (((xmlSchemaAttributePtr)
item)->
name);
1346 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1347 return (((xmlSchemaAttributeGroupPtr)
item)->
name);
1348 case XML_SCHEMA_TYPE_BASIC:
1349 case XML_SCHEMA_TYPE_SIMPLE:
1350 case XML_SCHEMA_TYPE_COMPLEX:
1351 return (((xmlSchemaTypePtr)
item)->
name);
1352 case XML_SCHEMA_TYPE_GROUP:
1353 return (((xmlSchemaModelGroupDefPtr)
item)->
name);
1354 case XML_SCHEMA_TYPE_IDC_KEY:
1355 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1356 case XML_SCHEMA_TYPE_IDC_KEYREF:
1357 return (((xmlSchemaIDCPtr)
item)->
name);
1358 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1359 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1360 return(xmlSchemaGetComponentName(
1361 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1364 case XML_SCHEMA_EXTRA_QNAMEREF:
1365 return (((xmlSchemaQNameRefPtr)
item)->
name);
1366 case XML_SCHEMA_TYPE_NOTATION:
1367 return (((xmlSchemaNotationPtr)
item)->
name);
1377#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
1378#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
1394xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr
item)
1400 case XML_SCHEMA_TYPE_ELEMENT:
1401 return (((xmlSchemaElementPtr)
item)->targetNamespace);
1402 case XML_SCHEMA_TYPE_ATTRIBUTE:
1403 return (((xmlSchemaAttributePtr)
item)->targetNamespace);
1404 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1405 return (((xmlSchemaAttributeGroupPtr)
item)->targetNamespace);
1406 case XML_SCHEMA_TYPE_BASIC:
1407 return (
BAD_CAST "http://www.w3.org/2001/XMLSchema");
1408 case XML_SCHEMA_TYPE_SIMPLE:
1409 case XML_SCHEMA_TYPE_COMPLEX:
1410 return (((xmlSchemaTypePtr)
item)->targetNamespace);
1411 case XML_SCHEMA_TYPE_GROUP:
1412 return (((xmlSchemaModelGroupDefPtr)
item)->targetNamespace);
1413 case XML_SCHEMA_TYPE_IDC_KEY:
1414 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1415 case XML_SCHEMA_TYPE_IDC_KEYREF:
1416 return (((xmlSchemaIDCPtr)
item)->targetNamespace);
1417 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1418 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1419 return(xmlSchemaGetComponentTargetNs(
1420 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1424 case XML_SCHEMA_EXTRA_QNAMEREF:
1425 return (((xmlSchemaQNameRefPtr)
item)->targetNamespace);
1426 case XML_SCHEMA_TYPE_NOTATION:
1427 return (((xmlSchemaNotationPtr)
item)->targetNamespace);
1441 return (xmlSchemaFormatQName(
buf,
1442 xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr)
item),
1443 xmlSchemaGetComponentName((xmlSchemaBasicItemPtr)
item)));
1454 (xmlSchemaBasicItemPtr)
item));
1461xmlSchemaGetIDCDesignation(
xmlChar **
buf, xmlSchemaIDCPtr idc)
1463 return(xmlSchemaGetComponentDesignation(
buf, idc));
1474xmlSchemaWildcardPCToString(
int pc)
1477 case XML_SCHEMAS_ANY_SKIP:
1479 case XML_SCHEMAS_ANY_LAX:
1481 case XML_SCHEMAS_ANY_STRICT:
1484 return (
BAD_CAST "invalid process contents");
1502xmlSchemaGetCanonValueWhtspExt_1(xmlSchemaValPtr
val,
1503 xmlSchemaWhitespaceValueType ws,
1508 xmlSchemaValType valType;
1514 list = xmlSchemaValueGetNext(
val) ? 1 : 0;
1518 valType = xmlSchemaGetValType(
val);
1520 case XML_SCHEMAS_STRING:
1521 case XML_SCHEMAS_NORMSTRING:
1522 case XML_SCHEMAS_ANYSIMPLETYPE:
1523 value = xmlSchemaValueGetAsString(
val);
1525 if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
1526 value2 = xmlSchemaCollapseString(
value);
1527 else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
1528 value2 = xmlSchemaWhiteSpaceReplace(
value);
1534 if (xmlSchemaGetCanonValue(
val, &value2) == -1) {
1537 goto internal_error;
1539 if (for_hash && valType == XML_SCHEMAS_DECIMAL) {
1550 if (
len > 2 && value2[
len-1] ==
'0' && value2[
len-2] ==
'.')
1555 if (*retValue ==
NULL)
1566 FREE_AND_NULL(value2)
1567 val = xmlSchemaValueGetNext(
val);
1572 if (*retValue !=
NULL)
1580xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr
val,
1581 xmlSchemaWhitespaceValueType ws,
1584 return xmlSchemaGetCanonValueWhtspExt_1(
val, ws, retValue, 0);
1588xmlSchemaGetCanonValueHash(xmlSchemaValPtr
val,
1591 return xmlSchemaGetCanonValueWhtspExt_1(
val, XML_SCHEMA_WHITESPACE_COLLAPSE,
1624 xmlSchemaBasicItemPtr
item,
1625 xmlNodePtr itemNode)
1635 if (itemDes !=
NULL) {
1639 case XML_SCHEMA_TYPE_BASIC: {
1640 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1642 if (WXS_IS_ATOMIC(
type))
1644 else if (WXS_IS_LIST(
type))
1646 else if (WXS_IS_UNION(
type))
1654 case XML_SCHEMA_TYPE_SIMPLE: {
1655 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1657 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1662 if (WXS_IS_ATOMIC(
type))
1664 else if (WXS_IS_LIST(
type))
1666 else if (WXS_IS_UNION(
type))
1670 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1677 case XML_SCHEMA_TYPE_COMPLEX: {
1678 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1680 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL)
1685 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1692 case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
1693 xmlSchemaAttributeUsePtr ause;
1695 ause = WXS_ATTR_USE_CAST
item;
1697 if (WXS_ATTRUSE_DECL(ause) !=
NULL) {
1700 xmlSchemaGetComponentQName(&
str, WXS_ATTRUSE_DECL(ause)));
1708 case XML_SCHEMA_TYPE_ATTRIBUTE: {
1709 xmlSchemaAttributePtr
attr;
1711 attr = (xmlSchemaAttributePtr)
item;
1720 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1721 xmlSchemaGetComponentDesignation(
buf,
item);
1723 case XML_SCHEMA_TYPE_ELEMENT: {
1724 xmlSchemaElementPtr
elem;
1730 elem->targetNamespace,
elem->name));
1734 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1735 case XML_SCHEMA_TYPE_IDC_KEY:
1736 case XML_SCHEMA_TYPE_IDC_KEYREF:
1737 if (
item->
type == XML_SCHEMA_TYPE_IDC_UNIQUE)
1739 else if (
item->
type == XML_SCHEMA_TYPE_IDC_KEY)
1746 case XML_SCHEMA_TYPE_ANY:
1747 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1749 ((xmlSchemaWildcardPtr)
item)->processContents));
1752 case XML_SCHEMA_FACET_MININCLUSIVE:
1753 case XML_SCHEMA_FACET_MINEXCLUSIVE:
1754 case XML_SCHEMA_FACET_MAXINCLUSIVE:
1755 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
1756 case XML_SCHEMA_FACET_TOTALDIGITS:
1757 case XML_SCHEMA_FACET_FRACTIONDIGITS:
1758 case XML_SCHEMA_FACET_PATTERN:
1759 case XML_SCHEMA_FACET_ENUMERATION:
1760 case XML_SCHEMA_FACET_WHITESPACE:
1761 case XML_SCHEMA_FACET_LENGTH:
1762 case XML_SCHEMA_FACET_MAXLENGTH:
1763 case XML_SCHEMA_FACET_MINLENGTH:
1768 case XML_SCHEMA_TYPE_GROUP: {
1776 case XML_SCHEMA_TYPE_SEQUENCE:
1777 case XML_SCHEMA_TYPE_CHOICE:
1778 case XML_SCHEMA_TYPE_ALL:
1779 case XML_SCHEMA_TYPE_PARTICLE:
1782 case XML_SCHEMA_TYPE_NOTATION: {
1796 if ((named == 0) && (itemNode !=
NULL)) {
1799 if (itemNode->type == XML_ATTRIBUTE_NODE)
1800 elem = itemNode->parent;
1806 xmlSchemaFormatQName(&
str,
elem->ns->href,
elem->name));
1813 if ((itemNode !=
NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
1815 if (itemNode->ns !=
NULL) {
1817 itemNode->ns->href, itemNode->name));
1838xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
1841 xmlSchemaFacetPtr facet;
1842 xmlSchemaWhitespaceValueType
ws;
1854 ws = xmlSchemaGetWhiteSpaceFacetValue(
type->baseType);
1855 for (facet =
type->facets; facet !=
NULL; facet = facet->
next) {
1856 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
1859 res = xmlSchemaGetCanonValueWhtspExt(facet->val,
1862 xmlSchemaInternalErr(actxt,
1863 "xmlSchemaFormatFacetEnumSet",
1864 "compute the canonical lexical representation");
1890 }
while ((
type !=
NULL) && (
type->type != XML_SCHEMA_TYPE_BASIC));
1903xmlSchemaErrMemory(
const char *
msg)
1911xmlSchemaPSimpleErr(
const char *
msg)
1925xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
1946xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int error,
1956 channel = ctxt->error;
1957 data = ctxt->errCtxt;
1958 schannel = ctxt->serror;
1979xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
2008xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int error,
2022 channel = ctxt->error;
2023 data = ctxt->errCtxt;
2024 schannel = ctxt->serror;
2028 (
const char *) strData1, (
const char *) strData2,
2047xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
2059xmlSchemaPSimpleInternalErr(xmlNodePtr
node,
2063 msg, (
const char *)
str);
2066#define WXS_ERROR_TYPE_ERROR 1
2067#define WXS_ERROR_TYPE_WARNING 2
2084xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
2095 if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2096 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
2102 channel = vctxt->error;
2104 channel = vctxt->warning;
2106 schannel = vctxt->serror;
2107 data = vctxt->errCtxt;
2115 (vctxt->depth >= 0) &&
2116 (vctxt->inode !=
NULL)) {
2117 node = vctxt->inode->node;
2123 (vctxt->parserCtxt !=
NULL) &&
2124 (vctxt->parserCtxt->input !=
NULL)) {
2125 file = vctxt->parserCtxt->input->filename;
2126 if (vctxt->inode !=
NULL) {
2127 line = vctxt->inode->nodeLine;
2131 line = vctxt->parserCtxt->input->line;
2132 col = vctxt->parserCtxt->input->col;
2144 if (vctxt->doc !=
NULL)
2145 file = (
const char *) vctxt->doc->URL;
2146 else if ((vctxt->parserCtxt !=
NULL) &&
2147 (vctxt->parserCtxt->input !=
NULL))
2148 file = vctxt->parserCtxt->input->filename;
2150 if (vctxt->locFunc !=
NULL) {
2154 vctxt->locFunc(vctxt->locCtxt, &
f, &
l);
2162 file = vctxt->filename;
2167 (
const char *)
str1, (
const char *)
str2,
2168 (
const char *) str3, 0, col,
msg,
str1,
str2, str3, str4);
2170 }
else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
2171 xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
2175 channel = pctxt->error;
2177 channel = pctxt->warning;
2179 schannel = pctxt->serror;
2180 data = pctxt->errCtxt;
2183 errorLevel,
NULL, 0,
2184 (
const char *)
str1, (
const char *)
str2,
2185 (
const char *) str3, 0, 0,
msg,
str1,
str2, str3, str4);
2205xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
2214xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
2224xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
2233 xmlSchemaAbstractCtxtPtr actxt,
2240 (
node->type != XML_ELEMENT_NODE) &&
2241 (
node->type != XML_ATTRIBUTE_NODE))
2255 if (
node->type == XML_ATTRIBUTE_NODE) {
2279 }
else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2280 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
2284 if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
2285 xmlSchemaNodeInfoPtr ielem =
2286 vctxt->elemInfos[vctxt->depth];
2290 ielem->nsName, ielem->localName));
2298 vctxt->inode->nsName, vctxt->inode->localName));
2301 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
2335xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
2336 const char *funcName,
2349 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
2352 else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
2360xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
2361 const char *funcName,
2369xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
2370 const char *funcName,
2375 xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName,
message,
2381xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
2384 xmlSchemaBasicItemPtr
item,
2392 (actxt->type == XML_SCHEMA_CTXT_PARSER)) {
2397 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2406xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
2409 xmlSchemaBasicItemPtr
item,
2421xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
2432 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2446xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
2448 xmlSchemaPSVIIDCNodePtr idcNode,
2461 xmlSchemaFormatQName(&qname,
2462 vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
2463 vctxt->nodeQNames->items[idcNode->nodeQNameID]),
2465 FREE_AND_NULL(qname);
2470xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
2474 return (
node->type);
2475 if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
2476 (((xmlSchemaValidCtxtPtr) actxt)->inode !=
NULL))
2477 return ( ((xmlSchemaValidCtxtPtr) actxt)->
inode->nodeType);
2482xmlSchemaIsGlobalItem(xmlSchemaTypePtr
item)
2485 case XML_SCHEMA_TYPE_COMPLEX:
2486 case XML_SCHEMA_TYPE_SIMPLE:
2487 if (
item->flags & XML_SCHEMAS_TYPE_GLOBAL)
2490 case XML_SCHEMA_TYPE_GROUP:
2492 case XML_SCHEMA_TYPE_ELEMENT:
2493 if ( ((xmlSchemaElementPtr)
item)->
flags &
2494 XML_SCHEMAS_ELEM_GLOBAL)
2497 case XML_SCHEMA_TYPE_ATTRIBUTE:
2498 if ( ((xmlSchemaAttributePtr)
item)->
flags &
2499 XML_SCHEMAS_ATTR_GLOBAL)
2510xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2514 xmlSchemaTypePtr
type,
2519 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2521 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2522 XML_ATTRIBUTE_NODE))
2528 if (! xmlSchemaIsGlobalItem(
type))
2533 if (WXS_IS_ATOMIC(
type))
2535 else if (WXS_IS_LIST(
type))
2537 else if (WXS_IS_UNION(
type))
2540 if (xmlSchemaIsGlobalItem(
type)) {
2543 if (
type->builtInType != 0) {
2547 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
2556 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2557 XML_ATTRIBUTE_NODE))
2566 xmlSchemaNodeInfoPtr
ni,
2571 return (xmlSchemaFormatQName(
str,
node->ns->href,
node->name));
2573 return (xmlSchemaFormatQName(
str,
NULL,
node->name));
2575 return (xmlSchemaFormatQName(
str,
ni->nsName,
ni->localName));
2580xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
2582 xmlSchemaAttrInfoPtr
ni,
2587 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2590 xmlSchemaFormatErrorNodeQName(&
str, (xmlSchemaNodeInfoPtr)
ni,
node),
2597xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2611 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2619 if (nbval + nbneg > 0) {
2620 if (nbval + nbneg > 1) {
2626 for (
i = 0;
i < nbval + nbneg;
i++) {
2630 if ((
cur[0] ==
'n') && (
cur[1] ==
'o') && (
cur[2] ==
't') &&
2645 while ((*
end != 0) && (*
end !=
'|'))
2655 if ((nbneg == 0) || (*
end !=
'*') || (*localName !=
'*')) {
2675 FREE_AND_NULL(nsName)
2677 FREE_AND_NULL(localName);
2682 FREE_AND_NULL(localName);
2684 if (
i < nbval + nbneg -1)
2697xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
2702 xmlSchemaTypePtr
type,
2703 xmlSchemaFacetPtr facet,
2709 xmlSchemaTypeType facetType;
2710 int nodeType = xmlSchemaEvalErrorNodeType(actxt,
node);
2712 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2714 facetType = XML_SCHEMA_FACET_ENUMERATION;
2720 facetType = facet->type;
2729 if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
2730 (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
2731 (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
2733 char len[25], actLen[25];
2738 if (nodeType == XML_ATTRIBUTE_NODE)
2743 snprintf(
len, 24,
"%lu", xmlSchemaGetFacetValueAsULong(facet));
2746 if (facetType == XML_SCHEMA_FACET_LENGTH)
2748 BAD_CAST "this differs from the allowed length of '%s'.\n");
2749 else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
2751 BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
2752 else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
2754 BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
2756 if (nodeType == XML_ATTRIBUTE_NODE)
2763 }
else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
2765 "of the set {%s}.\n");
2767 xmlSchemaFormatFacetEnumSet(actxt, &
str,
type));
2768 }
else if (facetType == XML_SCHEMA_FACET_PATTERN) {
2770 "by the pattern '%s'.\n");
2773 }
else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
2775 "minimum value allowed ('%s').\n");
2778 }
else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
2780 "maximum value allowed ('%s').\n");
2783 }
else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
2788 }
else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
2793 }
else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
2795 "digits than are allowed ('%s').\n");
2798 }
else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
2800 "digits than are allowed ('%s').\n");
2803 }
else if (nodeType == XML_ATTRIBUTE_NODE) {
2819#define VERROR(err, type, msg) \
2820 xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
2822#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
2824#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
2825#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
2827#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
2841xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
2843 xmlSchemaBasicItemPtr ownerItem,
2844 xmlNodePtr ownerElem,
2850 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2855 xmlSchemaPErr(ctxt, ownerElem,
error,
2856 "%s: The attribute '%s' is required but missing.\n",
2877xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
2879 xmlSchemaBasicItemPtr ownerItem,
2880 xmlNodePtr ownerElem,
2884 xmlSchemaTypeType refType,
2885 const char *refTypeStr)
2889 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2890 if (refTypeStr ==
NULL)
2891 refTypeStr = (
const char *) xmlSchemaItemTypeToStr(refType);
2892 xmlSchemaPErrExt(ctxt, ownerElem,
error,
2894 "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
2896 xmlSchemaFormatQName(&
strA, refURI, refName),
2913xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
2916 xmlSchemaBasicItemPtr ownerItem,
2922 if (ownerDes ==
NULL)
2923 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem,
attr->parent);
2924 else if (*ownerDes ==
NULL) {
2925 xmlSchemaFormatItemForReport(ownerDes,
NULL, ownerItem,
attr->parent);
2931 "%s, attribute '%s': %s.\n",
2936 "%s, attribute '%s': %s.\n",
2939 if (ownerDes ==
NULL)
2953xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
2960 xmlSchemaFormatNodeForError(&
strA, ACTXT_CAST ctxt,
attr->parent);
2961 xmlSchemaErr4(ACTXT_CAST ctxt,
error, (xmlNodePtr)
attr,
2962 "%sThe attribute '%s' is not allowed.\n",
BAD_CAST strA,
2965 FREE_AND_NULL(
strA);
2966 FREE_AND_NULL(strB);
2984xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
2986 xmlSchemaBasicItemPtr
item,
2987 xmlNodePtr itemElem,
2995 xmlSchemaFormatItemForReport(&
des,
NULL,
item, itemElem);
3000 itemElem = WXS_ITEM_NODE(
item);
3020xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
3022 xmlSchemaBasicItemPtr
item,
3023 xmlNodePtr itemElem,
3045xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
3048 xmlSchemaBasicItemPtr ownerItem,
3049 const xmlSchemaAttributeUsePtr attruse,
3056 xmlSchemaFormatItemForReport(&
msg,
NULL, ownerItem,
NULL);
3060 WXS_BASIC_CAST attruse,
NULL));
3065 xmlSchemaErr4(ACTXT_CAST ctxt,
error,
node,
3081xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
3083 xmlSchemaTypePtr
type,
3084 xmlSchemaTypePtr baseType,
3085 xmlSchemaFacetPtr facet)
3089 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
type->node);
3091 "%s: The facet '%s' is not allowed on types derived from the "
3093 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
3094 xmlSchemaFormatItemForReport(&strT,
NULL, WXS_BASIC_CAST baseType,
NULL),
3097 FREE_AND_NULL(strT);
3111xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
3113 xmlSchemaTypePtr
type,
3114 xmlSchemaFacetPtr facet)
3118 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
3121 "%s: The facet '%s' is not allowed.\n",
3122 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
3137xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
3139 xmlSchemaBasicItemPtr ownerItem,
3146 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST ownerItem,
attr->parent);
3148 "%s: The attributes '%s' and '%s' are mutually exclusive.\n",
3166xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
3170 xmlSchemaTypePtr
type,
3179 xmlSchemaFormatNodeForError(&
msg, ACTXT_CAST ctxt,
node);
3185 if (
node->type == XML_ATTRIBUTE_NODE)
3190 if (! xmlSchemaIsGlobalItem(
type))
3195 if (WXS_IS_ATOMIC(
type))
3197 else if (WXS_IS_LIST(
type))
3199 else if (WXS_IS_UNION(
type))
3202 if (xmlSchemaIsGlobalItem(
type)) {
3205 if (
type->builtInType != 0) {
3209 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
3218 if (
node->type == XML_ATTRIBUTE_NODE)
3228 FREE_AND_NULL(expectedEscaped);
3232 if (
node->type == XML_ATTRIBUTE_NODE)
3259xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
3261 xmlSchemaBasicItemPtr ownerItem,
3262 xmlNodePtr ownerElem,
3269 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
3271 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3276 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3277 "%s: The content is not valid. Expected is %s.\n",
3280 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3281 "%s: The content is not valid.\n",
3319xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
3325 xmlSchemaPErrMemory(ctxt,
"allocating schema",
NULL);
3329 ret->dict = ctxt->dict;
3343xmlSchemaNewFacet(
void)
3345 xmlSchemaFacetPtr
ret;
3347 ret = (xmlSchemaFacetPtr)
xmlMalloc(
sizeof(xmlSchemaFacet));
3365static xmlSchemaAnnotPtr
3366xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node)
3368 xmlSchemaAnnotPtr
ret;
3370 ret = (xmlSchemaAnnotPtr)
xmlMalloc(
sizeof(xmlSchemaAnnot));
3372 xmlSchemaPErrMemory(ctxt,
"allocating annotation",
node);
3380static xmlSchemaItemListPtr
3381xmlSchemaItemListCreate(
void)
3383 xmlSchemaItemListPtr
ret;
3387 xmlSchemaPErrMemory(
NULL,
3388 "allocating an item list structure",
NULL);
3391 memset(
ret, 0,
sizeof(xmlSchemaItemList));
3396xmlSchemaItemListClear(xmlSchemaItemListPtr
list)
3403 list->sizeItems = 0;
3407xmlSchemaItemListAdd(xmlSchemaItemListPtr
list,
void *
item)
3409 if (
list->sizeItems <=
list->nbItems) {
3411 size_t newSize =
list->sizeItems == 0 ? 20 :
list->sizeItems * 2;
3413 tmp = (
void **)
xmlRealloc(
list->items, newSize *
sizeof(
void *));
3415 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3419 list->sizeItems = newSize;
3426xmlSchemaItemListAddSize(xmlSchemaItemListPtr
list,
3431 if (initialSize <= 0)
3434 initialSize *
sizeof(
void *));
3436 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3439 list->sizeItems = initialSize;
3440 }
else if (
list->sizeItems <=
list->nbItems) {
3443 list->sizeItems *= 2;
3445 list->sizeItems *
sizeof(
void *));
3447 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3448 list->sizeItems /= 2;
3458xmlSchemaItemListInsert(xmlSchemaItemListPtr
list,
void *
item,
int idx)
3460 if (
list->sizeItems <=
list->nbItems) {
3462 size_t newSize =
list->sizeItems == 0 ? 20 :
list->sizeItems * 2;
3464 tmp = (
void **)
xmlRealloc(
list->items, newSize *
sizeof(
void *));
3466 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3470 list->sizeItems = newSize;
3489xmlSchemaItemListInsertSize(xmlSchemaItemListPtr
list,
3495 if (initialSize <= 0)
3498 initialSize *
sizeof(
void *));
3500 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3503 list->sizeItems = initialSize;
3504 }
else if (
list->sizeItems <=
list->nbItems) {
3505 list->sizeItems *= 2;
3507 list->sizeItems *
sizeof(
void *));
3509 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3510 list->sizeItems = 0;
3531xmlSchemaItemListRemove(xmlSchemaItemListPtr
list,
int idx)
3535 xmlSchemaPSimpleErr(
"Internal error: xmlSchemaItemListRemove, "
3540 if (
list->nbItems == 1) {
3545 list->sizeItems = 0;
3546 }
else if (
list->nbItems -1 ==
idx) {
3563xmlSchemaItemListFree(xmlSchemaItemListPtr
list)
3573xmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
3577 if (bucket->globals !=
NULL) {
3578 xmlSchemaComponentListFree(bucket->globals);
3579 xmlSchemaItemListFree(bucket->globals);
3581 if (bucket->locals !=
NULL) {
3582 xmlSchemaComponentListFree(bucket->locals);
3583 xmlSchemaItemListFree(bucket->locals);
3585 if (bucket->relations !=
NULL) {
3586 xmlSchemaSchemaRelationPtr prev,
cur = bucket->relations;
3593 if ((! bucket->preserveDoc) && (bucket->doc !=
NULL)) {
3594 xmlFreeDoc(bucket->doc);
3596 if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
3598 xmlSchemaFree(WXS_IMPBUCKET(bucket)->
schema);
3606 xmlSchemaBucketFree((xmlSchemaBucketPtr) bucket);
3609static xmlSchemaBucketPtr
3610xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
3613 xmlSchemaBucketPtr
ret;
3615 xmlSchemaPtr mainSchema;
3617 if (WXS_CONSTRUCTOR(pctxt)->mainSchema ==
NULL) {
3618 PERROR_INT(
"xmlSchemaBucketCreate",
3619 "no main schema on constructor");
3622 mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
3624 if (WXS_IS_BUCKET_INCREDEF(
type))
3625 size =
sizeof(xmlSchemaInclude);
3627 size =
sizeof(xmlSchemaImport);
3630 xmlSchemaPErrMemory(
NULL,
"allocating schema bucket",
NULL);
3634 ret->targetNamespace = targetNamespace;
3636 ret->globals = xmlSchemaItemListCreate();
3638 xmlSchemaBucketFree(
ret);
3641 ret->locals = xmlSchemaItemListCreate();
3643 xmlSchemaBucketFree(
ret);
3653 if (! WXS_HAS_BUCKETS(pctxt)) {
3654 if (WXS_IS_BUCKET_INCREDEF(
type)) {
3655 PERROR_INT(
"xmlSchemaBucketCreate",
3656 "first bucket but it's an include or redefine");
3657 xmlSchemaBucketFree(
ret);
3661 ret->type = XML_SCHEMA_SCHEMA_MAIN;
3663 WXS_CONSTRUCTOR(pctxt)->mainBucket =
ret;
3664 WXS_IMPBUCKET(
ret)->schema = mainSchema;
3668 mainSchema->targetNamespace = targetNamespace;
3670 if (
type == XML_SCHEMA_SCHEMA_MAIN) {
3671 PERROR_INT(
"xmlSchemaBucketCreate",
3672 "main bucket but it's not the first one");
3673 xmlSchemaBucketFree(
ret);
3675 }
else if (
type == XML_SCHEMA_SCHEMA_IMPORT) {
3680 WXS_IMPBUCKET(
ret)->schema = xmlSchemaNewSchema(pctxt);
3682 xmlSchemaBucketFree(
ret);
3685 WXS_IMPBUCKET(
ret)->schema->targetNamespace = targetNamespace;
3688 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
3695 if (mainSchema->schemasImports ==
NULL) {
3697 WXS_CONSTRUCTOR(pctxt)->dict);
3698 if (mainSchema->schemasImports ==
NULL) {
3699 xmlSchemaBucketFree(
ret);
3703 if (targetNamespace ==
NULL)
3705 XML_SCHEMAS_NO_NAMESPACE,
ret);
3708 targetNamespace,
ret);
3710 PERROR_INT(
"xmlSchemaBucketCreate",
3711 "failed to add the schema bucket to the hash");
3712 xmlSchemaBucketFree(
ret);
3717 if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
3718 WXS_INCBUCKET(
ret)->ownerImport =
3719 WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
3721 WXS_INCBUCKET(
ret)->ownerImport =
3722 WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
3725 if (mainSchema->includes ==
NULL) {
3726 mainSchema->includes = xmlSchemaItemListCreate();
3727 if (mainSchema->includes ==
NULL) {
3728 xmlSchemaBucketFree(
ret);
3732 if (xmlSchemaItemListAdd(mainSchema->includes,
ret) < 0) {
3733 xmlSchemaBucketFree(
ret);
3741 if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->
buckets,
ret) == -1)
3747xmlSchemaAddItemSize(xmlSchemaItemListPtr *
list,
int initialSize,
void *
item)
3750 *
list = xmlSchemaItemListCreate();
3754 return(xmlSchemaItemListAddSize(*
list, initialSize,
item));
3764xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
3768 if (annot->next ==
NULL) {
3771 xmlSchemaAnnotPtr prev;
3775 annot = annot->next;
3777 }
while (annot !=
NULL);
3788xmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
3792 if (nota->annot !=
NULL)
3793 xmlSchemaFreeAnnot(nota->annot);
3804xmlSchemaFreeAttribute(xmlSchemaAttributePtr
attr)
3809 xmlSchemaFreeAnnot(
attr->annot);
3811 xmlSchemaFreeValue(
attr->defVal);
3822xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
3826 if (use->annot !=
NULL)
3827 xmlSchemaFreeAnnot(use->annot);
3828 if (use->defVal !=
NULL)
3829 xmlSchemaFreeValue(use->defVal);
3840xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
3854xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr
set)
3856 xmlSchemaWildcardNsPtr
next;
3872xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
3874 if (wildcard ==
NULL)
3876 if (wildcard->annot !=
NULL)
3877 xmlSchemaFreeAnnot(wildcard->annot);
3878 if (wildcard->nsSet !=
NULL)
3879 xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
3880 if (wildcard->negNsSet !=
NULL)
3892xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
3896 if (attrGr->annot !=
NULL)
3897 xmlSchemaFreeAnnot(attrGr->annot);
3898 if (attrGr->attrUses !=
NULL)
3899 xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
3910xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr
item)
3922xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr
link)
3924 xmlSchemaTypeLinkPtr
next;
3934xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
3936 xmlSchemaIDCStateObjPtr
next;
3937 while (sto !=
NULL) {
3939 if (sto->history !=
NULL)
3941 if (sto->xpathCtxt !=
NULL)
3942 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
3955xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
3957 xmlSchemaIDCSelectPtr
cur, prev;
3961 if (idcDef->annot !=
NULL)
3962 xmlSchemaFreeAnnot(idcDef->annot);
3964 if (idcDef->selector !=
NULL) {
3965 if (idcDef->selector->xpathComp !=
NULL)
3966 xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
3970 if (idcDef->fields !=
NULL) {
3971 cur = idcDef->fields;
3975 if (prev->xpathComp !=
NULL)
3976 xmlFreePattern((xmlPatternPtr) prev->xpathComp);
3990xmlSchemaFreeElement(xmlSchemaElementPtr
elem)
3995 xmlSchemaFreeAnnot(
elem->annot);
3997 xmlRegFreeRegexp(
elem->contModel);
3999 xmlSchemaFreeValue(
elem->defVal);
4010xmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
4014 if (facet->val !=
NULL)
4015 xmlSchemaFreeValue(facet->val);
4016 if (facet->regexp !=
NULL)
4017 xmlRegFreeRegexp(facet->regexp);
4018 if (facet->annot !=
NULL)
4019 xmlSchemaFreeAnnot(facet->annot);
4030xmlSchemaFreeType(xmlSchemaTypePtr
type)
4035 xmlSchemaFreeAnnot(
type->annot);
4037 xmlSchemaFacetPtr facet,
next;
4039 facet =
type->facets;
4040 while (facet !=
NULL) {
4042 xmlSchemaFreeFacet(facet);
4047 xmlSchemaItemListFree((xmlSchemaItemListPtr)
type->attrUses);
4049 xmlSchemaFreeTypeLinkList(
type->memberTypes);
4061 xmlRegFreeRegexp(
type->contModel);
4072xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr
item)
4075 xmlSchemaFreeAnnot(
item->annot);
4086xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr
item)
4089 xmlSchemaFreeAnnot(
item->annot);
4094xmlSchemaComponentListFree(xmlSchemaItemListPtr
list)
4099 xmlSchemaTreeItemPtr
item;
4100 xmlSchemaTreeItemPtr *
items = (xmlSchemaTreeItemPtr *)
list->items;
4108 case XML_SCHEMA_TYPE_SIMPLE:
4109 case XML_SCHEMA_TYPE_COMPLEX:
4110 xmlSchemaFreeType((xmlSchemaTypePtr)
item);
4112 case XML_SCHEMA_TYPE_ATTRIBUTE:
4113 xmlSchemaFreeAttribute((xmlSchemaAttributePtr)
item);
4115 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
4116 xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr)
item);
4118 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
4119 xmlSchemaFreeAttributeUseProhib(
4120 (xmlSchemaAttributeUseProhibPtr)
item);
4122 case XML_SCHEMA_TYPE_ELEMENT:
4123 xmlSchemaFreeElement((xmlSchemaElementPtr)
item);
4125 case XML_SCHEMA_TYPE_PARTICLE:
4127 xmlSchemaFreeAnnot(
item->annot);
4130 case XML_SCHEMA_TYPE_SEQUENCE:
4131 case XML_SCHEMA_TYPE_CHOICE:
4132 case XML_SCHEMA_TYPE_ALL:
4133 xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr)
item);
4135 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
4136 xmlSchemaFreeAttributeGroup(
4137 (xmlSchemaAttributeGroupPtr)
item);
4139 case XML_SCHEMA_TYPE_GROUP:
4140 xmlSchemaFreeModelGroupDef(
4141 (xmlSchemaModelGroupDefPtr)
item);
4143 case XML_SCHEMA_TYPE_ANY:
4144 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
4145 xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
item);
4147 case XML_SCHEMA_TYPE_IDC_KEY:
4148 case XML_SCHEMA_TYPE_IDC_UNIQUE:
4149 case XML_SCHEMA_TYPE_IDC_KEYREF:
4150 xmlSchemaFreeIDC((xmlSchemaIDCPtr)
item);
4152 case XML_SCHEMA_TYPE_NOTATION:
4153 xmlSchemaFreeNotation((xmlSchemaNotationPtr)
item);
4155 case XML_SCHEMA_EXTRA_QNAMEREF:
4156 xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr)
item);
4160 xmlSchemaPSimpleInternalErr(
NULL,
4161 "Internal error: xmlSchemaComponentListFree, "
4162 "unexpected component type '%s'\n",
4179xmlSchemaFree(xmlSchemaPtr
schema)
4209 xmlSchemaItemListPtr
list = (xmlSchemaItemListPtr)
schema->includes;
4212 xmlSchemaBucketFree((xmlSchemaBucketPtr)
list->items[
i]);
4214 xmlSchemaItemListFree(
list);
4217 xmlSchemaFreeAnnot(
schema->annot);
4230#ifdef LIBXML_OUTPUT_ENABLED
4233xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output);
4243xmlSchemaElementDump(
void *payload,
void *
data,
4248 xmlSchemaElementPtr
elem = (xmlSchemaElementPtr) payload;
4255 if (
elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
4258 if (
namespace !=
NULL)
4259 fprintf(output,
"ns '%s'",
namespace);
4262 if ((
elem->minOccurs != 1) || (
elem->maxOccurs != 1)) {
4264 if (
elem->maxOccurs >= UNBOUNDED)
4265 fprintf(output,
"max: unbounded\n");
4266 else if (
elem->maxOccurs != 1)
4275 if ((
elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
4276 (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
4277 (
elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
4278 (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
4280 if (
elem->flags & XML_SCHEMAS_ELEM_FIXED)
4282 if (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
4283 fprintf(output,
"[default] ");
4284 if (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
4285 fprintf(output,
"[abstract] ");
4286 if (
elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
4287 fprintf(output,
"[nillable] ");
4304 }
else if (
elem->subtypes !=
NULL) {
4308 xmlSchemaTypeDump(
elem->subtypes, output);
4314 fprintf(output,
" substitutionGroup: '%s' ",
elem->substGroup);
4330xmlSchemaAnnotDump(
FILE * output, xmlSchemaAnnotPtr annot)
4337 content = xmlNodeGetContent(annot->content);
4342 fprintf(output,
" Annot: empty\n");
4354xmlSchemaContentModelDump(xmlSchemaParticlePtr particle,
FILE * output,
int depth)
4357 xmlSchemaTreeItemPtr term;
4361 if (particle ==
NULL)
4363 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
4367 if (particle->children ==
NULL) {
4368 fprintf(output,
"MISSING particle term\n");
4371 term = particle->children;
4375 switch (term->type) {
4376 case XML_SCHEMA_TYPE_ELEMENT:
4377 fprintf(output,
"ELEM '%s'", xmlSchemaFormatQName(&
str,
4378 ((xmlSchemaElementPtr)term)->targetNamespace,
4379 ((xmlSchemaElementPtr)term)->
name));
4382 case XML_SCHEMA_TYPE_SEQUENCE:
4385 case XML_SCHEMA_TYPE_CHOICE:
4388 case XML_SCHEMA_TYPE_ALL:
4391 case XML_SCHEMA_TYPE_ANY:
4399 if (particle->minOccurs != 1)
4400 fprintf(output,
" min: %d", particle->minOccurs);
4401 if (particle->maxOccurs >= UNBOUNDED)
4402 fprintf(output,
" max: unbounded");
4403 else if (particle->maxOccurs != 1)
4404 fprintf(output,
" max: %d", particle->maxOccurs);
4407 ((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
4408 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
4409 (term->type == XML_SCHEMA_TYPE_ALL)) &&
4410 (term->children !=
NULL)) {
4411 xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
4414 if (particle->next !=
NULL)
4415 xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
4427xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses,
FILE * output)
4429 xmlSchemaAttributeUsePtr use;
4430 xmlSchemaAttributeUseProhibPtr prohib;
4431 xmlSchemaQNameRefPtr
ref;
4436 if ((uses ==
NULL) || (uses->nbItems == 0))
4439 fprintf(output,
" attributes:\n");
4440 for (
i = 0;
i < uses->nbItems;
i++) {
4441 use = uses->items[
i];
4442 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
4443 fprintf(output,
" [prohibition] ");
4444 prohib = (xmlSchemaAttributeUseProhibPtr) use;
4446 tns = prohib->targetNamespace;
4447 }
else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
4448 fprintf(output,
" [reference] ");
4449 ref = (xmlSchemaQNameRefPtr) use;
4451 tns =
ref->targetNamespace;
4454 name = WXS_ATTRUSE_DECL_NAME(use);
4455 tns = WXS_ATTRUSE_DECL_TNS(use);
4458 (
const char *) xmlSchemaFormatQName(&
str, tns,
name));
4471xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output)
4474 fprintf(output,
"Type: NULL\n");
4481 fprintf(output,
"(no name) ");
4483 fprintf(output,
"ns '%s' ",
type->targetNamespace);
4484 switch (
type->type) {
4485 case XML_SCHEMA_TYPE_BASIC:
4488 case XML_SCHEMA_TYPE_SIMPLE:
4491 case XML_SCHEMA_TYPE_COMPLEX:
4492 fprintf(output,
"[complex] ");
4494 case XML_SCHEMA_TYPE_SEQUENCE:
4495 fprintf(output,
"[sequence] ");
4497 case XML_SCHEMA_TYPE_CHOICE:
4500 case XML_SCHEMA_TYPE_ALL:
4503 case XML_SCHEMA_TYPE_UR:
4506 case XML_SCHEMA_TYPE_RESTRICTION:
4507 fprintf(output,
"[restriction] ");
4509 case XML_SCHEMA_TYPE_EXTENSION:
4510 fprintf(output,
"[extension] ");
4513 fprintf(output,
"[unknown type %d] ",
type->type);
4517 switch (
type->contentType) {
4518 case XML_SCHEMA_CONTENT_UNKNOWN:
4519 fprintf(output,
"[unknown] ");
4521 case XML_SCHEMA_CONTENT_EMPTY:
4524 case XML_SCHEMA_CONTENT_ELEMENTS:
4525 fprintf(output,
"[element] ");
4527 case XML_SCHEMA_CONTENT_MIXED:
4530 case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
4533 case XML_SCHEMA_CONTENT_BASIC:
4536 case XML_SCHEMA_CONTENT_SIMPLE:
4539 case XML_SCHEMA_CONTENT_ANY:
4552 xmlSchemaAttrUsesDump(
type->attrUses, output);
4554 xmlSchemaAnnotDump(output,
type->annot);
4555#ifdef DUMP_CONTENT_MODEL
4556 if ((
type->type == XML_SCHEMA_TYPE_COMPLEX) &&
4558 xmlSchemaContentModelDump((xmlSchemaParticlePtr)
type->subtypes,
4565xmlSchemaTypeDumpEntry(
void *
type,
void *output,
4568 xmlSchemaTypeDump((xmlSchemaTypePtr)
type, (
FILE *) output);
4579xmlSchemaDump(
FILE * output, xmlSchemaPtr
schema)
4584 fprintf(output,
"Schemas: NULL\n");
4593 fprintf(output,
"%s", (
const char *)
schema->targetNamespace);
4595 fprintf(output,
"no target namespace");
4598 xmlSchemaAnnotDump(output,
schema->annot);
4622xmlSchemaGetPropNode(xmlNodePtr
node,
const char *
name)
4628 prop =
node->properties;
4629 while (prop !=
NULL) {
4649xmlSchemaGetPropNodeNs(xmlNodePtr
node,
const char *
uri,
const char *
name)
4655 prop =
node->properties;
4656 while (prop !=
NULL) {
4657 if ((prop->ns !=
NULL) &&
4667xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node)
4672 val = xmlNodeGetContent(
node);
4678 xmlSchemaPErrMemory(ctxt,
"getting node content",
node);
4683xmlSchemaGetNodeContentNoDict(xmlNodePtr
node)
4699xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
4719#define WXS_FIND_GLOBAL_ITEM(slot) \
4720 if (xmlStrEqual(nsName, schema->targetNamespace)) { \
4721 ret = xmlHashLookup(schema->slot, name); \
4722 if (ret != NULL) goto exit; \
4724 if (xmlHashSize(schema->schemasImports) > 1) { \
4725 xmlSchemaImportPtr import; \
4726 if (nsName == NULL) \
4727 import = xmlHashLookup(schema->schemasImports, \
4728 XML_SCHEMAS_NO_NAMESPACE); \
4730 import = xmlHashLookup(schema->schemasImports, nsName); \
4731 if (import == NULL) \
4733 ret = xmlHashLookup(import->schema->slot, name); \
4746static xmlSchemaElementPtr
4750 xmlSchemaElementPtr
ret =
NULL;
4755 WXS_FIND_GLOBAL_ITEM(elemDecl)
4771static xmlSchemaTypePtr
4781 ret = xmlSchemaGetPredefinedType(
name, nsName);
4792 WXS_FIND_GLOBAL_ITEM(typeDecl)
4809static xmlSchemaAttributePtr
4813 xmlSchemaAttributePtr
ret =
NULL;
4818 WXS_FIND_GLOBAL_ITEM(attrDecl)
4834static xmlSchemaAttributeGroupPtr
4838 xmlSchemaAttributeGroupPtr
ret =
NULL;
4843 WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
4865static xmlSchemaModelGroupDefPtr
4869 xmlSchemaModelGroupDefPtr
ret =
NULL;
4874 WXS_FIND_GLOBAL_ITEM(groupDecl)
4881static xmlSchemaNotationPtr
4882xmlSchemaGetNotation(xmlSchemaPtr
schema,
4886 xmlSchemaNotationPtr
ret =
NULL;
4891 WXS_FIND_GLOBAL_ITEM(notaDecl)
4897static xmlSchemaIDCPtr
4898xmlSchemaGetIDC(xmlSchemaPtr
schema,
4907 WXS_FIND_GLOBAL_ITEM(idcDef)
4923static xmlSchemaBasicItemPtr
4924xmlSchemaGetNamedComponent(xmlSchemaPtr
schema,
4925 xmlSchemaTypeType itemType,
4930 case XML_SCHEMA_TYPE_GROUP:
4931 return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(
schema,
4933 case XML_SCHEMA_TYPE_ELEMENT:
4934 return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(
schema,
4948#define IS_BLANK_NODE(n) \
4949 (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
4971 }
else while ((*
str != 0) && (
len != 0)) {
4981#define WXS_COMP_NAME(c, t) ((t) (c))->name
4982#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
4987static xmlSchemaBasicItemPtr
4988xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
4989 xmlSchemaTypeType
type,
4993 xmlSchemaBasicItemPtr
ret;
4998 if ((bucket->globals ==
NULL) ||
4999 (bucket->globals->nbItems == 0))
5004 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
5005 ret = bucket->globals->items[
i];
5008 case XML_SCHEMA_TYPE_COMPLEX:
5009 case XML_SCHEMA_TYPE_SIMPLE:
5010 if ((WXS_COMP_NAME(
ret, xmlSchemaTypePtr) ==
name) &&
5011 (WXS_COMP_TNS(
ret, xmlSchemaTypePtr) ==
5017 case XML_SCHEMA_TYPE_GROUP:
5018 if ((WXS_COMP_NAME(
ret,
5019 xmlSchemaModelGroupDefPtr) ==
name) &&
5021 xmlSchemaModelGroupDefPtr) == nsName))
5026 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
5027 if ((WXS_COMP_NAME(
ret,
5028 xmlSchemaAttributeGroupPtr) ==
name) &&
5030 xmlSchemaAttributeGroupPtr) == nsName))
5045 if (bucket->relations !=
NULL) {
5046 xmlSchemaSchemaRelationPtr rel = bucket->relations;
5052 bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
5054 if ((rel->bucket !=
NULL) &&
5055 ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
5056 ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
5062 }
while (rel !=
NULL);
5063 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
5079static xmlSchemaNotationPtr
5080xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5084 xmlSchemaNotationPtr
ret =
NULL;
5089 ret = (xmlSchemaNotationPtr)
xmlMalloc(
sizeof(xmlSchemaNotation));
5091 xmlSchemaPErrMemory(ctxt,
"add annotation",
NULL);
5094 memset(
ret, 0,
sizeof(xmlSchemaNotation));
5095 ret->type = XML_SCHEMA_TYPE_NOTATION;
5097 ret->targetNamespace = nsName;
5100 WXS_ADD_GLOBAL(ctxt,
ret);
5116static xmlSchemaAttributePtr
5117xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5119 xmlNodePtr
node,
int topLevel)
5121 xmlSchemaAttributePtr
ret =
NULL;
5126 ret = (xmlSchemaAttributePtr)
xmlMalloc(
sizeof(xmlSchemaAttribute));
5128 xmlSchemaPErrMemory(ctxt,
"allocating attribute",
NULL);
5131 memset(
ret, 0,
sizeof(xmlSchemaAttribute));
5132 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
5135 ret->targetNamespace = nsName;
5138 WXS_ADD_GLOBAL(ctxt,
ret);
5140 WXS_ADD_LOCAL(ctxt,
ret);
5141 WXS_ADD_PENDING(ctxt,
ret);
5157static xmlSchemaAttributeUsePtr
5158xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
5161 xmlSchemaAttributeUsePtr
ret =
NULL;
5166 ret = (xmlSchemaAttributeUsePtr)
xmlMalloc(
sizeof(xmlSchemaAttributeUse));
5168 xmlSchemaPErrMemory(pctxt,
"allocating attribute",
NULL);
5171 memset(
ret, 0,
sizeof(xmlSchemaAttributeUse));
5172 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
5175 WXS_ADD_LOCAL(pctxt,
ret);
5185static xmlSchemaRedefPtr
5186xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
5187 xmlSchemaBucketPtr targetBucket,
5192 xmlSchemaRedefPtr
ret;
5194 ret = (xmlSchemaRedefPtr)
5197 xmlSchemaPErrMemory(pctxt,
5198 "allocating redefinition info",
NULL);
5203 ret->targetBucket = targetBucket;
5204 ret->refName = refName;
5205 ret->refTargetNs = refTargetNs;
5206 if (WXS_CONSTRUCTOR(pctxt)->redefs ==
NULL)
5207 WXS_CONSTRUCTOR(pctxt)->redefs =
ret;
5209 WXS_CONSTRUCTOR(pctxt)->lastRedef->next =
ret;
5210 WXS_CONSTRUCTOR(pctxt)->lastRedef =
ret;
5227static xmlSchemaAttributeGroupPtr
5228xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
5234 xmlSchemaAttributeGroupPtr
ret =
NULL;
5239 ret = (xmlSchemaAttributeGroupPtr)
5240 xmlMalloc(
sizeof(xmlSchemaAttributeGroup));
5242 xmlSchemaPErrMemory(pctxt,
"allocating attribute group",
NULL);
5245 memset(
ret, 0,
sizeof(xmlSchemaAttributeGroup));
5246 ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
5248 ret->targetNamespace = nsName;
5252 ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
5253 if (pctxt->isRedefine) {
5254 pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
5256 if (pctxt->redef ==
NULL) {
5260 pctxt->redefCounter = 0;
5262 WXS_ADD_GLOBAL(pctxt,
ret);
5263 WXS_ADD_PENDING(pctxt,
ret);
5279static xmlSchemaElementPtr
5280xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
5282 xmlNodePtr
node,
int topLevel)
5284 xmlSchemaElementPtr
ret =
NULL;
5289 ret = (xmlSchemaElementPtr)
xmlMalloc(
sizeof(xmlSchemaElement));
5291 xmlSchemaPErrMemory(ctxt,
"allocating element",
NULL);
5294 memset(
ret, 0,
sizeof(xmlSchemaElement));
5295 ret->type = XML_SCHEMA_TYPE_ELEMENT;
5297 ret->targetNamespace = nsName;
5301 WXS_ADD_GLOBAL(ctxt,
ret);
5303 WXS_ADD_LOCAL(ctxt,
ret);
5304 WXS_ADD_PENDING(ctxt,
ret);
5320static xmlSchemaTypePtr
5321xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5322 xmlSchemaTypeType
type,
5324 xmlNodePtr
node,
int topLevel)
5331 ret = (xmlSchemaTypePtr)
xmlMalloc(
sizeof(xmlSchemaType));
5333 xmlSchemaPErrMemory(ctxt,
"allocating type",
NULL);
5339 ret->targetNamespace = nsName;
5342 if (ctxt->isRedefine) {
5343 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5345 if (ctxt->redef ==
NULL) {
5349 ctxt->redefCounter = 0;
5351 WXS_ADD_GLOBAL(ctxt,
ret);
5353 WXS_ADD_LOCAL(ctxt,
ret);
5354 WXS_ADD_PENDING(ctxt,
ret);
5358static xmlSchemaQNameRefPtr
5359xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
5360 xmlSchemaTypeType refType,
5364 xmlSchemaQNameRefPtr
ret;
5366 ret = (xmlSchemaQNameRefPtr)
5369 xmlSchemaPErrMemory(pctxt,
5370 "allocating QName reference item",
NULL);
5374 ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
5375 ret->name = refName;
5376 ret->targetNamespace = refNs;
5378 ret->itemType = refType;
5382 WXS_ADD_LOCAL(pctxt,
ret);
5386static xmlSchemaAttributeUseProhibPtr
5387xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
5389 xmlSchemaAttributeUseProhibPtr
ret;
5391 ret = (xmlSchemaAttributeUseProhibPtr)
5392 xmlMalloc(
sizeof(xmlSchemaAttributeUseProhib));
5394 xmlSchemaPErrMemory(pctxt,
5395 "allocating attribute use prohibition",
NULL);
5398 memset(
ret, 0,
sizeof(xmlSchemaAttributeUseProhib));
5399 ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
5400 WXS_ADD_LOCAL(pctxt,
ret);
5417static xmlSchemaModelGroupPtr
5418xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
5420 xmlSchemaTypeType
type,
5423 xmlSchemaModelGroupPtr
ret =
NULL;
5428 ret = (xmlSchemaModelGroupPtr)
5431 xmlSchemaPErrMemory(ctxt,
"allocating model group component",
5435 memset(
ret, 0,
sizeof(xmlSchemaModelGroup));
5438 WXS_ADD_LOCAL(ctxt,
ret);
5439 if ((
type == XML_SCHEMA_TYPE_SEQUENCE) ||
5440 (
type == XML_SCHEMA_TYPE_CHOICE))
5441 WXS_ADD_PENDING(ctxt,
ret);
5459static xmlSchemaParticlePtr
5460xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
5463 xmlSchemaParticlePtr
ret =
NULL;
5467 ret = (xmlSchemaParticlePtr)
5470 xmlSchemaPErrMemory(ctxt,
"allocating particle component",
5474 ret->type = XML_SCHEMA_TYPE_PARTICLE;
5482 WXS_ADD_LOCAL(ctxt,
ret);
5502static xmlSchemaModelGroupDefPtr
5503xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
5509 xmlSchemaModelGroupDefPtr
ret =
NULL;
5514 ret = (xmlSchemaModelGroupDefPtr)
5515 xmlMalloc(
sizeof(xmlSchemaModelGroupDef));
5517 xmlSchemaPErrMemory(ctxt,
"adding group",
NULL);
5520 memset(
ret, 0,
sizeof(xmlSchemaModelGroupDef));
5522 ret->type = XML_SCHEMA_TYPE_GROUP;
5524 ret->targetNamespace = nsName;
5526 if (ctxt->isRedefine) {
5527 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5529 if (ctxt->redef ==
NULL) {
5533 ctxt->redefCounter = 0;
5535 WXS_ADD_GLOBAL(ctxt,
ret);
5536 WXS_ADD_PENDING(ctxt,
ret);
5548static xmlSchemaWildcardNsPtr
5549xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
5551 xmlSchemaWildcardNsPtr
ret;
5553 ret = (xmlSchemaWildcardNsPtr)
5556 xmlSchemaPErrMemory(ctxt,
"creating wildcard namespace constraint",
NULL);
5564static xmlSchemaIDCPtr
5565xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5574 ret = (xmlSchemaIDCPtr)
xmlMalloc(
sizeof(xmlSchemaIDC));
5576 xmlSchemaPErrMemory(ctxt,
5577 "allocating an identity-constraint definition",
NULL);
5582 ret->targetNamespace = nsName;
5587 WXS_ADD_GLOBAL(ctxt,
ret);
5591 if (
category == XML_SCHEMA_TYPE_IDC_KEYREF)
5592 WXS_ADD_PENDING(ctxt,
ret);
5606static xmlSchemaWildcardPtr
5607xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5608 xmlSchemaTypeType
type, xmlNodePtr
node)
5610 xmlSchemaWildcardPtr
ret =
NULL;
5615 ret = (xmlSchemaWildcardPtr)
xmlMalloc(
sizeof(xmlSchemaWildcard));
5617 xmlSchemaPErrMemory(ctxt,
"adding wildcard",
NULL);
5620 memset(
ret, 0,
sizeof(xmlSchemaWildcard));
5623 WXS_ADD_LOCAL(ctxt,
ret);
5628xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr
group)
5633 xmlSchemaItemListFree(
group->members);
5640 xmlSchemaSubstGroupFree((xmlSchemaSubstGroupPtr)
group);
5643static xmlSchemaSubstGroupPtr
5644xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
5645 xmlSchemaElementPtr
head)
5647 xmlSchemaSubstGroupPtr
ret;
5650 if (WXS_SUBST_GROUPS(pctxt) ==
NULL) {
5652 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5656 ret = (xmlSchemaSubstGroupPtr)
xmlMalloc(
sizeof(xmlSchemaSubstGroup));
5658 xmlSchemaPErrMemory(
NULL,
5659 "allocating a substitution group container",
NULL);
5662 memset(
ret, 0,
sizeof(xmlSchemaSubstGroup));
5665 ret->members = xmlSchemaItemListCreate();
5667 xmlSchemaSubstGroupFree(
ret);
5673 PERROR_INT(
"xmlSchemaSubstGroupAdd",
5674 "failed to add a new substitution container");
5675 xmlSchemaSubstGroupFree(
ret);
5681static xmlSchemaSubstGroupPtr
5682xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
5683 xmlSchemaElementPtr
head)
5685 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5688 head->name,
head->targetNamespace));
5703xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
5704 xmlSchemaElementPtr
head,
5705 xmlSchemaElementPtr
member)
5707 xmlSchemaSubstGroupPtr substGroup =
NULL;
5712 substGroup = xmlSchemaSubstGroupGet(pctxt,
head);
5713 if (substGroup ==
NULL)
5714 substGroup = xmlSchemaSubstGroupAdd(pctxt,
head);
5715 if (substGroup ==
NULL)
5717 if (xmlSchemaItemListAdd(substGroup->members,
member) == -1)
5745xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
5747 xmlSchemaBasicItemPtr ownerItem,
5761 xmlSchemaPSimpleTypeErr(ctxt,
5763 ownerItem, (xmlNodePtr)
attr,
5764 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
5773 if (
ns &&
ns->href &&
ns->href[0])
5775 else if (
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
5782 *
uri = ctxt->targetNamespace;
5793 ns = xmlSearchNs(
attr->doc,
attr->parent, pref);
5795 xmlSchemaPSimpleTypeErr(ctxt,
5797 ownerItem, (xmlNodePtr)
attr,
5798 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
NULL,
value,
5799 "The value '%s' of simple type 'xs:QName' has no "
5800 "corresponding namespace declaration in scope",
value,
NULL);
5825xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
5827 xmlSchemaBasicItemPtr ownerItem,
5834 value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
5835 return (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
5855xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
5857 xmlSchemaBasicItemPtr ownerItem,
5858 xmlNodePtr ownerElem,
5865 attr = xmlSchemaGetPropNode(ownerElem,
name);
5871 return (xmlSchemaPValAttrNodeQName(ctxt,
schema,
5885xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr
attr)
5892 value = xmlSchemaGetNodeContentNoDict((xmlNodePtr)
attr);
5898 if (
attr->atype != XML_ATTRIBUTE_ID) {
5906 strip = xmlSchemaCollapseString(
value);
5907 if (strip !=
NULL) {
5914 xmlSchemaPSimpleTypeErr(ctxt,
5917 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5918 NULL,
NULL,
"Duplicate value '%s' of simple "
5921 attr->atype = XML_ATTRIBUTE_ID;
5923 }
else if (
ret > 0) {
5925 xmlSchemaPSimpleTypeErr(ctxt,
5928 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5929 NULL,
NULL,
"The value '%s' of simple type 'xs:ID' is "
5930 "not a valid 'xs:NCName'",
5940xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
5941 xmlNodePtr ownerElem,
5946 attr = xmlSchemaGetPropNode(ownerElem, (
const char *)
name);
5949 return(xmlSchemaPValAttrNodeID(ctxt,
attr));
5963xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
5970 attr = xmlSchemaGetPropNode(
node,
"maxOccurs");
5973 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
5978 if (
max != UNBOUNDED) {
5979 xmlSchemaPSimpleTypeErr(ctxt,
5993 xmlSchemaPSimpleTypeErr(ctxt,
6000 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6019 xmlSchemaPSimpleTypeErr(ctxt,
6039xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
6046 attr = xmlSchemaGetPropNode(
node,
"minOccurs");
6049 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6056 xmlSchemaPSimpleTypeErr(ctxt,
6063 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6082 xmlSchemaPSimpleTypeErr(ctxt,
6103xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
6104 xmlSchemaBasicItemPtr ownerItem,
6125 xmlSchemaPSimpleTypeErr(ctxt,
6128 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6150xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
6152 const char *
name,
int def)
6173 xmlSchemaPSimpleTypeErr(ctxt,
6176 (xmlNodePtr) xmlSchemaGetPropNode(
node,
name),
6177 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6188static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
6189 ctxt, xmlSchemaPtr
schema,
6192static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
6197static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
6201 xmlSchemaTypeType parentType);
6202static xmlSchemaBasicItemPtr
6203xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
6206 xmlSchemaItemListPtr uses,
6208static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
6211static xmlSchemaWildcardPtr
6212xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
6232xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
6233 xmlSchemaBasicItemPtr ownerItem,
6236 xmlSchemaTypePtr
type)
6247 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6248 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6249 "the given type is not a built-in type");
6252 switch (
type->builtInType) {
6253 case XML_SCHEMAS_NCNAME:
6254 case XML_SCHEMAS_QNAME:
6255 case XML_SCHEMAS_ANYURI:
6256 case XML_SCHEMAS_TOKEN:
6257 case XML_SCHEMAS_LANGUAGE:
6262 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6263 "validation using the given type is not supported while "
6264 "parsing a schema");
6272 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6273 "failed to validate a schema attribute value");
6275 }
else if (
ret > 0) {
6276 if (WXS_IS_LIST(
type))
6280 xmlSchemaPSimpleTypeErr(pctxt,
6281 ret, ownerItem, (xmlNodePtr)
attr,
6304xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
6305 xmlSchemaBasicItemPtr ownerItem,
6307 xmlSchemaTypePtr
type,
6315 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6319 return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem,
attr,
6342xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
6343 xmlSchemaBasicItemPtr ownerItem,
6344 xmlNodePtr ownerElem,
6346 xmlSchemaTypePtr
type,
6356 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6359 xmlSchemaPErr(ctxt, ownerElem,
6361 "Internal error: xmlSchemaPValAttr, the given "
6362 "type '%s' is not a built-in type.\n",
6366 attr = xmlSchemaGetPropNode(ownerElem,
name);
6372 return (xmlSchemaPValAttrNode(ctxt, ownerItem,
attr,
6377xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
6384 if (
xmlStrEqual(pctxt->targetNamespace, namespaceName))
6391 if (WXS_BUCKET(pctxt)->relations !=
NULL) {
6392 xmlSchemaSchemaRelationPtr rel;
6394 rel = WXS_BUCKET(pctxt)->relations;
6396 if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
6400 }
while (rel !=
NULL);
6408 if (namespaceName ==
NULL)
6409 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6411 "References from this schema to components in no "
6412 "namespace are not allowed, since not indicated by an "
6415 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6417 "References from this schema to components in the "
6418 "namespace '%s' are not allowed, since not indicated by an "
6419 "import statement", namespaceName,
NULL);
6435xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6436 xmlNodePtr *
child, xmlSchemaItemListPtr *
list,
6437 int parentType,
int *hasRefs)
6441 while ((IS_SCHEMA((*
child),
"attribute")) ||
6442 (IS_SCHEMA((*
child),
"attributeGroup"))) {
6443 if (IS_SCHEMA((*
child),
"attribute")) {
6454 *
list = xmlSchemaItemListCreate();
6458 if (xmlSchemaItemListAddSize(*
list, 2,
item) == -1)
6461 *
child = (*child)->next;
6478static xmlSchemaAnnotPtr
6479xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int needed)
6481 xmlSchemaAnnotPtr
ret;
6497 ret = xmlSchemaNewAnnot(ctxt,
node);
6507 xmlSchemaPIllegalAttrErr(ctxt,
6518 if (IS_SCHEMA(
child,
"appinfo")) {
6532 xmlSchemaPIllegalAttrErr(ctxt,
6537 xmlSchemaPValAttr(ctxt,
NULL,
child,
"source",
6538 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
6540 }
else if (IS_SCHEMA(
child,
"documentation")) {
6551 xmlSchemaPIllegalAttrErr(ctxt,
6559 xmlSchemaPIllegalAttrErr(ctxt,
6568 attr = xmlSchemaGetPropNodeNs(
child, (
const char *) XML_XML_NAMESPACE,
"lang");
6570 xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
6571 xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE),
NULL);
6575 xmlSchemaPContentErr(ctxt,
6597static xmlSchemaFacetPtr
6598xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6601 xmlSchemaFacetPtr facet;
6608 facet = xmlSchemaNewFacet();
6609 if (facet ==
NULL) {
6610 xmlSchemaPErrMemory(ctxt,
"allocating facet",
node);
6614 value = xmlSchemaGetProp(ctxt,
node,
"value");
6617 "Facet %s has no value\n",
node->name,
NULL);
6618 xmlSchemaFreeFacet(facet);
6621 if (IS_SCHEMA(
node,
"minInclusive")) {
6622 facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
6623 }
else if (IS_SCHEMA(
node,
"minExclusive")) {
6624 facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
6625 }
else if (IS_SCHEMA(
node,
"maxInclusive")) {
6626 facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
6627 }
else if (IS_SCHEMA(
node,
"maxExclusive")) {
6628 facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
6629 }
else if (IS_SCHEMA(
node,
"totalDigits")) {
6630 facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
6631 }
else if (IS_SCHEMA(
node,
"fractionDigits")) {
6632 facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
6633 }
else if (IS_SCHEMA(
node,
"pattern")) {
6634 facet->type = XML_SCHEMA_FACET_PATTERN;
6635 }
else if (IS_SCHEMA(
node,
"enumeration")) {
6636 facet->type = XML_SCHEMA_FACET_ENUMERATION;
6637 }
else if (IS_SCHEMA(
node,
"whiteSpace")) {
6638 facet->type = XML_SCHEMA_FACET_WHITESPACE;
6639 }
else if (IS_SCHEMA(
node,
"length")) {
6640 facet->type = XML_SCHEMA_FACET_LENGTH;
6641 }
else if (IS_SCHEMA(
node,
"maxLength")) {
6642 facet->type = XML_SCHEMA_FACET_MAXLENGTH;
6643 }
else if (IS_SCHEMA(
node,
"minLength")) {
6644 facet->type = XML_SCHEMA_FACET_MINLENGTH;
6647 "Unknown facet type %s\n",
node->name,
NULL);
6648 xmlSchemaFreeFacet(facet);
6652 facet->value =
value;
6653 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
6654 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
6657 fixed = xmlSchemaGetProp(ctxt,
node,
"fixed");
6665 if (IS_SCHEMA(
child,
"annotation")) {
6666 facet->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6671 "Facet %s has unexpected child content\n",
6691xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
6693 xmlSchemaWildcardPtr wildc,
6699 xmlSchemaWildcardNsPtr tmp, lastNs =
NULL;
6702 pc = xmlSchemaGetProp(ctxt,
node,
"processContents");
6705 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6707 wildc->processContents = XML_SCHEMAS_ANY_SKIP;
6709 wildc->processContents = XML_SCHEMAS_ANY_LAX;
6711 xmlSchemaPSimpleTypeErr(ctxt,
6714 NULL,
"(strict | skip | lax)", pc,
6716 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6722 attr = xmlSchemaGetPropNode(
node,
"namespace");
6723 ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6729 wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
6730 if (wildc->negNsSet ==
NULL) {
6733 wildc->negNsSet->value = ctxt->targetNamespace;
6749 xmlSchemaPSimpleTypeErr(ctxt,
6753 "((##any | ##other) | List of (xs:anyURI | "
6754 "(##targetNamespace | ##local)))",
6759 dictnsItem = ctxt->targetNamespace;
6766 xmlSchemaPValAttrNodeValue(ctxt,
NULL,
attr,
6767 nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
6774 while (tmp !=
NULL) {
6775 if (dictnsItem == tmp->value)
6780 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
6785 tmp->value = dictnsItem;
6787 if (wildc->nsSet ==
NULL)
6789 else if (lastNs !=
NULL)
6797 }
while (*
cur != 0);
6803xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
6809 if ((maxOccurs == 0) && ( minOccurs == 0))
6811 if (maxOccurs != UNBOUNDED) {
6821 if (maxOccurs < 1) {
6825 xmlSchemaPCustomAttrErr(ctxt,
6828 xmlSchemaGetPropNode(
node,
"maxOccurs"),
6829 "The value must be greater than or equal to 1");
6831 }
else if (minOccurs > maxOccurs) {
6835 xmlSchemaPCustomAttrErr(ctxt,
6838 xmlSchemaGetPropNode(
node,
"minOccurs"),
6839 "The value must not be greater than the value of 'maxOccurs'");
6859static xmlSchemaParticlePtr
6860xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6863 xmlSchemaParticlePtr particle;
6865 xmlSchemaWildcardPtr wild;
6868 xmlSchemaAnnotPtr annot =
NULL;
6883 xmlSchemaPIllegalAttrErr(ctxt,
6887 xmlSchemaPIllegalAttrErr(ctxt,
6896 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
6897 "(xs:nonNegativeInteger | unbounded)");
6898 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
6899 "xs:nonNegativeInteger");
6904 wild = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY,
node);
6907 xmlSchemaParseWildcardNs(ctxt,
schema, wild,
node);
6912 if (IS_SCHEMA(
child,
"annotation")) {
6913 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6917 xmlSchemaPContentErr(ctxt,
6920 NULL,
"(annotation?)");
6925 if ((
min == 0) && (
max == 0)) {
6932 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
6933 if (particle ==
NULL)
6935 particle->annot = annot;
6936 particle->children = (xmlSchemaTreeItemPtr) wild;
6951static xmlSchemaNotationPtr
6952xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6956 xmlSchemaNotationPtr
ret;
6961 name = xmlSchemaGetProp(ctxt,
node,
"name");
6964 "Notation has no name\n",
NULL,
NULL);
6968 ctxt->targetNamespace,
node);
6974 if (IS_SCHEMA(
child,
"annotation")) {
6975 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6979 xmlSchemaPContentErr(ctxt,
6982 NULL,
"(annotation?)");
6999static xmlSchemaWildcardPtr
7000xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
7003 xmlSchemaWildcardPtr
ret;
7010 ret = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
7024 xmlSchemaPIllegalAttrErr(ctxt,
7028 xmlSchemaPIllegalAttrErr(ctxt,
7043 if (IS_SCHEMA(
child,
"annotation")) {
7044 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
7048 xmlSchemaPContentErr(ctxt,
7051 NULL,
"(annotation?)");
7069static xmlSchemaBasicItemPtr
7070xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
7073 xmlSchemaItemListPtr uses,
7077 xmlSchemaAttributeUsePtr use =
NULL;
7081 int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7082 int nberrors, hasForm = 0, defValueType = 0;
7084#define WXS_ATTR_DEF_VAL_DEFAULT 1
7085#define WXS_ATTR_DEF_VAL_FIXED 2
7093 attr = xmlSchemaGetPropNode(
node,
"ref");
7095 if (xmlSchemaPValAttrNodeQName(pctxt,
schema,
7096 NULL,
attr, &tmpNs, &tmpName) != 0) {
7099 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, tmpNs) != 0)
7103 nberrors = pctxt->nberrors;
7112 xmlSchemaPValAttrNodeID(pctxt,
attr);
7121 xmlSchemaPValAttrNodeID(pctxt,
attr);
7124 xmlSchemaPValAttrNodeQName(pctxt,
schema,
NULL,
7125 attr, &tmpNs, &tmpName);
7132 attrValue = xmlSchemaGetNodeContent(pctxt,
7135 ns = pctxt->targetNamespace;
7138 xmlSchemaPSimpleTypeErr(pctxt,
7141 NULL,
"(qualified | unqualified)",
7149 attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7152 occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7154 occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
7156 occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
7158 xmlSchemaPSimpleTypeErr(pctxt,
7161 NULL,
"(optional | prohibited | required)",
7171 xmlSchemaPMutualExclAttrErr(pctxt,
7175 defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7176 defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
7185 xmlSchemaPMutualExclAttrErr(pctxt,
7189 defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7190 defValueType = WXS_ATTR_DEF_VAL_FIXED;
7197 xmlSchemaPIllegalAttrErr(pctxt,
7208 if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
7209 (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
7210 xmlSchemaPSimpleTypeErr(pctxt,
7213 "(optional | prohibited | required)",
NULL,
7214 "The value of the attribute 'use' must be 'optional' "
7215 "if the attribute 'default' is present",
7221 if (nberrors != pctxt->nberrors)
7224 xmlSchemaAttributePtr attrDecl;
7227 if ((! hasForm) && (
schema->flags & XML_SCHEMAS_QUALIF_ATTR))
7228 ns = pctxt->targetNamespace;
7234 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7237 "The target namespace must not match '%s'",
7238 xmlSchemaInstanceNs,
NULL);
7240 attr = xmlSchemaGetPropNode(
node,
"name");
7246 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7247 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7255 xmlSchemaPSimpleTypeErr(pctxt,
7258 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7259 "The value of the attribute must not match 'xmlns'",
7263 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
7264 goto check_children;
7268 use = xmlSchemaAddAttributeUse(pctxt,
node);
7271 use->occurs = occurs;
7276 if (attrDecl ==
NULL)
7278 if (tmpName !=
NULL) {
7279 attrDecl->typeName = tmpName;
7280 attrDecl->typeNs = tmpNs;
7282 use->attrDecl = attrDecl;
7286 if (defValue !=
NULL) {
7287 attrDecl->defValue = defValue;
7288 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7289 attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
7291 }
else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7292 xmlSchemaQNameRefPtr
ref;
7297 use = xmlSchemaAddAttributeUse(pctxt,
node);
7303 WXS_ADD_PENDING(pctxt, use);
7304 use->occurs = occurs;
7308 ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
7316 use->attrDecl = WXS_ATTR_CAST
ref;
7320 if (defValue !=
NULL)
7321 use->defValue = defValue;
7322 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7323 use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
7331 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7332 xmlSchemaAttributeUseProhibPtr prohib;
7334 if (IS_SCHEMA(
child,
"annotation")) {
7335 xmlSchemaParseAnnotation(pctxt,
child, 0);
7339 xmlSchemaPContentErr(pctxt,
7347 if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
7348 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7351 "Skipping attribute use prohibition, since it is "
7352 "pointless inside an <attributeGroup>",
7355 }
else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
7356 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7359 "Skipping attribute use prohibition, since it is "
7360 "pointless when extending a type",
7374 for (
i = 0;
i < uses->nbItems;
i++) {
7375 use = uses->items[
i];
7376 if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
7377 (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
7378 (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
7382 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7385 "Skipping duplicate attribute use prohibition '%s'",
7386 xmlSchemaFormatQName(&
str, tmpNs, tmpName),
7396 prohib = xmlSchemaAddAttributeUseProhib(pctxt);
7399 prohib->node =
node;
7400 prohib->name = tmpName;
7401 prohib->targetNamespace = tmpNs;
7406 WXS_ADD_PENDING(pctxt, prohib);
7408 return(WXS_BASIC_CAST prohib);
7410 if (IS_SCHEMA(
child,
"annotation")) {
7414 use->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7419 if (IS_SCHEMA(
child,
"simpleType"))
7425 xmlSchemaPContentErr(pctxt,
7430 xmlSchemaPContentErr(pctxt,
7436 if (IS_SCHEMA(
child,
"simpleType")) {
7437 if (WXS_ATTRUSE_DECL(use)->typeName !=
NULL) {
7444 "The attribute 'type' and the <simpleType> child "
7445 "are mutually exclusive",
NULL);
7447 WXS_ATTRUSE_TYPEDEF(use) =
7448 xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7454 "(annotation?, simpleType?)");
7457 return (WXS_BASIC_CAST use);
7461static xmlSchemaAttributePtr
7462xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
7467 xmlSchemaAttributePtr
ret;
7483 attr = xmlSchemaGetPropNode(
node,
"name");
7489 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7490 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
7498 xmlSchemaPSimpleTypeErr(pctxt,
7501 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7502 "The value of the attribute must not match 'xmlns'",
7512 if (
xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
7513 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7515 "The target namespace must not match '%s'",
7516 xmlSchemaInstanceNs,
NULL);
7519 ret = xmlSchemaAddAttribute(pctxt,
schema, attrValue,
7520 pctxt->targetNamespace,
node, 1);
7523 ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
7537 xmlSchemaPIllegalAttrErr(pctxt,
7541 xmlSchemaPIllegalAttrErr(pctxt,
7553 ret->defValue = xmlSchemaGetProp(pctxt,
node,
"fixed");
7555 ret->flags |= XML_SCHEMAS_ATTR_FIXED;
7559 attr = xmlSchemaGetPropNode(
node,
"default");
7565 if (
ret->flags & XML_SCHEMAS_ATTR_FIXED) {
7567 WXS_BASIC_CAST
ret,
attr,
"default",
"fixed");
7569 ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7575 if (IS_SCHEMA(
child,
"annotation")) {
7576 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7579 if (IS_SCHEMA(
child,
"simpleType")) {
7587 "The attribute 'type' and the <simpleType> child "
7588 "are mutually exclusive",
NULL);
7590 ret->subtypes = xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7596 "(annotation?, simpleType?)");
7614static xmlSchemaQNameRefPtr
7615xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
7619 xmlSchemaQNameRefPtr
ret;
7627 attr = xmlSchemaGetPropNode(
node,
"ref");
7629 xmlSchemaPMissingAttrErr(pctxt,
7634 xmlSchemaPValAttrNodeQName(pctxt,
schema,
7636 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, refNs) != 0)
7648 xmlSchemaPIllegalAttrErr(pctxt,
7652 xmlSchemaPIllegalAttrErr(pctxt,
7664 if (IS_SCHEMA(
child,
"annotation")) {
7668 xmlSchemaParseAnnotation(pctxt,
child, 0);
7672 xmlSchemaPContentErr(pctxt,
7681 if (pctxt->isRedefine && pctxt->redef &&
7682 (pctxt->redef->item->type ==
7683 XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
7684 (
ref == pctxt->redef->refName) &&
7685 (refNs == pctxt->redef->refTargetNs))
7694 if (pctxt->redefCounter != 0) {
7697 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7699 "The redefining attribute group definition "
7700 "'%s' must not contain more than one "
7701 "reference to the redefined definition",
7702 xmlSchemaFormatQName(&
str, refNs,
ref),
NULL);
7706 pctxt->redefCounter++;
7711 ret = xmlSchemaNewQNameRef(pctxt,
7712 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7716 pctxt->redef->reference = WXS_BASIC_CAST
ret;
7723 ret = xmlSchemaNewQNameRef(pctxt,
7724 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7729 WXS_ADD_PENDING(pctxt,
ret);
7745static xmlSchemaAttributeGroupPtr
7746xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
7751 xmlSchemaAttributeGroupPtr
ret;
7759 attr = xmlSchemaGetPropNode(
node,
"name");
7761 xmlSchemaPMissingAttrErr(pctxt,
7769 if (xmlSchemaPValAttrNode(pctxt,
7771 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7774 ret = xmlSchemaAddAttributeGroupDefinition(pctxt,
schema,
7775 name, pctxt->targetNamespace,
node);
7787 xmlSchemaPIllegalAttrErr(pctxt,
7791 xmlSchemaPIllegalAttrErr(pctxt,
7802 if (IS_SCHEMA(
child,
"annotation")) {
7803 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7809 if (xmlSchemaParseLocalAttributes(pctxt,
schema, &
child,
7810 (xmlSchemaItemListPtr *) &(
ret->attrUses),
7811 XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
7814 ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
7818 if (IS_SCHEMA(
child,
"anyAttribute")) {
7819 ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
7824 xmlSchemaPContentErr(pctxt,
7827 "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
7846 if ((*
flags & flagQualified) == 0)
7847 *
flags |= flagQualified;
7876 int flagRestriction,
7877 int flagSubstitution,
7894 if (flagExtension != -1)
7895 *
flags |= flagExtension;
7896 if (flagRestriction != -1)
7897 *
flags |= flagRestriction;
7898 if (flagSubstitution != -1)
7899 *
flags |= flagSubstitution;
7902 if (flagUnion != -1)
7903 *
flags |= flagUnion;
7919 if (flagExtension != -1) {
7920 if ((*
flags & flagExtension) == 0)
7921 *
flags |= flagExtension;
7925 if (flagRestriction != -1) {
7926 if ((*
flags & flagRestriction) == 0)
7927 *
flags |= flagRestriction;
7931 if (flagSubstitution != -1) {
7932 if ((*
flags & flagSubstitution) == 0)
7933 *
flags |= flagSubstitution;
7937 if (flagList != -1) {
7938 if ((*
flags & flagList) == 0)
7943 if (flagUnion != -1) {
7944 if ((*
flags & flagUnion) == 0)
7945 *
flags |= flagUnion;
7953 }
while ((
ret == 0) && (*
cur != 0));
7960xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
7961 xmlSchemaIDCPtr idc,
7962 xmlSchemaIDCSelectPtr selector,
7975 if (selector ==
NULL) {
7976 xmlSchemaPErr(ctxt, idc->node,
7978 "Internal error: xmlSchemaCheckCSelectorXPath, "
7979 "the selector is not specified.\n",
NULL,
NULL);
7986 if (selector->xpath ==
NULL) {
7987 xmlSchemaPCustomErr(ctxt,
7991 "The XPath expression of the selector is not valid",
NULL);
7995 xmlNsPtr *nsList =
NULL;
8007 nsList = xmlGetNsList(
attr->doc,
attr->parent);
8011 if (nsList !=
NULL) {
8014 for (
i = 0; nsList[
i] !=
NULL;
i++)
8019 if (nsArray ==
NULL) {
8020 xmlSchemaPErrMemory(ctxt,
"allocating a namespace array",
8026 nsArray[2 *
i] = nsList[
i]->href;
8027 nsArray[2 *
i + 1] = nsList[
i]->prefix;
8036 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8037 NULL, XML_PATTERN_XSFIELD, nsArray);
8039 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8040 NULL, XML_PATTERN_XSSEL, nsArray);
8041 if (nsArray !=
NULL)
8044 if (selector->xpathComp ==
NULL) {
8045 xmlSchemaPCustomErr(ctxt,
8049 "The XPath expression '%s' could not be "
8050 "compiled", selector->xpath);
8057#define ADD_ANNOTATION(annot) \
8058 xmlSchemaAnnotPtr cur = item->annot; \
8059 if (item->annot == NULL) { \
8060 item->annot = annot; \
8063 cur = item->annot; \
8064 if (cur->next != NULL) { \
8078static xmlSchemaAnnotPtr
8079xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
8080 xmlSchemaAnnotPtr annot)
8082 if ((annItem ==
NULL) || (annot ==
NULL))
8084 switch (annItem->type) {
8085 case XML_SCHEMA_TYPE_ELEMENT: {
8086 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) annItem;
8087 ADD_ANNOTATION(annot)
8090 case XML_SCHEMA_TYPE_ATTRIBUTE: {
8091 xmlSchemaAttributePtr
item = (xmlSchemaAttributePtr) annItem;
8092 ADD_ANNOTATION(annot)
8095 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
8096 case XML_SCHEMA_TYPE_ANY: {
8097 xmlSchemaWildcardPtr
item = (xmlSchemaWildcardPtr) annItem;
8098 ADD_ANNOTATION(annot)
8101 case XML_SCHEMA_TYPE_PARTICLE:
8102 case XML_SCHEMA_TYPE_IDC_KEY:
8103 case XML_SCHEMA_TYPE_IDC_KEYREF:
8104 case XML_SCHEMA_TYPE_IDC_UNIQUE: {
8105 xmlSchemaAnnotItemPtr
item = (xmlSchemaAnnotItemPtr) annItem;
8106 ADD_ANNOTATION(annot)
8109 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
8110 xmlSchemaAttributeGroupPtr
item =
8111 (xmlSchemaAttributeGroupPtr) annItem;
8112 ADD_ANNOTATION(annot)
8115 case XML_SCHEMA_TYPE_NOTATION: {
8116 xmlSchemaNotationPtr
item = (xmlSchemaNotationPtr) annItem;
8117 ADD_ANNOTATION(annot)
8120 case XML_SCHEMA_FACET_MININCLUSIVE:
8121 case XML_SCHEMA_FACET_MINEXCLUSIVE:
8122 case XML_SCHEMA_FACET_MAXINCLUSIVE:
8123 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
8124 case XML_SCHEMA_FACET_TOTALDIGITS:
8125 case XML_SCHEMA_FACET_FRACTIONDIGITS:
8126 case XML_SCHEMA_FACET_PATTERN:
8127 case XML_SCHEMA_FACET_ENUMERATION:
8128 case XML_SCHEMA_FACET_WHITESPACE:
8129 case XML_SCHEMA_FACET_LENGTH:
8130 case XML_SCHEMA_FACET_MAXLENGTH:
8131 case XML_SCHEMA_FACET_MINLENGTH: {
8132 xmlSchemaFacetPtr
item = (xmlSchemaFacetPtr) annItem;
8133 ADD_ANNOTATION(annot)
8136 case XML_SCHEMA_TYPE_SIMPLE:
8137 case XML_SCHEMA_TYPE_COMPLEX: {
8138 xmlSchemaTypePtr
item = (xmlSchemaTypePtr) annItem;
8139 ADD_ANNOTATION(annot)
8142 case XML_SCHEMA_TYPE_GROUP: {
8143 xmlSchemaModelGroupDefPtr
item = (xmlSchemaModelGroupDefPtr) annItem;
8144 ADD_ANNOTATION(annot)
8147 case XML_SCHEMA_TYPE_SEQUENCE:
8148 case XML_SCHEMA_TYPE_CHOICE:
8149 case XML_SCHEMA_TYPE_ALL: {
8150 xmlSchemaModelGroupPtr
item = (xmlSchemaModelGroupPtr) annItem;
8151 ADD_ANNOTATION(annot)
8155 xmlSchemaPCustomErr(
NULL,
8158 "Internal error: xmlSchemaAddAnnotation, "
8159 "The item is not a annotated schema component",
NULL);
8176static xmlSchemaIDCSelectPtr
8177xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
8178 xmlSchemaIDCPtr idc,
8182 xmlSchemaIDCSelectPtr
item;
8194 xmlSchemaPIllegalAttrErr(ctxt,
8198 xmlSchemaPIllegalAttrErr(ctxt,
8206 item = (xmlSchemaIDCSelectPtr)
xmlMalloc(
sizeof(xmlSchemaIDCSelect));
8208 xmlSchemaPErrMemory(ctxt,
8209 "allocating a 'selector' of an identity-constraint definition",
8217 attr = xmlSchemaGetPropNode(
node,
"xpath");
8219 xmlSchemaPMissingAttrErr(ctxt,
8224 item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8229 if (xmlSchemaCheckCSelectorXPath(ctxt, idc,
item,
attr,
8234 "Internal error: xmlSchemaParseIDCSelectorAndField, "
8235 "validating the XPath expression of a IDC selector.\n",
8245 if (IS_SCHEMA(
child,
"annotation")) {
8249 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
8250 xmlSchemaParseAnnotation(ctxt,
child, 1));
8254 xmlSchemaPContentErr(ctxt,
8257 NULL,
"(annotation?)");
8273static xmlSchemaIDCPtr
8274xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
8277 xmlSchemaTypeType idcCategory,
8278 const xmlChar *targetNamespace)
8294 ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
8296 xmlSchemaPIllegalAttrErr(ctxt,
8300 xmlSchemaPIllegalAttrErr(ctxt,
8308 attr = xmlSchemaGetPropNode(
node,
"name");
8310 xmlSchemaPMissingAttrErr(ctxt,
8315 }
else if (xmlSchemaPValAttrNode(ctxt,
8317 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
8327 if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
8331 attr = xmlSchemaGetPropNode(
node,
"refer");
8333 xmlSchemaPMissingAttrErr(ctxt,
8341 item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
8345 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8347 &(
item->ref->targetNamespace),
8348 &(
item->ref->name));
8350 item->ref->targetNamespace);
8357 if (IS_SCHEMA(
child,
"annotation")) {
8358 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8362 xmlSchemaPContentErr(ctxt,
8365 "A child element is missing",
8366 "(annotation?, (selector, field+))");
8371 if (IS_SCHEMA(
child,
"selector")) {
8372 item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
8378 if (IS_SCHEMA(
child,
"field")) {
8380 field = xmlSchemaParseIDCSelectorAndField(ctxt,
8385 if (lastField !=
NULL)
8386 lastField->next =
field;
8392 }
while (IS_SCHEMA(
child,
"field"));
8394 xmlSchemaPContentErr(ctxt,
8397 NULL,
"(annotation?, (selector, field+))");
8401 xmlSchemaPContentErr(ctxt,
8404 NULL,
"(annotation?, (selector, field+))");
8423static xmlSchemaBasicItemPtr
8424xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8425 xmlNodePtr
node,
int *isElemRef,
int topLevel)
8427 xmlSchemaElementPtr decl =
NULL;
8428 xmlSchemaParticlePtr particle =
NULL;
8429 xmlSchemaAnnotPtr annot =
NULL;
8431 xmlAttrPtr
attr, nameAttr;
8441 if (isElemRef !=
NULL)
8448 nameAttr = xmlSchemaGetPropNode(
node,
"name");
8449 attr = xmlSchemaGetPropNode(
node,
"ref");
8450 if ((topLevel) || (
attr ==
NULL)) {
8451 if (nameAttr ==
NULL) {
8452 xmlSchemaPMissingAttrErr(ctxt,
8462 if (IS_SCHEMA(
child,
"annotation")) {
8463 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8470 goto declaration_part;
8474 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
8475 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
"(xs:nonNegativeInteger | unbounded)");
8477 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
8478 if (particle ==
NULL)
8485 xmlSchemaQNameRefPtr refer =
NULL;
8489 if (isElemRef !=
NULL)
8492 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8498 if (nameAttr !=
NULL) {
8499 xmlSchemaPMutualExclAttrErr(ctxt,
8518 xmlSchemaPCustomAttrErr(ctxt,
8521 "Only the attributes 'minOccurs', 'maxOccurs' and "
8522 "'id' are allowed in addition to 'ref'");
8526 xmlSchemaPIllegalAttrErr(ctxt,
8538 if ((
min == 0) && (
max == 0))
8543 refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
8547 particle->children = (xmlSchemaTreeItemPtr) refer;
8548 particle->annot = annot;
8553 WXS_ADD_PENDING(ctxt, particle);
8554 return ((xmlSchemaBasicItemPtr) particle);
8562 xmlSchemaIDCPtr curIDC =
NULL, lastIDC =
NULL;
8564 if (xmlSchemaPValAttrNode(ctxt,
NULL, nameAttr,
8565 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0)
8571 ns = ctxt->targetNamespace;
8573 attr = xmlSchemaGetPropNode(
node,
"form");
8575 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8577 ns = ctxt->targetNamespace;
8579 xmlSchemaPSimpleTypeErr(ctxt,
8582 NULL,
"(qualified | unqualified)",
8585 }
else if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
8586 ns = ctxt->targetNamespace;
8588 decl = xmlSchemaAddElement(ctxt,
name,
ns,
node, topLevel);
8606 if (topLevel == 0) {
8611 xmlSchemaPIllegalAttrErr(ctxt,
8618 xmlSchemaPIllegalAttrErr(ctxt,
8624 xmlSchemaPIllegalAttrErr(ctxt,
8636 decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
8637 decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
8638 xmlSchemaPValAttrQName(ctxt,
schema,
8640 &(decl->substGroupNs), &(decl->substGroup));
8641 if (xmlGetBooleanProp(ctxt,
node,
"abstract", 0))
8642 decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
8646 attr = xmlSchemaGetPropNode(
node,
"final");
8648 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
8649 decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
8650 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
8651 decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
8653 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8654 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8656 XML_SCHEMAS_ELEM_FINAL_EXTENSION,
8657 XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
8658 xmlSchemaPSimpleTypeErr(ctxt,
8661 NULL,
"(#all | List of (extension | restriction))",
8669 attr = xmlSchemaGetPropNode(
node,
"block");
8674 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
8675 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
8676 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
8677 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
8678 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
8679 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
8681 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8682 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8684 XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
8685 XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
8686 XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
8687 xmlSchemaPSimpleTypeErr(ctxt,
8690 NULL,
"(#all | List of (extension | "
8691 "restriction | substitution))", attrValue,
8695 if (xmlGetBooleanProp(ctxt,
node,
"nillable", 0))
8696 decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
8698 attr = xmlSchemaGetPropNode(
node,
"type");
8700 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8702 &(decl->namedTypeNs), &(decl->namedType));
8704 attr, decl->namedTypeNs);
8706 decl->value = xmlSchemaGetProp(ctxt,
node,
"default");
8707 attr = xmlSchemaGetPropNode(
node,
"fixed");
8709 fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8710 if (decl->value !=
NULL) {
8715 xmlSchemaPMutualExclAttrErr(ctxt,
8719 decl->flags |= XML_SCHEMAS_ELEM_FIXED;
8720 decl->value =
fixed;
8726 if (IS_SCHEMA(
child,
"complexType")) {
8732 if (decl->namedType !=
NULL) {
8733 xmlSchemaPContentErr(ctxt,
8736 "The attribute 'type' and the <complexType> child are "
8737 "mutually exclusive",
NULL);
8739 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt,
schema,
child, 0);
8741 }
else if (IS_SCHEMA(
child,
"simpleType")) {
8747 if (decl->namedType !=
NULL) {
8748 xmlSchemaPContentErr(ctxt,
8751 "The attribute 'type' and the <simpleType> child are "
8752 "mutually exclusive",
NULL);
8754 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
8757 while ((IS_SCHEMA(
child,
"unique")) ||
8758 (IS_SCHEMA(
child,
"key")) || (IS_SCHEMA(
child,
"keyref"))) {
8759 if (IS_SCHEMA(
child,
"unique")) {
8761 XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
8762 }
else if (IS_SCHEMA(
child,
"key")) {
8764 XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
8765 }
else if (IS_SCHEMA(
child,
"keyref")) {
8767 XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
8769 if (lastIDC !=
NULL)
8770 lastIDC->next = curIDC;
8772 decl->idcs = (
void *) curIDC;
8777 xmlSchemaPContentErr(ctxt,
8780 NULL,
"(annotation?, ((simpleType | complexType)?, "
8781 "(unique | key | keyref)*))");
8783 decl->annot = annot;
8791 return ((xmlSchemaBasicItemPtr) decl);
8793 particle->children = (xmlSchemaTreeItemPtr) decl;
8794 return ((xmlSchemaBasicItemPtr) particle);
8799 if (annot !=
NULL) {
8800 if (particle !=
NULL)
8801 particle->annot =
NULL;
8804 xmlSchemaFreeAnnot(annot);
8822xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8825 xmlSchemaTypePtr
type;
8833 type = ctxt->ctxtType;
8837 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
8842 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
8851 xmlSchemaPIllegalAttrErr(ctxt,
8855 xmlSchemaPIllegalAttrErr(ctxt,
8865 attr = xmlSchemaGetPropNode(
node,
"memberTypes");
8869 const xmlChar *localName, *nsName;
8870 xmlSchemaTypeLinkPtr
link, lastLink =
NULL;
8871 xmlSchemaQNameRefPtr
ref;
8873 cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8887 xmlSchemaPErrMemory(ctxt,
"xmlSchemaParseUnion, "
8888 "duplicating type name",
NULL);
8891 if (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
8896 link = (xmlSchemaTypeLinkPtr)
8899 xmlSchemaPErrMemory(ctxt,
"xmlSchemaParseUnion, "
8900 "allocating a type link",
NULL);
8906 if (lastLink ==
NULL)
8909 lastLink->next =
link;
8914 ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
8924 link->type = (xmlSchemaTypePtr)
ref;
8928 }
while (*
cur != 0);
8935 if (IS_SCHEMA(
child,
"annotation")) {
8939 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
8940 xmlSchemaParseAnnotation(ctxt,
child, 1));
8943 if (IS_SCHEMA(
child,
"simpleType")) {
8944 xmlSchemaTypePtr subtype,
last =
NULL;
8950 while (IS_SCHEMA(
child,
"simpleType")) {
8951 subtype = (xmlSchemaTypePtr)
8953 if (subtype !=
NULL) {
8955 type->subtypes = subtype;
8958 last->next = subtype;
8967 xmlSchemaPContentErr(ctxt,
8977 xmlSchemaPCustomErr(ctxt,
8980 "Either the attribute 'memberTypes' or "
8981 "at least one <simpleType> child must be present",
NULL);
8998static xmlSchemaTypePtr
8999xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9002 xmlSchemaTypePtr
type;
9009 type = ctxt->ctxtType;
9013 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
9018 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
9027 xmlSchemaPIllegalAttrErr(ctxt,
9031 xmlSchemaPIllegalAttrErr(ctxt,
9052 if (IS_SCHEMA(
child,
"annotation")) {
9053 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
9054 xmlSchemaParseAnnotation(ctxt,
child, 1));
9057 if (IS_SCHEMA(
child,
"simpleType")) {
9064 xmlSchemaPCustomErr(ctxt,
9067 "The attribute 'itemType' and the <simpleType> child "
9068 "are mutually exclusive",
NULL);
9074 xmlSchemaPCustomErr(ctxt,
9077 "Either the attribute 'itemType' or the <simpleType> child "
9078 "must be present",
NULL);
9081 xmlSchemaPContentErr(ctxt,
9087 (xmlSchemaGetPropNode(
node,
"itemType") ==
NULL)) {
9088 xmlSchemaPCustomErr(ctxt,
9091 "Either the attribute 'itemType' or the <simpleType> child "
9092 "must be present",
NULL);
9109static xmlSchemaTypePtr
9110xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9111 xmlNodePtr
node,
int topLevel)
9113 xmlSchemaTypePtr
type, oldCtxtType;
9117 int hasRestriction = 0;
9123 attr = xmlSchemaGetPropNode(
node,
"name");
9125 xmlSchemaPMissingAttrErr(ctxt,
9131 if (xmlSchemaPValAttrNode(ctxt,
9133 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
9139 xmlSchemaTypePtr biType;
9141 if (ctxt->isRedefine) {
9149 "Redefinition of built-in simple types is not "
9153 biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
9165 if (topLevel == 0) {
9166#ifdef ENABLE_NAMED_LOCALS
9172#ifdef ENABLE_NAMED_LOCALS
9175 XML_SCHEMA_TYPE_SIMPLE,
9177 ctxt->targetNamespace,
node, 0);
9180 XML_SCHEMA_TYPE_SIMPLE,
9181 NULL, ctxt->targetNamespace,
node, 0);
9185 type->type = XML_SCHEMA_TYPE_SIMPLE;
9186 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9194 xmlSchemaPIllegalAttrErr(ctxt,
9198 xmlSchemaPIllegalAttrErr(ctxt,
9209 type = xmlSchemaAddType(ctxt,
schema, XML_SCHEMA_TYPE_SIMPLE,
9210 attrValue, ctxt->targetNamespace,
node, 1);
9213 type->type = XML_SCHEMA_TYPE_SIMPLE;
9214 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9215 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
9225 xmlSchemaPIllegalAttrErr(ctxt,
9229 xmlSchemaPIllegalAttrErr(ctxt,
9237 attr = xmlSchemaGetPropNode(
node,
"final");
9239 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9240 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
9241 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9242 type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
9243 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9244 type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
9246 attrValue = xmlSchemaGetProp(ctxt,
node,
"final");
9247 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
9248 -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
9249 XML_SCHEMAS_TYPE_FINAL_LIST,
9250 XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
9252 xmlSchemaPSimpleTypeErr(ctxt,
9254 WXS_BASIC_CAST
type, (xmlNodePtr)
attr,
9255 NULL,
"(#all | List of (list | union | restriction)",
9260 type->targetNamespace = ctxt->targetNamespace;
9265 oldCtxtType = ctxt->ctxtType;
9267 ctxt->ctxtType =
type;
9270 if (IS_SCHEMA(
child,
"annotation")) {
9271 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9277 "(annotation?, (restriction | list | union))");
9278 }
else if (IS_SCHEMA(
child,
"restriction")) {
9280 XML_SCHEMA_TYPE_SIMPLE);
9283 }
else if (IS_SCHEMA(
child,
"list")) {
9286 }
else if (IS_SCHEMA(
child,
"union")) {
9293 "(annotation?, (restriction | list | union))");
9302 if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
9304 NULL,
node,
"This is a redefinition, thus the "
9305 "<simpleType> must have a <restriction> child",
NULL);
9308 ctxt->ctxtType = oldCtxtType;
9323static xmlSchemaTreeItemPtr
9324xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
9328 xmlSchemaParticlePtr
item;
9337 attr = xmlSchemaGetPropNode(
node,
"ref");
9339 xmlSchemaPMissingAttrErr(ctxt,
9343 }
else if (xmlSchemaPValAttrNodeQName(ctxt,
schema,
NULL,
9348 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
9349 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
9350 "(xs:nonNegativeInteger | unbounded)");
9361 xmlSchemaPIllegalAttrErr(ctxt,
9365 xmlSchemaPIllegalAttrErr(ctxt,
9378 item->children = (xmlSchemaTreeItemPtr)
9379 xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP,
ref, refNs);
9386 if (IS_SCHEMA(
child,
"annotation")) {
9390 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9394 xmlSchemaPContentErr(ctxt,
9402 if ((
min == 0) && (
max == 0))
9405 return ((xmlSchemaTreeItemPtr)
item);
9425static xmlSchemaModelGroupDefPtr
9426xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
9430 xmlSchemaModelGroupDefPtr
item;
9438 attr = xmlSchemaGetPropNode(
node,
"name");
9440 xmlSchemaPMissingAttrErr(ctxt,
9445 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
9446 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
9450 ctxt->targetNamespace,
node);
9461 xmlSchemaPIllegalAttrErr(ctxt,
9465 xmlSchemaPIllegalAttrErr(ctxt,
9475 if (IS_SCHEMA(
child,
"annotation")) {
9476 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9479 if (IS_SCHEMA(
child,
"all")) {
9481 XML_SCHEMA_TYPE_ALL, 0);
9483 }
else if (IS_SCHEMA(
child,
"choice")) {
9485 XML_SCHEMA_TYPE_CHOICE, 0);
9487 }
else if (IS_SCHEMA(
child,
"sequence")) {
9489 XML_SCHEMA_TYPE_SEQUENCE, 0);
9496 xmlSchemaPContentErr(ctxt,
9499 "(annotation?, (all | choice | sequence)?)");
9512xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
root)
9514 xmlNodePtr
delete,
cur;
9524 if (
delete !=
NULL) {
9525 xmlUnlinkNode(
delete);
9526 xmlFreeNode(
delete);
9529 if (
cur->type == XML_TEXT_NODE) {
9531 if (xmlNodeGetSpacePreserve(
cur) != 1) {
9535 }
else if ((
cur->type != XML_ELEMENT_NODE) &&
9536 (
cur->type != XML_CDATA_SECTION_NODE)) {
9545 if ((
cur->children->type != XML_ENTITY_DECL) &&
9546 (
cur->children->type != XML_ENTITY_REF_NODE) &&
9547 (
cur->children->type != XML_ENTITY_NODE)) {
9572 if (
delete !=
NULL) {
9573 xmlUnlinkNode(
delete);
9574 xmlFreeNode(
delete);
9581xmlSchemaClearSchemaDefaults(xmlSchemaPtr
schema)
9583 if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
9584 schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
9586 if (
schema->flags & XML_SCHEMAS_QUALIF_ATTR)
9587 schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
9589 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
9590 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
9591 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9592 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
9593 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9594 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
9595 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9596 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
9598 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
9599 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
9600 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
9601 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
9602 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
9603 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
9607xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
9613 int res = 0, oldErrs = ctxt->nberrors;
9635 attr = xmlSchemaGetPropNode(
node,
"targetNamespace");
9638 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
9645 attr = xmlSchemaGetPropNode(
node,
"elementFormDefault");
9647 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9648 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9649 XML_SCHEMAS_QUALIF_ELEM);
9652 xmlSchemaPSimpleTypeErr(ctxt,
9658 attr = xmlSchemaGetPropNode(
node,
"attributeFormDefault");
9660 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9661 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9662 XML_SCHEMAS_QUALIF_ATTR);
9665 xmlSchemaPSimpleTypeErr(ctxt,
9671 attr = xmlSchemaGetPropNode(
node,
"finalDefault");
9673 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9674 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9675 XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
9676 XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
9678 XML_SCHEMAS_FINAL_DEFAULT_LIST,
9679 XML_SCHEMAS_FINAL_DEFAULT_UNION);
9682 xmlSchemaPSimpleTypeErr(ctxt,
9685 "(#all | List of (extension | restriction | list | union))",
9689 attr = xmlSchemaGetPropNode(
node,
"blockDefault");
9691 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9692 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9693 XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
9694 XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
9695 XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
9698 xmlSchemaPSimpleTypeErr(ctxt,
9701 "(#all | List of (extension | restriction | substitution))",
9707 if (oldErrs != ctxt->nberrors)
9724xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
9725 xmlSchemaPtr
schema, xmlNodePtr nodes)
9728 xmlSchemaAnnotPtr annot;
9729 int res = 0, oldErrs, tmpOldErrs;
9734 oldErrs = ctxt->nberrors;
9736 while ((IS_SCHEMA(
child,
"include")) ||
9737 (IS_SCHEMA(
child,
"import")) ||
9738 (IS_SCHEMA(
child,
"redefine")) ||
9739 (IS_SCHEMA(
child,
"annotation"))) {
9740 if (IS_SCHEMA(
child,
"annotation")) {
9741 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9745 xmlSchemaFreeAnnot(annot);
9746 }
else if (IS_SCHEMA(
child,
"import")) {
9747 tmpOldErrs = ctxt->nberrors;
9751 if (tmpOldErrs != ctxt->nberrors)
9753 }
else if (IS_SCHEMA(
child,
"include")) {
9754 tmpOldErrs = ctxt->nberrors;
9758 if (tmpOldErrs != ctxt->nberrors)
9760 }
else if (IS_SCHEMA(
child,
"redefine")) {
9761 tmpOldErrs = ctxt->nberrors;
9765 if (tmpOldErrs != ctxt->nberrors)
9775 if (IS_SCHEMA(
child,
"complexType")) {
9776 xmlSchemaParseComplexType(ctxt,
schema,
child, 1);
9778 }
else if (IS_SCHEMA(
child,
"simpleType")) {
9781 }
else if (IS_SCHEMA(
child,
"element")) {
9784 }
else if (IS_SCHEMA(
child,
"attribute")) {
9785 xmlSchemaParseGlobalAttribute(ctxt,
schema,
child);
9787 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
9788 xmlSchemaParseAttributeGroupDefinition(ctxt,
schema,
child);
9790 }
else if (IS_SCHEMA(
child,
"group")) {
9791 xmlSchemaParseModelGroupDefinition(ctxt,
schema,
child);
9793 }
else if (IS_SCHEMA(
child,
"notation")) {
9797 xmlSchemaPContentErr(ctxt,
9800 NULL,
"((include | import | redefine | annotation)*, "
9801 "(((simpleType | complexType | group | attributeGroup) "
9802 "| element | attribute | notation), annotation*)*)");
9805 while (IS_SCHEMA(
child,
"annotation")) {
9809 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9813 xmlSchemaFreeAnnot(annot);
9818 ctxt->ctxtType =
NULL;
9819 if (oldErrs != ctxt->nberrors)
9826static xmlSchemaSchemaRelationPtr
9827xmlSchemaSchemaRelationCreate(
void)
9829 xmlSchemaSchemaRelationPtr
ret;
9831 ret = (xmlSchemaSchemaRelationPtr)
9832 xmlMalloc(
sizeof(xmlSchemaSchemaRelation));
9834 xmlSchemaPErrMemory(
NULL,
"allocating schema relation",
NULL);
9837 memset(
ret, 0,
sizeof(xmlSchemaSchemaRelation));
9843xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
9850xmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
9852 xmlSchemaRedefPtr prev;
9854 while (redef !=
NULL) {
9856 redef = redef->next;
9862xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
9870 if (con->buckets !=
NULL)
9871 xmlSchemaItemListFree(con->buckets);
9872 if (con->pending !=
NULL)
9873 xmlSchemaItemListFree(con->pending);
9874 if (con->substGroups !=
NULL)
9875 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
9876 if (con->redefs !=
NULL)
9877 xmlSchemaRedefListFree(con->redefs);
9878 if (con->dict !=
NULL)
9883static xmlSchemaConstructionCtxtPtr
9884xmlSchemaConstructionCtxtCreate(
xmlDictPtr dict)
9886 xmlSchemaConstructionCtxtPtr
ret;
9888 ret = (xmlSchemaConstructionCtxtPtr)
9889 xmlMalloc(
sizeof(xmlSchemaConstructionCtxt));
9891 xmlSchemaPErrMemory(
NULL,
9892 "allocating schema construction context",
NULL);
9895 memset(
ret, 0,
sizeof(xmlSchemaConstructionCtxt));
9897 ret->buckets = xmlSchemaItemListCreate();
9899 xmlSchemaPErrMemory(
NULL,
9900 "allocating list of schema buckets",
NULL);
9904 ret->pending = xmlSchemaItemListCreate();
9906 xmlSchemaPErrMemory(
NULL,
9907 "allocating list of pending global components",
NULL);
9908 xmlSchemaConstructionCtxtFree(
ret);
9916static xmlSchemaParserCtxtPtr
9917xmlSchemaParserCtxtCreate(
void)
9919 xmlSchemaParserCtxtPtr
ret;
9921 ret = (xmlSchemaParserCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaParserCtxt));
9923 xmlSchemaPErrMemory(
NULL,
"allocating schema parser context",
9927 memset(
ret, 0,
sizeof(xmlSchemaParserCtxt));
9928 ret->type = XML_SCHEMA_CTXT_PARSER;
9929 ret->attrProhibs = xmlSchemaItemListCreate();
9930 if (
ret->attrProhibs ==
NULL) {
9947static xmlSchemaParserCtxtPtr
9948xmlSchemaNewParserCtxtUseDict(
const char *URL,
xmlDictPtr dict)
9950 xmlSchemaParserCtxtPtr
ret;
9952 ret = xmlSchemaParserCtxtCreate();
9963xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
9965 if (vctxt->pctxt ==
NULL) {
9966 if (vctxt->schema !=
NULL)
9968 xmlSchemaNewParserCtxtUseDict(
"*", vctxt->schema->dict);
9970 vctxt->pctxt = xmlSchemaNewParserCtxt(
"*");
9971 if (vctxt->pctxt ==
NULL) {
9972 VERROR_INT(
"xmlSchemaCreatePCtxtOnVCtxt",
9973 "failed to create a temp. parser context");
9977 xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
9978 vctxt->warning, vctxt->errCtxt);
9979 xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
9995static xmlSchemaBucketPtr
9996xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
9997 const xmlChar *schemaLocation)
9999 xmlSchemaBucketPtr
cur;
10000 xmlSchemaItemListPtr
list;
10002 list = pctxt->constructor->buckets;
10003 if (
list->nbItems == 0)
10007 for (
i = 0;
i <
list->nbItems;
i++) {
10008 cur = (xmlSchemaBucketPtr)
list->items[
i];
10010 if (
cur->schemaLocation == schemaLocation)
10017static xmlSchemaBucketPtr
10018xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10019 const xmlChar *schemaLocation,
10020 const xmlChar *targetNamespace)
10022 xmlSchemaBucketPtr
cur;
10023 xmlSchemaItemListPtr
list;
10025 list = pctxt->constructor->buckets;
10026 if (
list->nbItems == 0)
10030 for (
i = 0;
i <
list->nbItems;
i++) {
10031 cur = (xmlSchemaBucketPtr)
list->items[
i];
10033 if ((
cur->origTargetNamespace ==
NULL) &&
10034 (
cur->schemaLocation == schemaLocation) &&
10035 (
cur->targetNamespace == targetNamespace))
10043#define IS_BAD_SCHEMA_DOC(b) \
10044 (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
10046static xmlSchemaBucketPtr
10047xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
10048 const xmlChar *targetNamespace,
10051 xmlSchemaBucketPtr
cur;
10052 xmlSchemaItemListPtr
list;
10054 list = pctxt->constructor->buckets;
10055 if (
list->nbItems == 0)
10059 for (
i = 0;
i <
list->nbItems;
i++) {
10060 cur = (xmlSchemaBucketPtr)
list->items[
i];
10061 if ((! IS_BAD_SCHEMA_DOC(
cur)) &&
10062 (
cur->origTargetNamespace == targetNamespace) &&
10063 ((imported &&
cur->imported) ||
10064 ((!imported) && (!
cur->imported))))
10072xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
10074 xmlSchemaBucketPtr bucket)
10080 xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
10088 oldFlags =
schema->flags;
10091 xmlSchemaClearSchemaDefaults(
schema);
10092 schema->doc = bucket->doc;
10098 pctxt->targetNamespace = bucket->targetNamespace;
10099 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
10101 if ((bucket->targetNamespace !=
NULL) &&
10102 xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
10111 node = xmlDocGetRootElement(bucket->doc);
10118 oldErrs = pctxt->nberrors;
10119 ret = xmlSchemaParseSchemaTopLevel(pctxt,
schema,
node->children);
10127 if ((
ret == 0) && (oldErrs != pctxt->nberrors)) {
10133 WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
10136 schema->flags = oldFlags;
10141xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
10143 xmlSchemaBucketPtr bucket)
10145 xmlSchemaParserCtxtPtr newpctxt;
10148 if (bucket ==
NULL)
10150 if (bucket->parsed) {
10151 PERROR_INT(
"xmlSchemaParseNewDoc",
10152 "reparsing a schema doc");
10155 if (bucket->doc ==
NULL) {
10156 PERROR_INT(
"xmlSchemaParseNewDoc",
10157 "parsing a schema doc, but there's no doc");
10160 if (pctxt->constructor ==
NULL) {
10161 PERROR_INT(
"xmlSchemaParseNewDoc",
10166 newpctxt = xmlSchemaNewParserCtxtUseDict(
10167 (
const char *) bucket->schemaLocation, pctxt->dict);
10168 if (newpctxt ==
NULL)
10170 newpctxt->constructor = pctxt->constructor;
10176 newpctxt->schema =
schema;
10177 xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
10179 xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
10181 newpctxt->counter = pctxt->counter;
10184 res = xmlSchemaParseNewDocWithContext(newpctxt,
schema, bucket);
10189 pctxt->nberrors += newpctxt->nberrors;
10190 pctxt->counter = newpctxt->counter;
10191 newpctxt->constructor =
NULL;
10193 xmlSchemaFreeParserCtxt(newpctxt);
10198xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
10199 xmlSchemaSchemaRelationPtr rel)
10201 xmlSchemaSchemaRelationPtr
cur = bucket->relations;
10204 bucket->relations = rel;
10215 xmlNodePtr ctxtNode)
10221 if (ctxtNode ==
NULL)
10227 base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
10259xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
10261 const xmlChar *schemaLocation,
10262 xmlDocPtr schemaDoc,
10263 const char *schemaBuffer,
10264 int schemaBufferLen,
10265 xmlNodePtr invokingNode,
10266 const xmlChar *sourceTargetNamespace,
10267 const xmlChar *importNamespace,
10268 xmlSchemaBucketPtr *bucket)
10271 xmlSchemaSchemaRelationPtr relation =
NULL;
10272 xmlDocPtr doc =
NULL;
10273 int res = 0,
err = 0, located = 0, preserveDoc = 0;
10274 xmlSchemaBucketPtr bkt =
NULL;
10276 if (bucket !=
NULL)
10280 case XML_SCHEMA_SCHEMA_IMPORT:
10281 case XML_SCHEMA_SCHEMA_MAIN:
10284 case XML_SCHEMA_SCHEMA_INCLUDE:
10287 case XML_SCHEMA_SCHEMA_REDEFINE:
10297 if ((
type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
10301 if (schemaLocation !=
NULL) {
10302 bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
10303 if ((bkt !=
NULL) &&
10304 (pctxt->constructor->bucket == bkt)) {
10307 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10308 invokingNode,
NULL,
10309 "The schema must not import/include/redefine itself",
10317 relation = xmlSchemaSchemaRelationCreate();
10318 if (relation ==
NULL)
10320 xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
10322 relation->type =
type;
10327 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10328 relation->importNamespace = importNamespace;
10329 if (schemaLocation ==
NULL) {
10337 targetNamespace = importNamespace;
10342 if ((WXS_IS_BUCKET_IMPMAIN(
type)) && (! bkt->imported)) {
10347 if (schemaLocation ==
NULL)
10348 schemaLocation =
BAD_CAST "in_memory_buffer";
10350 bkt->schemaLocation)) {
10351 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10352 invokingNode,
NULL,
10353 "The schema document '%s' cannot be imported, since "
10354 "it was already included or redefined",
10355 schemaLocation,
NULL);
10358 }
else if ((! WXS_IS_BUCKET_IMPMAIN(
type)) && (bkt->imported)) {
10364 if (schemaLocation ==
NULL)
10365 schemaLocation =
BAD_CAST "in_memory_buffer";
10367 bkt->schemaLocation)) {
10368 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10369 invokingNode,
NULL,
10370 "The schema document '%s' cannot be included or "
10371 "redefined, since it was already imported",
10372 schemaLocation,
NULL);
10378 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10400 relation->bucket = bkt;
10403 bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
10404 importNamespace, 1);
10407 relation->bucket = bkt;
10408 if (bkt->schemaLocation ==
NULL) {
10410 bkt->schemaLocation = schemaLocation;
10413 bkt->schemaLocation)) {
10419 if (schemaLocation ==
NULL)
10420 schemaLocation =
BAD_CAST "in_memory_buffer";
10422 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10424 invokingNode,
NULL,
10425 "Skipping import of schema located at '%s' for the "
10426 "namespace '%s', since this namespace was already "
10427 "imported with the schema located at '%s'",
10428 schemaLocation, importNamespace, bkt->schemaLocation);
10441 if ((bkt->origTargetNamespace ==
NULL) &&
10442 (bkt->targetNamespace != sourceTargetNamespace)) {
10443 xmlSchemaBucketPtr chamel;
10462 chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
10463 schemaLocation, sourceTargetNamespace);
10464 if (chamel !=
NULL) {
10466 relation->bucket = chamel;
10478 relation->bucket = bkt;
10483 if ((bkt !=
NULL) && (bkt->doc !=
NULL)) {
10484 PERROR_INT(
"xmlSchemaAddSchemaDoc",
10485 "trying to load a schema doc, but a doc is already "
10486 "assigned to the schema bucket");
10494 if (schemaDoc !=
NULL) {
10499 if (schemaDoc->URL !=
NULL)
10501 schemaDoc->URL, -1);
10503 schemaLocation =
BAD_CAST "in_memory_buffer";
10504 }
else if ((schemaLocation !=
NULL) || (schemaBuffer !=
NULL)) {
10505 xmlParserCtxtPtr parserCtxt;
10508 if (parserCtxt ==
NULL) {
10509 xmlSchemaPErrMemory(
NULL,
"xmlSchemaGetDoc, "
10510 "allocating a parser context",
NULL);
10513 if ((pctxt->dict !=
NULL) && (parserCtxt->dict !=
NULL)) {
10519 parserCtxt->dict = pctxt->dict;
10522 if (schemaLocation !=
NULL) {
10525 NULL, SCHEMAS_PARSE_OPTIONS);
10526 }
else if (schemaBuffer !=
NULL) {
10529 NULL,
NULL, SCHEMAS_PARSE_OPTIONS);
10530 schemaLocation =
BAD_CAST "in_memory_buffer";
10563 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10564 invokingNode,
NULL,
10565 "Failed to parse the XML resource '%s'",
10566 schemaLocation,
NULL);
10570 if ((doc ==
NULL) && located)
10573 xmlSchemaPErr(pctxt,
NULL,
10575 "No information for parsing was provided with the "
10576 "given schema parser context.\n",
10584 xmlNodePtr docElem =
NULL;
10587 docElem = xmlDocGetRootElement(doc);
10588 if (docElem ==
NULL) {
10590 invokingNode,
NULL,
10591 "The document '%s' has no document element",
10592 schemaLocation,
NULL);
10598 xmlSchemaCleanupDoc(pctxt, docElem);
10602 if (!IS_SCHEMA(docElem,
"schema")) {
10604 invokingNode,
NULL,
10605 "The XML document '%s' is not a schema document",
10606 schemaLocation,
NULL);
10613 targetNamespace = xmlSchemaGetProp(pctxt, docElem,
10614 "targetNamespace");
10618 if ((bkt ==
NULL) && located) {
10620 bkt = xmlSchemaBucketCreate(pctxt,
type,
10626 bkt->schemaLocation = schemaLocation;
10627 bkt->located = located;
10630 bkt->targetNamespace = targetNamespace;
10631 bkt->origTargetNamespace = targetNamespace;
10633 bkt->preserveDoc = 1;
10635 if (WXS_IS_BUCKET_IMPMAIN(
type))
10640 if (relation !=
NULL)
10641 relation->bucket = bkt;
10649 if (bucket !=
NULL)
10654 if ((doc !=
NULL) && (! preserveDoc)) {
10659 return(pctxt->err);
10662 if ((doc !=
NULL) && (! preserveDoc)) {
10683xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
10688 const xmlChar *thisTargetNamespace;
10691 xmlSchemaBucketPtr bucket =
NULL;
10705 xmlSchemaPIllegalAttrErr(pctxt,
10709 xmlSchemaPIllegalAttrErr(pctxt,
10717 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10718 "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10719 &namespaceName) != 0) {
10720 xmlSchemaPSimpleTypeErr(pctxt,
10723 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10725 return (pctxt->err);
10728 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10729 "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10730 &schemaLocation) != 0) {
10731 xmlSchemaPSimpleTypeErr(pctxt,
10734 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10736 return (pctxt->err);
10742 if (IS_SCHEMA(
child,
"annotation")) {
10750 xmlSchemaPContentErr(pctxt,
10763 thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
10764 if (namespaceName !=
NULL) {
10770 if (
xmlStrEqual(thisTargetNamespace, namespaceName)) {
10771 xmlSchemaPCustomErr(pctxt,
10774 "The value of the attribute 'namespace' must not match "
10775 "the target namespace '%s' of the importing schema",
10776 thisTargetNamespace);
10777 return (pctxt->err);
10784 if (thisTargetNamespace ==
NULL) {
10785 xmlSchemaPCustomErr(pctxt,
10788 "The attribute 'namespace' must be existent if "
10789 "the importing schema has no target namespace",
10791 return (pctxt->err);
10797 if (schemaLocation !=
NULL)
10798 schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
10799 schemaLocation,
node);
10800 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
10801 schemaLocation,
NULL,
NULL, 0,
node, thisTargetNamespace,
10802 namespaceName, &bucket);
10814 if ((bucket ==
NULL) && (schemaLocation !=
NULL)) {
10815 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10818 "Failed to locate a schema at location '%s'. "
10819 "Skipping the import", schemaLocation,
NULL,
NULL);
10822 if ((bucket !=
NULL) && CAN_PARSE_SCHEMA(bucket)) {
10823 ret = xmlSchemaParseNewDoc(pctxt,
schema, bucket);
10830xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
10839 (schemaLocation ==
NULL))
10842 *schemaLocation =
NULL;
10852 xmlSchemaPIllegalAttrErr(pctxt,
10856 xmlSchemaPIllegalAttrErr(pctxt,
10869 attr = xmlSchemaGetPropNode(
node,
"schemaLocation");
10874 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
10875 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10876 (
const xmlChar **) schemaLocation) != 0)
10886 PERROR_INT(
"xmlSchemaParseIncludeOrRedefine",
10887 "could not build an URI from the schemaLocation")
10893 xmlSchemaPMissingAttrErr(pctxt,
10902 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
10903 xmlSchemaPCustomErr(pctxt,
10906 "The schema document '%s' cannot redefine itself.",
10909 xmlSchemaPCustomErr(pctxt,
10912 "The schema document '%s' cannot include itself.",
10920 return(pctxt->err);
10926xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
10934 int isChameleon = 0, wasChameleon = 0;
10935 xmlSchemaBucketPtr bucket =
NULL;
10944 res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt,
schema,
10951 res = xmlSchemaAddSchemaDoc(pctxt,
type, schemaLocation,
NULL,
10952 NULL, 0,
node, pctxt->targetNamespace,
NULL, &bucket);
10960 if ((bucket ==
NULL) || (bucket->doc ==
NULL)) {
10961 if (
type == XML_SCHEMA_SCHEMA_INCLUDE) {
10974 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10976 "Failed to load the document '%s' for inclusion",
10977 schemaLocation,
NULL);
10991 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10993 "Failed to load the document '%s' for redefinition",
10994 schemaLocation,
NULL);
11002 if (bucket->origTargetNamespace !=
NULL) {
11009 if (pctxt->targetNamespace ==
NULL) {
11010 xmlSchemaCustomErr(ACTXT_CAST pctxt,
11013 "The target namespace of the included/redefined schema "
11014 "'%s' has to be absent, since the including/redefining "
11015 "schema has no target namespace",
11016 schemaLocation,
NULL);
11018 }
else if (!
xmlStrEqual(bucket->origTargetNamespace,
11019 pctxt->targetNamespace)) {
11021 xmlSchemaPCustomErrExt(pctxt,
11024 "The target namespace '%s' of the included/redefined "
11025 "schema '%s' differs from '%s' of the "
11026 "including/redefining schema",
11027 bucket->origTargetNamespace, schemaLocation,
11028 pctxt->targetNamespace);
11031 }
else if (pctxt->targetNamespace !=
NULL) {
11037 bucket->targetNamespace = pctxt->targetNamespace;
11043 if (bucket && (!bucket->parsed) && (bucket->doc !=
NULL)) {
11046 if ((
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
11047 schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11051 xmlSchemaParseNewDoc(pctxt,
schema, bucket);
11053 if (isChameleon && (!wasChameleon))
11054 schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11060 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11064 pctxt->redefined = bucket;
11068 pctxt->isRedefine = 1;
11069 while (IS_SCHEMA(
child,
"annotation") ||
11070 IS_SCHEMA(
child,
"simpleType") ||
11071 IS_SCHEMA(
child,
"complexType") ||
11072 IS_SCHEMA(
child,
"group") ||
11073 IS_SCHEMA(
child,
"attributeGroup")) {
11074 if (IS_SCHEMA(
child,
"annotation")) {
11078 }
else if (IS_SCHEMA(
child,
"simpleType")) {
11079 xmlSchemaParseSimpleType(pctxt,
schema,
child, 1);
11080 }
else if (IS_SCHEMA(
child,
"complexType")) {
11081 xmlSchemaParseComplexType(pctxt,
schema,
child, 1);
11083 }
else if (IS_SCHEMA(
child,
"group")) {
11085 xmlSchemaParseModelGroupDefinition(pctxt,
11087 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
11089 xmlSchemaParseAttributeGroupDefinition(pctxt,
schema,
11094 pctxt->redefined =
NULL;
11095 pctxt->isRedefine = 0;
11097 if (IS_SCHEMA(
child,
"annotation")) {
11106 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11107 xmlSchemaPContentErr(pctxt,
res,
11109 "(annotation | (simpleType | complexType | group | attributeGroup))*");
11111 xmlSchemaPContentErr(pctxt,
res,
11119 return(pctxt->err);
11123xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11127#ifndef ENABLE_REDEFINE
11132 XML_SCHEMA_SCHEMA_REDEFINE);
11139xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11145 XML_SCHEMA_SCHEMA_INCLUDE);
11176static xmlSchemaTreeItemPtr
11177xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11178 xmlNodePtr
node, xmlSchemaTypeType
type,
11181 xmlSchemaModelGroupPtr
item;
11182 xmlSchemaParticlePtr particle =
NULL;
11185 int min = 1,
max = 1, isElemRef, hasRefs = 0;
11196 if (withParticle) {
11197 if (
type == XML_SCHEMA_TYPE_ALL) {
11198 min = xmlGetMinOccurs(ctxt,
node, 0, 1, 1,
"(0 | 1)");
11199 max = xmlGetMaxOccurs(ctxt,
node, 1, 1, 1,
"1");
11202 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
11203 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
11204 "(xs:nonNegativeInteger | unbounded)");
11210 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
11211 if (particle ==
NULL)
11213 particle->children = (xmlSchemaTreeItemPtr)
item;
11223 xmlSchemaPIllegalAttrErr(ctxt,
11227 xmlSchemaPIllegalAttrErr(ctxt,
11240 xmlSchemaPIllegalAttrErr(ctxt,
11244 xmlSchemaPIllegalAttrErr(ctxt,
11259 if (IS_SCHEMA(
child,
"annotation")) {
11260 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
11263 if (
type == XML_SCHEMA_TYPE_ALL) {
11264 xmlSchemaParticlePtr part,
last =
NULL;
11266 while (IS_SCHEMA(
child,
"element")) {
11267 part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
11274 if (part !=
NULL) {
11277 if (part->minOccurs > 1) {
11278 xmlSchemaPCustomErr(ctxt,
11281 "Invalid value for minOccurs (must be 0 or 1)",
11284 part->minOccurs = 1;
11286 if (part->maxOccurs > 1) {
11287 xmlSchemaPCustomErr(ctxt,
11290 "Invalid value for maxOccurs (must be 0 or 1)",
11293 part->maxOccurs = 1;
11296 item->children = (xmlSchemaTreeItemPtr) part;
11298 last->next = (xmlSchemaTreeItemPtr) part;
11304 xmlSchemaPContentErr(ctxt,
11307 "(annotation?, (annotation?, element*)");
11313 while ((IS_SCHEMA(
child,
"element")) ||
11314 (IS_SCHEMA(
child,
"group")) ||
11315 (IS_SCHEMA(
child,
"any")) ||
11316 (IS_SCHEMA(
child,
"choice")) ||
11317 (IS_SCHEMA(
child,
"sequence"))) {
11319 if (IS_SCHEMA(
child,
"element")) {
11320 part = (xmlSchemaTreeItemPtr)
11321 xmlSchemaParseElement(ctxt,
schema,
child, &isElemRef, 0);
11322 if (part && isElemRef)
11324 }
else if (IS_SCHEMA(
child,
"group")) {
11326 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11332 if (ctxt->isRedefine && ctxt->redef &&
11333 (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
11334 part && part->children)
11336 if ((xmlSchemaGetQNameRefName(part->children) ==
11337 ctxt->redef->refName) &&
11338 (xmlSchemaGetQNameRefTargetNs(part->children) ==
11339 ctxt->redef->refTargetNs))
11350 if (ctxt->redefCounter != 0) {
11353 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11355 "The redefining model group definition "
11356 "'%s' must not contain more than one "
11357 "reference to the redefined definition",
11358 xmlSchemaFormatQName(&
str,
11359 ctxt->redef->refTargetNs,
11360 ctxt->redef->refName),
11364 }
else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
11365 ((WXS_PARTICLE(part))->maxOccurs != 1))
11374 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11376 "The redefining model group definition "
11377 "'%s' must not contain a reference to the "
11378 "redefined definition with a "
11379 "maxOccurs/minOccurs other than 1",
11380 xmlSchemaFormatQName(&
str,
11381 ctxt->redef->refTargetNs,
11382 ctxt->redef->refName),
11387 ctxt->redef->reference = WXS_BASIC_CAST part;
11388 ctxt->redefCounter++;
11391 }
else if (IS_SCHEMA(
child,
"any")) {
11392 part = (xmlSchemaTreeItemPtr)
11394 }
else if (IS_SCHEMA(
child,
"choice")) {
11395 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11396 XML_SCHEMA_TYPE_CHOICE, 1);
11397 }
else if (IS_SCHEMA(
child,
"sequence")) {
11398 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11399 XML_SCHEMA_TYPE_SEQUENCE, 1);
11401 if (part !=
NULL) {
11403 item->children = part;
11411 xmlSchemaPContentErr(ctxt,
11414 "(annotation?, (element | group | choice | sequence | any)*)");
11417 if ((
max == 0) && (
min == 0))
11423 WXS_ADD_PENDING(ctxt,
item);
11426 return ((xmlSchemaTreeItemPtr) particle);
11428 return ((xmlSchemaTreeItemPtr)
item);
11442static xmlSchemaTypePtr
11443xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11444 xmlNodePtr
node, xmlSchemaTypeType parentType)
11446 xmlSchemaTypePtr
type;
11453 type = ctxt->ctxtType;
11454 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
11464 xmlSchemaPIllegalAttrErr(ctxt,
11468 xmlSchemaPIllegalAttrErr(ctxt,
11490 &(
type->baseNs), &(
type->base)) == 0)
11492 if ((
type->base ==
NULL) && (
type->type == XML_SCHEMA_TYPE_COMPLEX)) {
11493 xmlSchemaPMissingAttrErr(ctxt,
11496 }
else if ((ctxt->isRedefine) &&
11497 (
type->flags & XML_SCHEMAS_TYPE_GLOBAL))
11500 xmlSchemaPMissingAttrErr(ctxt,
11515 NULL,
node,
"This is a redefinition, but the QName "
11516 "value '%s' of the 'base' attribute does not match the "
11517 "type's designation '%s'",
11518 xmlSchemaFormatQName(&
str1,
type->baseNs,
type->base),
11519 xmlSchemaFormatQName(&
str2,
type->targetNamespace,
11521 FREE_AND_NULL(
str1);
11522 FREE_AND_NULL(
str2);
11533 if (IS_SCHEMA(
child,
"annotation")) {
11537 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11538 xmlSchemaParseAnnotation(ctxt,
child, 1));
11541 if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
11545 if (IS_SCHEMA(
child,
"simpleType")) {
11552 xmlSchemaPContentErr(ctxt,
11555 "The attribute 'base' and the <simpleType> child are "
11556 "mutually exclusive",
NULL);
11558 type->baseType = (xmlSchemaTypePtr)
11559 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11563 xmlSchemaPContentErr(ctxt,
11566 "Either the attribute 'base' or a <simpleType> child "
11567 "must be present",
NULL);
11569 }
else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11576 if (IS_SCHEMA(
child,
"all")) {
11577 type->subtypes = (xmlSchemaTypePtr)
11579 XML_SCHEMA_TYPE_ALL, 1);
11581 }
else if (IS_SCHEMA(
child,
"choice")) {
11582 type->subtypes = (xmlSchemaTypePtr)
11583 xmlSchemaParseModelGroup(ctxt,
11586 }
else if (IS_SCHEMA(
child,
"sequence")) {
11587 type->subtypes = (xmlSchemaTypePtr)
11589 XML_SCHEMA_TYPE_SEQUENCE, 1);
11594 }
else if (IS_SCHEMA(
child,
"group")) {
11595 type->subtypes = (xmlSchemaTypePtr)
11596 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11603 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11610 if (IS_SCHEMA(
child,
"simpleType")) {
11615 type->contentTypeDef = (xmlSchemaTypePtr)
11616 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11617 if (
type->contentTypeDef ==
NULL)
11623 if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
11624 (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
11625 xmlSchemaFacetPtr facet, lastfacet =
NULL;
11639 while ((IS_SCHEMA(
child,
"minInclusive")) ||
11640 (IS_SCHEMA(
child,
"minExclusive")) ||
11641 (IS_SCHEMA(
child,
"maxInclusive")) ||
11642 (IS_SCHEMA(
child,
"maxExclusive")) ||
11643 (IS_SCHEMA(
child,
"totalDigits")) ||
11644 (IS_SCHEMA(
child,
"fractionDigits")) ||
11645 (IS_SCHEMA(
child,
"pattern")) ||
11646 (IS_SCHEMA(
child,
"enumeration")) ||
11647 (IS_SCHEMA(
child,
"whiteSpace")) ||
11648 (IS_SCHEMA(
child,
"length")) ||
11649 (IS_SCHEMA(
child,
"maxLength")) ||
11650 (IS_SCHEMA(
child,
"minLength"))) {
11651 facet = xmlSchemaParseFacet(ctxt,
schema,
child);
11652 if (facet !=
NULL) {
11653 if (lastfacet ==
NULL)
11654 type->facets = facet;
11656 lastfacet->next = facet;
11658 lastfacet->next =
NULL;
11666 xmlSchemaFacetLinkPtr facetLink, lastFacetLink =
NULL;
11668 facet =
type->facets;
11670 facetLink = (xmlSchemaFacetLinkPtr)
11672 if (facetLink ==
NULL) {
11673 xmlSchemaPErrMemory(ctxt,
"allocating a facet link",
NULL);
11677 facetLink->facet = facet;
11678 facetLink->next =
NULL;
11679 if (lastFacetLink ==
NULL)
11680 type->facetSet = facetLink;
11682 lastFacetLink->
next = facetLink;
11683 lastFacetLink = facetLink;
11684 facet = facet->next;
11685 }
while (facet !=
NULL);
11688 if (
type->type == XML_SCHEMA_TYPE_COMPLEX) {
11692 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11693 (xmlSchemaItemListPtr *) &(
type->attrUses),
11694 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
11699 if (IS_SCHEMA(
child,
"anyAttribute")) {
11700 type->attributeWildcard =
11706 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11707 xmlSchemaPContentErr(ctxt,
11710 "annotation?, (group | all | choice | sequence)?, "
11711 "((attribute | attributeGroup)*, anyAttribute?))");
11712 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11713 xmlSchemaPContentErr(ctxt,
11716 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11717 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11718 "length | minLength | maxLength | enumeration | whiteSpace | "
11719 "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
11722 xmlSchemaPContentErr(ctxt,
11725 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11726 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11727 "length | minLength | maxLength | enumeration | whiteSpace | "
11746static xmlSchemaTypePtr
11747xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11748 xmlNodePtr
node, xmlSchemaTypeType parentType)
11750 xmlSchemaTypePtr
type;
11757 type = ctxt->ctxtType;
11758 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
11768 xmlSchemaPIllegalAttrErr(ctxt,
11772 xmlSchemaPIllegalAttrErr(ctxt,
11784 "base", &(
type->baseNs), &(
type->base)) == 0) &&
11786 xmlSchemaPMissingAttrErr(ctxt,
11794 if (IS_SCHEMA(
child,
"annotation")) {
11798 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11799 xmlSchemaParseAnnotation(ctxt,
child, 1));
11802 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11808 if (IS_SCHEMA(
child,
"all")) {
11809 type->subtypes = (xmlSchemaTypePtr)
11810 xmlSchemaParseModelGroup(ctxt,
schema,
11811 child, XML_SCHEMA_TYPE_ALL, 1);
11813 }
else if (IS_SCHEMA(
child,
"choice")) {
11814 type->subtypes = (xmlSchemaTypePtr)
11815 xmlSchemaParseModelGroup(ctxt,
schema,
11816 child, XML_SCHEMA_TYPE_CHOICE, 1);
11818 }
else if (IS_SCHEMA(
child,
"sequence")) {
11819 type->subtypes = (xmlSchemaTypePtr)
11820 xmlSchemaParseModelGroup(ctxt,
schema,
11821 child, XML_SCHEMA_TYPE_SEQUENCE, 1);
11823 }
else if (IS_SCHEMA(
child,
"group")) {
11824 type->subtypes = (xmlSchemaTypePtr)
11825 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11837 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11838 (xmlSchemaItemListPtr *) &(
type->attrUses),
11839 XML_SCHEMA_TYPE_EXTENSION,
NULL) == -1)
11844 if (IS_SCHEMA(
child,
"anyAttribute")) {
11845 ctxt->ctxtType->attributeWildcard =
11851 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11853 xmlSchemaPContentErr(ctxt,
11856 "(annotation?, ((group | all | choice | sequence)?, "
11857 "((attribute | attributeGroup)*, anyAttribute?)))");
11860 xmlSchemaPContentErr(ctxt,
11863 "(annotation?, ((attribute | attributeGroup)*, "
11864 "anyAttribute?))");
11882xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
11884 int *hasRestrictionOrExtension)
11886 xmlSchemaTypePtr
type;
11891 (hasRestrictionOrExtension ==
NULL))
11893 *hasRestrictionOrExtension = 0;
11895 type = ctxt->ctxtType;
11896 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
11904 xmlSchemaPIllegalAttrErr(ctxt,
11908 xmlSchemaPIllegalAttrErr(ctxt,
11920 if (IS_SCHEMA(
child,
"annotation")) {
11924 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11925 xmlSchemaParseAnnotation(ctxt,
child, 1));
11929 xmlSchemaPContentErr(ctxt,
11932 "(annotation?, (restriction | extension))");
11935 xmlSchemaPContentErr(ctxt,
11938 "(annotation?, (restriction | extension))");
11940 if (IS_SCHEMA(
child,
"restriction")) {
11942 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11943 (*hasRestrictionOrExtension) = 1;
11945 }
else if (IS_SCHEMA(
child,
"extension")) {
11947 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11948 (*hasRestrictionOrExtension) = 1;
11952 xmlSchemaPContentErr(ctxt,
11955 "(annotation?, (restriction | extension))");
11972xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
11974 int *hasRestrictionOrExtension)
11976 xmlSchemaTypePtr
type;
11981 (hasRestrictionOrExtension ==
NULL))
11983 *hasRestrictionOrExtension = 0;
11985 type = ctxt->ctxtType;
11995 xmlSchemaPIllegalAttrErr(ctxt,
11999 xmlSchemaPIllegalAttrErr(ctxt,
12010 if (xmlGetBooleanProp(ctxt,
node,
"mixed", 0)) {
12011 if ((
type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
12012 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12015 if (IS_SCHEMA(
child,
"annotation")) {
12019 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
12020 xmlSchemaParseAnnotation(ctxt,
child, 1));
12024 xmlSchemaPContentErr(ctxt,
12027 NULL,
"(annotation?, (restriction | extension))");
12030 xmlSchemaPContentErr(ctxt,
12033 NULL,
"(annotation?, (restriction | extension))");
12035 if (IS_SCHEMA(
child,
"restriction")) {
12037 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12038 (*hasRestrictionOrExtension) = 1;
12040 }
else if (IS_SCHEMA(
child,
"extension")) {
12042 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12043 (*hasRestrictionOrExtension) = 1;
12047 xmlSchemaPContentErr(ctxt,
12050 NULL,
"(annotation?, (restriction | extension))");
12066static xmlSchemaTypePtr
12067xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
12068 xmlNodePtr
node,
int topLevel)
12070 xmlSchemaTypePtr
type, ctxtType;
12075#ifdef ENABLE_NAMED_LOCALS
12078 int final = 0,
block = 0, hasRestrictionOrExtension = 0;
12084 ctxtType = ctxt->ctxtType;
12087 attr = xmlSchemaGetPropNode(
node,
"name");
12089 xmlSchemaPMissingAttrErr(ctxt,
12092 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
12093 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
12098 if (topLevel == 0) {
12102#ifdef ENABLE_NAMED_LOCALS
12105 XML_SCHEMA_TYPE_COMPLEX,
12107 ctxt->targetNamespace,
node, 0);
12110 XML_SCHEMA_TYPE_COMPLEX,
12111 NULL, ctxt->targetNamespace,
node, 0);
12117 type->type = XML_SCHEMA_TYPE_COMPLEX;
12126 XML_SCHEMA_TYPE_COMPLEX,
12127 name, ctxt->targetNamespace,
node, 1);
12131 type->type = XML_SCHEMA_TYPE_COMPLEX;
12132 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
12134 type->targetNamespace = ctxt->targetNamespace;
12150 if (xmlSchemaPGetBoolNodeValue(ctxt,
12152 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12153 }
else if (topLevel) {
12163 if (xmlSchemaPGetBoolNodeValue(ctxt,
12165 type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
12170 attrValue = xmlSchemaGetNodeContent(ctxt,
12171 (xmlNodePtr)
attr);
12172 if (xmlSchemaPValAttrBlockFinal(attrValue,
12175 XML_SCHEMAS_TYPE_FINAL_EXTENSION,
12176 XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
12179 xmlSchemaPSimpleTypeErr(ctxt,
12182 "(#all | List of (extension | restriction))",
12190 attrValue = xmlSchemaGetNodeContent(ctxt,
12191 (xmlNodePtr)
attr);
12192 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
12194 XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
12195 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
12196 -1, -1, -1) != 0) {
12197 xmlSchemaPSimpleTypeErr(ctxt,
12200 "(#all | List of (extension | restriction)) ",
12205 xmlSchemaPIllegalAttrErr(ctxt,
12209 xmlSchemaPIllegalAttrErr(ctxt,
12213 xmlSchemaPIllegalAttrErr(ctxt,
12222 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
12223 type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
12224 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
12225 type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
12231 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
12232 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
12233 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
12234 type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
12240 if (IS_SCHEMA(
child,
"annotation")) {
12241 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
12244 ctxt->ctxtType =
type;
12245 if (IS_SCHEMA(
child,
"simpleContent")) {
12252 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
12253 type->flags ^= XML_SCHEMAS_TYPE_MIXED;
12255 &hasRestrictionOrExtension);
12257 }
else if (IS_SCHEMA(
child,
"complexContent")) {
12261 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
12262 xmlSchemaParseComplexContent(ctxt,
schema,
child,
12263 &hasRestrictionOrExtension);
12275 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
12276 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
12280 if (IS_SCHEMA(
child,
"all")) {
12281 type->subtypes = (xmlSchemaTypePtr)
12283 XML_SCHEMA_TYPE_ALL, 1);
12285 }
else if (IS_SCHEMA(
child,
"choice")) {
12286 type->subtypes = (xmlSchemaTypePtr)
12288 XML_SCHEMA_TYPE_CHOICE, 1);
12290 }
else if (IS_SCHEMA(
child,
"sequence")) {
12291 type->subtypes = (xmlSchemaTypePtr)
12293 XML_SCHEMA_TYPE_SEQUENCE, 1);
12295 }
else if (IS_SCHEMA(
child,
"group")) {
12296 type->subtypes = (xmlSchemaTypePtr)
12297 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
12307 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
12308 (xmlSchemaItemListPtr *) &(
type->attrUses),
12309 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
12314 if (IS_SCHEMA(
child,
"anyAttribute")) {
12315 type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt,
schema,
child);
12320 xmlSchemaPContentErr(ctxt,
12323 NULL,
"(annotation?, (simpleContent | complexContent | "
12324 "((group | all | choice | sequence)?, ((attribute | "
12325 "attributeGroup)*, anyAttribute?))))");
12330 if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
12332 NULL,
node,
"This is a redefinition, thus the "
12333 "<complexType> must have a <restriction> or <extension> "
12334 "grand-child",
NULL);
12336 ctxt->ctxtType = ctxtType;
12364xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
12376 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
12392xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
12398 return (ctxt->options);
12411xmlSchemaParserCtxtPtr
12412xmlSchemaNewParserCtxt(
const char *URL)
12414 xmlSchemaParserCtxtPtr
ret;
12419 ret = xmlSchemaParserCtxtCreate();
12437xmlSchemaParserCtxtPtr
12438xmlSchemaNewMemParserCtxt(
const char *
buffer,
int size)
12440 xmlSchemaParserCtxtPtr
ret;
12444 ret = xmlSchemaParserCtxtCreate();
12462xmlSchemaParserCtxtPtr
12463xmlSchemaNewDocParserCtxt(xmlDocPtr doc)
12465 xmlSchemaParserCtxtPtr
ret;
12469 ret = xmlSchemaParserCtxtCreate();
12487xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
12491 if (ctxt->doc !=
NULL && !ctxt->preserve)
12492 xmlFreeDoc(ctxt->doc);
12493 if (ctxt->vctxt !=
NULL) {
12494 xmlSchemaFreeValidCtxt(ctxt->vctxt);
12496 if (ctxt->ownsConstructor && (ctxt->constructor !=
NULL)) {
12497 xmlSchemaConstructionCtxtFree(ctxt->constructor);
12498 ctxt->constructor =
NULL;
12499 ctxt->ownsConstructor = 0;
12501 if (ctxt->attrProhibs !=
NULL)
12502 xmlSchemaItemListFree(ctxt->attrProhibs);
12519xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
12520 xmlSchemaParticlePtr particle,
int counter, xmlAutomataStatePtr
end)
12522 xmlAutomataStatePtr
start, tmp;
12523 xmlSchemaElementPtr elemDecl,
member;
12524 xmlSchemaSubstGroupPtr substGroup;
12528 elemDecl = (xmlSchemaElementPtr) particle->children;
12532 start = pctxt->state;
12534 end = xmlAutomataNewState(pctxt->am);
12535 substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
12536 if (substGroup ==
NULL) {
12537 xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
12539 "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
12540 "declaration is marked having a subst. group but none "
12541 "available.\n", elemDecl->name,
NULL);
12552 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12553 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12557 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12558 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12559 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12562 }
else if (particle->maxOccurs == 1) {
12566 xmlAutomataNewEpsilon(pctxt->am,
12567 xmlAutomataNewTransition2(pctxt->am,
12569 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
end);
12573 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12574 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12588 tmp = xmlAutomataNewTransition2(pctxt->am,
start,
NULL,
12590 xmlAutomataNewEpsilon(pctxt->am, tmp,
end);
12593 xmlAutomataStatePtr hop;
12594 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12595 UNBOUNDED : particle->maxOccurs - 1;
12596 int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12599 xmlAutomataNewCounter(pctxt->am, minOccurs,
12601 hop = xmlAutomataNewState(pctxt->am);
12603 xmlAutomataNewEpsilon(pctxt->am,
12604 xmlAutomataNewTransition2(pctxt->am,
12606 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
12611 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12612 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12613 xmlAutomataNewEpsilon(pctxt->am,
12614 xmlAutomataNewTransition2(pctxt->am,
12619 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12620 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12622 if (particle->minOccurs == 0) {
12623 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12626 pctxt->state =
end;
12636xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
12637 xmlSchemaParticlePtr particle)
12641 if (((xmlSchemaElementPtr) particle->children)->flags &
12642 XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
12646 ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1,
NULL);
12648 xmlSchemaElementPtr elemDecl;
12649 xmlAutomataStatePtr
start;
12651 elemDecl = (xmlSchemaElementPtr) particle->children;
12653 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
12655 if (particle->maxOccurs == 1) {
12656 start = ctxt->state;
12657 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12658 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12659 }
else if ((particle->maxOccurs >= UNBOUNDED) &&
12660 (particle->minOccurs < 2)) {
12662 start = ctxt->state;
12663 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12664 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12665 ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
12666 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12669 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12670 UNBOUNDED : particle->maxOccurs - 1;
12671 int minOccurs = particle->minOccurs < 1 ?
12672 0 : particle->minOccurs - 1;
12674 start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
12675 counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
12676 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12677 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12678 xmlAutomataNewCountedTrans(ctxt->am, ctxt->state,
start,
counter);
12679 ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
12682 if (particle->minOccurs == 0) {
12683 xmlAutomataNewEpsilon(ctxt->am,
start, ctxt->state);
12701xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
12702 xmlSchemaParticlePtr particle)
12706 if (particle ==
NULL) {
12707 PERROR_INT(
"xmlSchemaBuildAContentModel",
"particle is NULL");
12710 if (particle->children ==
NULL) {
12718 switch (particle->children->type) {
12719 case XML_SCHEMA_TYPE_ANY: {
12721 xmlSchemaWildcardPtr wild;
12722 xmlSchemaWildcardNsPtr
ns;
12724 wild = (xmlSchemaWildcardPtr) particle->children;
12726 start = pctxt->state;
12727 end = xmlAutomataNewState(pctxt->am);
12729 if (particle->maxOccurs == 1) {
12730 if (wild->any == 1) {
12737 xmlAutomataNewTransition2(pctxt->am,
12739 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12744 xmlAutomataNewTransition2(pctxt->am,
12746 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12748 }
else if (wild->nsSet !=
NULL) {
12751 pctxt->state =
start;
12752 pctxt->state = xmlAutomataNewTransition2(pctxt->am,
12754 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12758 }
else if (wild->negNsSet !=
NULL) {
12759 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12765 xmlAutomataStatePtr hop;
12767 particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
12768 particle->maxOccurs - 1;
12770 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12772 counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12773 hop = xmlAutomataNewState(pctxt->am);
12774 if (wild->any == 1) {
12776 xmlAutomataNewTransition2(pctxt->am,
12778 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12780 xmlAutomataNewTransition2(pctxt->am,
12782 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12783 }
else if (wild->nsSet !=
NULL) {
12787 xmlAutomataNewTransition2(pctxt->am,
12789 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12793 }
else if (wild->negNsSet !=
NULL) {
12794 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12798 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12799 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12801 if (particle->minOccurs == 0) {
12802 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12805 pctxt->state =
end;
12808 case XML_SCHEMA_TYPE_ELEMENT:
12809 ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
12811 case XML_SCHEMA_TYPE_SEQUENCE:{
12812 xmlSchemaTreeItemPtr sub;
12819 if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
12820 sub = particle->children->children;
12822 while (sub !=
NULL) {
12823 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12824 (xmlSchemaParticlePtr) sub);
12825 if (tmp2 != 1)
ret = 0;
12829 xmlAutomataStatePtr oldstate = pctxt->state;
12831 if (particle->maxOccurs >= UNBOUNDED) {
12832 if (particle->minOccurs > 1) {
12833 xmlAutomataStatePtr tmp;
12836 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12838 oldstate = pctxt->state;
12840 counter = xmlAutomataNewCounter(pctxt->am,
12841 particle->minOccurs - 1, UNBOUNDED);
12843 sub = particle->children->children;
12844 while (sub !=
NULL) {
12845 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12846 (xmlSchemaParticlePtr) sub);
12847 if (tmp2 != 1)
ret = 0;
12850 tmp = pctxt->state;
12851 xmlAutomataNewCountedTrans(pctxt->am, tmp,
12854 xmlAutomataNewCounterTrans(pctxt->am, tmp,
12857 xmlAutomataNewEpsilon(pctxt->am,
12858 oldstate, pctxt->state);
12861 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12863 oldstate = pctxt->state;
12865 sub = particle->children->children;
12866 while (sub !=
NULL) {
12867 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12868 (xmlSchemaParticlePtr) sub);
12869 if (tmp2 != 1)
ret = 0;
12872 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
12879 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12880 pctxt->state,
NULL);
12881 if (particle->minOccurs == 0) {
12882 xmlAutomataNewEpsilon(pctxt->am,
12883 oldstate, pctxt->state);
12887 }
else if ((particle->maxOccurs > 1)
12888 || (particle->minOccurs > 1)) {
12889 xmlAutomataStatePtr tmp;
12892 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12894 oldstate = pctxt->state;
12896 counter = xmlAutomataNewCounter(pctxt->am,
12897 particle->minOccurs - 1,
12898 particle->maxOccurs - 1);
12900 sub = particle->children->children;
12901 while (sub !=
NULL) {
12902 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12903 (xmlSchemaParticlePtr) sub);
12904 if (tmp2 != 1)
ret = 0;
12907 tmp = pctxt->state;
12908 xmlAutomataNewCountedTrans(pctxt->am,
12911 xmlAutomataNewCounterTrans(pctxt->am, tmp,
NULL,
12913 if ((particle->minOccurs == 0) || (
ret == 1)) {
12914 xmlAutomataNewEpsilon(pctxt->am,
12915 oldstate, pctxt->state);
12919 sub = particle->children->children;
12920 while (sub !=
NULL) {
12921 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12922 (xmlSchemaParticlePtr) sub);
12923 if (tmp2 != 1)
ret = 0;
12932 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12933 pctxt->state,
NULL);
12935 if (particle->minOccurs == 0) {
12936 xmlAutomataNewEpsilon(pctxt->am, oldstate,
12944 case XML_SCHEMA_TYPE_CHOICE:{
12945 xmlSchemaTreeItemPtr sub;
12949 start = pctxt->state;
12950 end = xmlAutomataNewState(pctxt->am);
12956 if (particle->maxOccurs == 1) {
12957 sub = particle->children->children;
12958 while (sub !=
NULL) {
12959 pctxt->state =
start;
12960 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12961 (xmlSchemaParticlePtr) sub);
12962 if (tmp2 == 1)
ret = 1;
12963 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12968 xmlAutomataStatePtr hop,
base;
12969 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12970 UNBOUNDED : particle->maxOccurs - 1;
12972 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12979 xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12980 hop = xmlAutomataNewState(pctxt->am);
12981 base = xmlAutomataNewState(pctxt->am);
12983 sub = particle->children->children;
12984 while (sub !=
NULL) {
12985 pctxt->state =
base;
12986 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12987 (xmlSchemaParticlePtr) sub);
12988 if (tmp2 == 1)
ret = 1;
12989 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12992 xmlAutomataNewEpsilon(pctxt->am,
start,
base);
12993 xmlAutomataNewCountedTrans(pctxt->am, hop,
base,
counter);
12994 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12996 xmlAutomataNewEpsilon(pctxt->am,
base,
end);
12998 if (particle->minOccurs == 0) {
12999 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
13002 pctxt->state =
end;
13005 case XML_SCHEMA_TYPE_ALL:{
13006 xmlAutomataStatePtr
start, tmp;
13007 xmlSchemaParticlePtr sub;
13008 xmlSchemaElementPtr elemDecl;
13012 sub = (xmlSchemaParticlePtr) particle->children->children;
13018 start = pctxt->state;
13019 tmp = xmlAutomataNewState(pctxt->am);
13020 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
13021 pctxt->state = tmp;
13022 while (sub !=
NULL) {
13023 pctxt->state = tmp;
13025 elemDecl = (xmlSchemaElementPtr) sub->children;
13027 PERROR_INT(
"xmlSchemaBuildAContentModel",
13028 "<element> particle has no term");
13037 if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
13045 counter = xmlAutomataNewCounter(pctxt->am,
13046 sub->minOccurs, sub->maxOccurs);
13047 xmlSchemaBuildContentModelForSubstGroup(pctxt,
13050 if ((sub->minOccurs == 1) &&
13051 (sub->maxOccurs == 1)) {
13052 xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
13055 elemDecl->targetNamespace,
13057 }
else if ((sub->minOccurs == 0) &&
13058 (sub->maxOccurs == 1)) {
13060 xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
13063 elemDecl->targetNamespace,
13069 sub = (xmlSchemaParticlePtr) sub->next;
13072 xmlAutomataNewAllTrans(pctxt->am, pctxt->state,
NULL, 0);
13073 if (particle->minOccurs == 0) {
13074 xmlAutomataNewEpsilon(pctxt->am,
start, pctxt->state);
13079 case XML_SCHEMA_TYPE_GROUP:
13090 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
13091 "xmlSchemaBuildAContentModel",
13092 "found unexpected term of type '%s' in content model",
13093 WXS_ITEM_TYPE_NAME(particle->children),
NULL);
13108xmlSchemaBuildContentModel(xmlSchemaTypePtr
type,
13109 xmlSchemaParserCtxtPtr ctxt)
13111 if ((
type->type != XML_SCHEMA_TYPE_COMPLEX) ||
13113 ((
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
13114 (
type->contentType != XML_SCHEMA_CONTENT_MIXED)))
13118 ctxt->am = xmlNewAutomata();
13119 if (ctxt->am ==
NULL) {
13121 "Cannot create automata for complex type %s\n",
type->name);
13124 ctxt->state = xmlAutomataGetInitState(ctxt->am);
13128 xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(
type));
13129 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
13130 type->contModel = xmlAutomataCompile(ctxt->am);
13132 xmlSchemaPCustomErr(ctxt,
13135 "Failed to compile the content model",
NULL);
13137 }
else if (xmlRegexpIsDeterminist(
type->contModel) != 1) {
13138 xmlSchemaPCustomErr(ctxt,
13142 "The content model is not determinist",
NULL);
13146 ctxt->state =
NULL;
13147 xmlFreeAutomata(ctxt->am);
13161xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
13162 xmlSchemaParserCtxtPtr ctxt)
13164 if ((ctxt ==
NULL) || (elemDecl ==
NULL) ||
13165 ((elemDecl !=
NULL) &&
13166 (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
13168 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
13170 if ((elemDecl->subtypes ==
NULL) && (elemDecl->namedType !=
NULL)) {
13171 xmlSchemaTypePtr
type;
13176 type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
13177 elemDecl->namedTypeNs);
13179 xmlSchemaPResCompAttrErr(ctxt,
13181 WXS_BASIC_CAST elemDecl, elemDecl->node,
13182 "type", elemDecl->namedType, elemDecl->namedTypeNs,
13183 XML_SCHEMA_TYPE_BASIC,
"type definition");
13185 elemDecl->subtypes =
type;
13187 if (elemDecl->substGroup !=
NULL) {
13188 xmlSchemaElementPtr substHead;
13194 substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
13195 elemDecl->substGroupNs);
13196 if (substHead ==
NULL) {
13197 xmlSchemaPResCompAttrErr(ctxt,
13199 WXS_BASIC_CAST elemDecl,
NULL,
13200 "substitutionGroup", elemDecl->substGroup,
13201 elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT,
NULL);
13203 xmlSchemaResolveElementReferences(substHead, ctxt);
13208 WXS_SUBST_HEAD(elemDecl) = substHead;
13215 if (elemDecl->subtypes ==
NULL) {
13216 if (substHead->subtypes ==
NULL) {
13222 elemDecl->subtypes = xmlSchemaGetBuiltInType(
13223 XML_SCHEMAS_ANYTYPE);
13225 elemDecl->subtypes = substHead->subtypes;
13234 if ((elemDecl->subtypes ==
NULL) &&
13235 (elemDecl->namedType ==
NULL) &&
13236 (elemDecl->substGroup ==
NULL))
13237 elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
13252xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
13253 xmlSchemaTypePtr
type)
13256 xmlSchemaTypeLinkPtr
link, lastLink, newLink;
13257 xmlSchemaTypePtr memberType;
13275 nsName = ((xmlSchemaQNameRefPtr)
link->type)->targetNamespace;
13277 memberType = xmlSchemaGetType(ctxt->schema,
name, nsName);
13278 if ((memberType ==
NULL) || (! WXS_IS_SIMPLE(memberType))) {
13280 WXS_BASIC_CAST
type,
type->node,
"memberTypes",
13281 name, nsName, XML_SCHEMA_TYPE_SIMPLE,
NULL);
13285 if (lastLink ==
NULL)
13288 lastLink->next =
link->next;
13293 link->type = memberType;
13301 memberType =
type->subtypes;
13302 while (memberType !=
NULL) {
13303 link = (xmlSchemaTypeLinkPtr)
xmlMalloc(
sizeof(xmlSchemaTypeLink));
13305 xmlSchemaPErrMemory(ctxt,
"allocating a type link",
NULL);
13308 link->type = memberType;
13310 if (lastLink ==
NULL)
13313 lastLink->next =
link;
13315 memberType = memberType->next;
13331xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13335 if (WXS_IS_COMPLEX(
type))
13337 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13338 if (
type->builtInType == valType)
13340 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13341 (
type->builtInType == XML_SCHEMAS_ANYTYPE))
13343 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13345 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13360xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13364 if (WXS_IS_COMPLEX(
type))
13366 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13367 if (
type->builtInType == valType)
13371 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13376static xmlSchemaTypePtr
13377xmlSchemaQueryBuiltInType(xmlSchemaTypePtr
type)
13381 if (WXS_IS_COMPLEX(
type))
13383 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13385 return(xmlSchemaQueryBuiltInType(
type->subtypes));
13396static xmlSchemaTypePtr
13397xmlSchemaGetPrimitiveType(xmlSchemaTypePtr
type)
13405 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13406 (
type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
13422static xmlSchemaTypePtr
13423xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr
type)
13425 if (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))
13428 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13448xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
13449 xmlSchemaWildcardPtr
dest,
13450 xmlSchemaWildcardPtr
source)
13452 xmlSchemaWildcardNsPtr
cur, tmp,
last;
13460 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13463 tmp->value =
cur->value;
13472 xmlSchemaFreeWildcardNsSet(
dest->negNsSet);
13474 dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13477 dest->negNsSet->value =
source->negNsSet->value;
13495xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
13496 xmlSchemaWildcardPtr completeWild,
13497 xmlSchemaWildcardPtr curWild)
13499 xmlSchemaWildcardNsPtr
cur, curB, tmp;
13505 if ((completeWild->any == curWild->any) &&
13506 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13507 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13509 if ((completeWild->negNsSet ==
NULL) ||
13510 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13512 if (completeWild->nsSet !=
NULL) {
13518 cur = completeWild->nsSet;
13521 curB = curWild->nsSet;
13522 while (curB !=
NULL) {
13523 if (
cur->value == curB->value) {
13542 if (completeWild->any != curWild->any) {
13543 if (completeWild->any == 0) {
13544 completeWild->any = 1;
13545 if (completeWild->nsSet !=
NULL) {
13546 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13547 completeWild->nsSet =
NULL;
13549 if (completeWild->negNsSet !=
NULL) {
13550 xmlFree(completeWild->negNsSet);
13551 completeWild->negNsSet =
NULL;
13560 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13562 xmlSchemaWildcardNsPtr
start;
13564 cur = curWild->nsSet;
13565 start = completeWild->nsSet;
13569 while (curB !=
NULL) {
13570 if (
cur->value == curB->value) {
13577 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13580 tmp->value =
cur->value;
13581 tmp->next = completeWild->nsSet;
13582 completeWild->nsSet = tmp;
13593 if ((completeWild->negNsSet !=
NULL) &&
13594 (curWild->negNsSet !=
NULL) &&
13595 (completeWild->negNsSet->value != curWild->negNsSet->value)) {
13596 completeWild->negNsSet->value =
NULL;
13603 if (((completeWild->negNsSet !=
NULL) &&
13604 (completeWild->negNsSet->value !=
NULL) &&
13605 (curWild->nsSet !=
NULL)) ||
13606 ((curWild->negNsSet !=
NULL) &&
13607 (curWild->negNsSet->value !=
NULL) &&
13608 (completeWild->nsSet !=
NULL))) {
13610 int nsFound, absentFound = 0;
13612 if (completeWild->nsSet !=
NULL) {
13613 cur = completeWild->nsSet;
13614 curB = curWild->negNsSet;
13616 cur = curWild->nsSet;
13617 curB = completeWild->negNsSet;
13623 else if (
cur->value == curB->value)
13625 if (nsFound && absentFound)
13630 if (nsFound && absentFound) {
13635 completeWild->any = 1;
13636 if (completeWild->nsSet !=
NULL) {
13637 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13638 completeWild->nsSet =
NULL;
13640 if (completeWild->negNsSet !=
NULL) {
13641 xmlFree(completeWild->negNsSet);
13642 completeWild->negNsSet =
NULL;
13644 }
else if (nsFound && (!absentFound)) {
13650 if (completeWild->nsSet !=
NULL) {
13651 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13652 completeWild->nsSet =
NULL;
13654 if (completeWild->negNsSet ==
NULL) {
13655 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13656 if (completeWild->negNsSet ==
NULL)
13659 completeWild->negNsSet->value =
NULL;
13660 }
else if ((!nsFound) && absentFound) {
13665 xmlSchemaPErr(ctxt, completeWild->node,
13667 "The union of the wildcard is not expressible.\n",
13670 }
else if ((!nsFound) && (!absentFound)) {
13676 if (completeWild->negNsSet ==
NULL) {
13677 if (completeWild->nsSet !=
NULL) {
13678 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13679 completeWild->nsSet =
NULL;
13681 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13682 if (completeWild->negNsSet ==
NULL)
13684 completeWild->negNsSet->value = curWild->negNsSet->value;
13692 if (((completeWild->negNsSet !=
NULL) &&
13693 (completeWild->negNsSet->value ==
NULL) &&
13694 (curWild->nsSet !=
NULL)) ||
13695 ((curWild->negNsSet !=
NULL) &&
13696 (curWild->negNsSet->value ==
NULL) &&
13697 (completeWild->nsSet !=
NULL))) {
13699 if (completeWild->nsSet !=
NULL) {
13700 cur = completeWild->nsSet;
13702 cur = curWild->nsSet;
13710 completeWild->any = 1;
13711 if (completeWild->nsSet !=
NULL) {
13712 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13713 completeWild->nsSet =
NULL;
13715 if (completeWild->negNsSet !=
NULL) {
13716 xmlFree(completeWild->negNsSet);
13717 completeWild->negNsSet =
NULL;
13723 if (completeWild->negNsSet ==
NULL) {
13728 if (completeWild->nsSet !=
NULL) {
13729 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13730 completeWild->nsSet =
NULL;
13732 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13733 if (completeWild->negNsSet ==
NULL)
13735 completeWild->negNsSet->value =
NULL;
13755xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
13756 xmlSchemaWildcardPtr completeWild,
13757 xmlSchemaWildcardPtr curWild)
13759 xmlSchemaWildcardNsPtr
cur, curB, prev, tmp;
13765 if ((completeWild->any == curWild->any) &&
13766 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13767 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13769 if ((completeWild->negNsSet ==
NULL) ||
13770 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13772 if (completeWild->nsSet !=
NULL) {
13778 cur = completeWild->nsSet;
13781 curB = curWild->nsSet;
13782 while (curB !=
NULL) {
13783 if (
cur->value == curB->value) {
13802 if ((completeWild->any != curWild->any) && (completeWild->any)) {
13803 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13813 if (((completeWild->negNsSet !=
NULL) && (curWild->nsSet !=
NULL)) ||
13814 ((curWild->negNsSet !=
NULL) && (completeWild->nsSet !=
NULL))) {
13817 if (completeWild->nsSet ==
NULL) {
13818 neg = completeWild->negNsSet->value;
13819 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13822 neg = curWild->negNsSet->value;
13827 cur = completeWild->nsSet;
13831 completeWild->nsSet =
cur->next;
13833 prev->next =
cur->next;
13842 cur = completeWild->nsSet;
13844 if (
cur->value == neg) {
13846 completeWild->nsSet =
cur->next;
13848 prev->next =
cur->next;
13863 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13866 cur = completeWild->nsSet;
13870 curB = curWild->nsSet;
13871 while (curB !=
NULL) {
13872 if (
cur->value == curB->value) {
13880 completeWild->nsSet =
cur->next;
13882 prev->next =
cur->next;
13897 if ((completeWild->negNsSet !=
NULL) &&
13898 (curWild->negNsSet !=
NULL) &&
13899 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
13900 (completeWild->negNsSet->value !=
NULL) &&
13901 (curWild->negNsSet->value !=
NULL)) {
13904 "The intersection of the wildcard is not expressible.\n",
13913 if ((completeWild->negNsSet !=
NULL) && (curWild->negNsSet !=
NULL) &&
13914 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
13915 (completeWild->negNsSet->value ==
NULL)) {
13916 completeWild->negNsSet->value = curWild->negNsSet->value;
13933xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
13934 xmlSchemaWildcardPtr super)
13945 if ((sub->negNsSet !=
NULL) &&
13946 (super->negNsSet !=
NULL) &&
13947 (sub->negNsSet->value == super->negNsSet->value))
13952 if (sub->nsSet !=
NULL) {
13956 if (super->nsSet !=
NULL) {
13957 xmlSchemaWildcardNsPtr
cur, curB;
13963 curB = super->nsSet;
13964 while (curB !=
NULL) {
13965 if (
cur->value == curB->value) {
13977 }
else if (super->negNsSet !=
NULL) {
13978 xmlSchemaWildcardNsPtr
cur;
13985 if (
cur->value == super->negNsSet->value)
13996xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
13999 xmlSchemaValPtr *
val)
14006 if (attruse->defValue !=
NULL) {
14007 *
value = attruse->defValue;
14009 *
val = attruse->defVal;
14010 if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
14013 }
else if ((attruse->attrDecl !=
NULL) &&
14014 (attruse->attrDecl->defValue !=
NULL)) {
14015 *
value = attruse->attrDecl->defValue;
14017 *
val = attruse->attrDecl->defVal;
14018 if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
14036xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
14044 else if (wild->nsSet !=
NULL) {
14045 xmlSchemaWildcardNsPtr
cur;
14053 }
else if ((wild->negNsSet !=
NULL) && (
ns !=
NULL) &&
14060#define XML_SCHEMA_ACTION_DERIVE 0
14061#define XML_SCHEMA_ACTION_REDEFINE 1
14063#define WXS_ACTION_STR(a) \
14064((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
14078xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
14080 xmlSchemaBasicItemPtr
item,
14081 xmlSchemaBasicItemPtr baseItem,
14082 xmlSchemaItemListPtr uses,
14083 xmlSchemaItemListPtr baseUses,
14084 xmlSchemaWildcardPtr wild,
14085 xmlSchemaWildcardPtr baseWild)
14087 xmlSchemaAttributeUsePtr
cur =
NULL, bcur;
14092 if (uses !=
NULL) {
14093 for (
i = 0;
i < uses->nbItems;
i++) {
14094 cur = uses->items[
i];
14096 if (baseUses ==
NULL)
14098 for (
j = 0;
j < baseUses->nbItems;
j++) {
14099 bcur = baseUses->items[
j];
14100 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14101 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14102 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14103 WXS_ATTRUSE_DECL_TNS(bcur)))
14113 if ((
cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
14114 (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
14122 xmlSchemaPAttrUseErr4(pctxt,
14125 "The 'optional' attribute use is inconsistent "
14126 "with the corresponding 'required' attribute use of "
14129 xmlSchemaGetComponentDesignation(&
str, baseItem),
14131 FREE_AND_NULL(
str);
14133 }
else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
14134 WXS_ATTRUSE_TYPEDEF(
cur),
14135 WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
14145 xmlSchemaPAttrUseErr4(pctxt,
14148 "The attribute declaration's %s "
14149 "is not validly derived from "
14150 "the corresponding %s of the "
14151 "attribute declaration in the %s %s",
14152 xmlSchemaGetComponentDesignation(&
strA,
14153 WXS_ATTRUSE_TYPEDEF(
cur)),
14154 xmlSchemaGetComponentDesignation(&strB,
14155 WXS_ATTRUSE_TYPEDEF(bcur)),
14157 xmlSchemaGetComponentDesignation(&strC, baseItem));
14159 FREE_AND_NULL(
strA);
14160 FREE_AND_NULL(strB);
14161 FREE_AND_NULL(strC);
14170 xmlSchemaGetEffectiveValueConstraint(bcur,
14171 &effFixed, &bEffValue,
NULL);
14178 if ((bEffValue !=
NULL) &&
14182 xmlSchemaGetEffectiveValueConstraint(bcur,
14183 &effFixed, &rEffValue,
NULL);
14191 if ((effFixed == 0) ||
14192 (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
14196 xmlSchemaPAttrUseErr4(pctxt,
14199 "The effective value constraint of the "
14200 "attribute use is inconsistent with "
14201 "its correspondent in the %s %s",
14203 xmlSchemaGetComponentDesignation(&
str,
14206 FREE_AND_NULL(
str);
14223 if ((baseWild ==
NULL) ||
14224 (xmlSchemaCheckCVCWildcardNamespace(baseWild,
14225 (WXS_ATTRUSE_DECL(
cur))->targetNamespace) != 0))
14229 xmlSchemaPAttrUseErr4(pctxt,
14232 "Neither a matching attribute use, "
14233 "nor a matching wildcard exists in the %s %s",
14235 xmlSchemaGetComponentDesignation(&
str, baseItem),
14237 FREE_AND_NULL(
str);
14251 if (baseUses !=
NULL) {
14252 for (
j = 0;
j < baseUses->nbItems;
j++) {
14253 bcur = baseUses->items[
j];
14254 if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
14257 if (uses !=
NULL) {
14258 for (
i = 0;
i < uses->nbItems;
i++) {
14259 cur = uses->items[
i];
14260 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14261 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14262 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14263 WXS_ATTRUSE_DECL_TNS(bcur))) {
14272 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14275 "A matching attribute use for the "
14276 "'required' %s of the %s %s is missing",
14277 xmlSchemaGetComponentDesignation(&
strA, bcur),
14279 xmlSchemaGetComponentDesignation(&strB, baseItem),
14281 FREE_AND_NULL(
strA);
14282 FREE_AND_NULL(strB);
14289 if (wild !=
NULL) {
14294 if (baseWild ==
NULL) {
14300 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14303 "The %s has an attribute wildcard, "
14304 "but the %s %s '%s' does not have one",
14305 WXS_ITEM_TYPE_NAME(
item),
14307 WXS_ITEM_TYPE_NAME(baseItem),
14308 xmlSchemaGetComponentQName(&
str, baseItem));
14309 FREE_AND_NULL(
str);
14310 return(pctxt->err);
14311 }
else if ((baseWild->any == 0) &&
14312 xmlSchemaCheckCOSNSSubset(wild, baseWild))
14321 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14324 "The attribute wildcard is not a valid "
14325 "subset of the wildcard in the %s %s '%s'",
14327 WXS_ITEM_TYPE_NAME(baseItem),
14328 xmlSchemaGetComponentQName(&
str, baseItem),
14330 FREE_AND_NULL(
str);
14331 return(pctxt->err);
14340 if ((! WXS_IS_ANYTYPE(baseItem)) &&
14341 (wild->processContents < baseWild->processContents)) {
14343 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14346 "The {process contents} of the attribute wildcard is "
14347 "weaker than the one in the %s %s '%s'",
14349 WXS_ITEM_TYPE_NAME(baseItem),
14350 xmlSchemaGetComponentQName(&
str, baseItem),
14353 return(pctxt->err);
14361xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
14362 xmlSchemaBasicItemPtr
item,
14363 xmlSchemaWildcardPtr *completeWild,
14364 xmlSchemaItemListPtr
list,
14365 xmlSchemaItemListPtr prohibs);
14381xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
14382 xmlSchemaTypePtr
type)
14384 xmlSchemaTypePtr baseType =
NULL;
14385 xmlSchemaAttributeUsePtr use;
14386 xmlSchemaItemListPtr uses, baseUses, prohibs =
NULL;
14389 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14393 baseType =
type->baseType;
14394 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14395 if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
14398 uses =
type->attrUses;
14399 baseUses = baseType->attrUses;
14405 if (uses !=
NULL) {
14406 if (WXS_IS_RESTRICTION(
type)) {
14411 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14412 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14413 pctxt->attrProhibs) == -1)
14415 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14416 "failed to expand attributes");
14419 if (pctxt->attrProhibs->nbItems != 0)
14420 prohibs = pctxt->attrProhibs;
14422 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14423 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14426 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14427 "failed to expand attributes");
14435 if (baseUses !=
NULL) {
14437 xmlSchemaAttributeUseProhibPtr pro;
14439 if (WXS_IS_RESTRICTION(
type)) {
14441 xmlSchemaAttributeUsePtr tmp;
14444 usesCount = uses->nbItems;
14449 for (
i = 0;
i < baseUses->nbItems;
i++) {
14450 use = baseUses->items[
i];
14455 for (
j = 0;
j < prohibs->nbItems;
j++) {
14456 pro = prohibs->items[
j];
14457 if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
14458 (WXS_ATTRUSE_DECL_TNS(use) ==
14459 pro->targetNamespace))
14469 for (
j = 0;
j < usesCount;
j++) {
14470 tmp = uses->items[
j];
14471 if ((WXS_ATTRUSE_DECL_NAME(use) ==
14472 WXS_ATTRUSE_DECL_NAME(tmp)) &&
14473 (WXS_ATTRUSE_DECL_TNS(use) ==
14474 WXS_ATTRUSE_DECL_TNS(tmp)))
14480 if (uses ==
NULL) {
14481 type->attrUses = xmlSchemaItemListCreate();
14484 uses =
type->attrUses;
14486 xmlSchemaItemListAddSize(uses, 2, use);
14491 for (
i = 0;
i < baseUses->nbItems;
i++) {
14492 use = baseUses->items[
i];
14493 if (uses ==
NULL) {
14494 type->attrUses = xmlSchemaItemListCreate();
14497 uses =
type->attrUses;
14499 xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
14507 if (uses->nbItems == 0) {
14508 xmlSchemaItemListFree(uses);
14519 if (WXS_IS_EXTENSION(
type)) {
14520 if (baseType->attributeWildcard !=
NULL) {
14525 if (
type->attributeWildcard !=
NULL) {
14536 if (xmlSchemaUnionWildcards(pctxt,
type->attributeWildcard,
14537 baseType->attributeWildcard) == -1)
14544 type->attributeWildcard = baseType->attributeWildcard;
14581xmlSchemaTypeFinalContains(xmlSchemaTypePtr
type,
int final)
14585 if (
type->flags &
final)
14598static xmlSchemaTypeLinkPtr
14599xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type)
14601 while ((
type !=
NULL) && (
type->type == XML_SCHEMA_TYPE_SIMPLE)) {
14603 return (
type->memberTypes);
14621xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
14623 if ((particle->children ==
NULL) ||
14624 (particle->minOccurs == 0))
14626 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14628 xmlSchemaParticlePtr part =
14629 (xmlSchemaParticlePtr) particle->children->children;
14633 while (part !=
NULL) {
14634 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14635 (part->children->type == XML_SCHEMA_TYPE_ANY))
14636 cur = part->minOccurs;
14638 cur = xmlSchemaGetParticleTotalRangeMin(part);
14643 part = (xmlSchemaParticlePtr) part->next;
14645 return (particle->minOccurs *
min);
14649 xmlSchemaParticlePtr part =
14650 (xmlSchemaParticlePtr) particle->children->children;
14655 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14656 (part->children->type == XML_SCHEMA_TYPE_ANY))
14657 sum += part->minOccurs;
14659 sum += xmlSchemaGetParticleTotalRangeMin(part);
14660 part = (xmlSchemaParticlePtr) part->next;
14661 }
while (part !=
NULL);
14662 return (particle->minOccurs *
sum);
14676xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
14678 if ((particle->children ==
NULL) ||
14679 (particle->children->children ==
NULL))
14681 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14683 xmlSchemaParticlePtr part =
14684 (xmlSchemaParticlePtr) particle->children->children;
14686 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14687 if (part->children ==
NULL)
14689 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14690 (part->children->type == XML_SCHEMA_TYPE_ANY))
14691 cur = part->maxOccurs;
14693 cur = xmlSchemaGetParticleTotalRangeMax(part);
14694 if (
cur == UNBOUNDED)
14695 return (UNBOUNDED);
14700 return (particle->maxOccurs *
max);
14704 xmlSchemaParticlePtr part =
14705 (xmlSchemaParticlePtr) particle->children->children;
14707 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14708 if (part->children ==
NULL)
14710 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14711 (part->children->type == XML_SCHEMA_TYPE_ANY))
14712 cur = part->maxOccurs;
14714 cur = xmlSchemaGetParticleTotalRangeMax(part);
14715 if (
cur == UNBOUNDED)
14716 return (UNBOUNDED);
14717 if ((
cur > 0) && (particle->maxOccurs == UNBOUNDED))
14718 return (UNBOUNDED);
14722 return (particle->maxOccurs *
sum);
14734xmlSchemaGetParticleEmptiable(xmlSchemaParticlePtr particle)
14736 xmlSchemaParticlePtr part;
14739 if ((particle->children ==
NULL) || (particle->minOccurs == 0))
14742 part = (xmlSchemaParticlePtr) particle->children->children;
14746 while (part !=
NULL) {
14747 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14748 (part->children->type == XML_SCHEMA_TYPE_ANY))
14749 emptiable = (part->minOccurs == 0);
14751 emptiable = xmlSchemaGetParticleEmptiable(part);
14752 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14760 part = (xmlSchemaParticlePtr) part->next;
14763 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE)
14779xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
14784 if ((particle ==
NULL) || (particle->minOccurs == 0) ||
14785 (particle->children ==
NULL))
14791 if (WXS_IS_MODEL_GROUP(particle->children))
14792 return (xmlSchemaGetParticleEmptiable(particle));
14812xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
14813 xmlSchemaTypePtr
type,
14814 xmlSchemaTypePtr baseType,
14821 if (
type == baseType)
14832 if (WXS_IS_TYPE_NOT_FIXED(
type))
14833 if (xmlSchemaTypeFixup(
type, actxt) == -1)
14835 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14836 if (xmlSchemaTypeFixup(baseType, actxt) == -1)
14838 if ((subset & SUBSET_RESTRICTION) ||
14839 (xmlSchemaTypeFinalContains(
type->baseType,
14840 XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
14844 if (
type->baseType == baseType) {
14855 if ((! WXS_IS_ANYTYPE(
type->baseType)) &&
14856 (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
14857 baseType, subset) == 0)) {
14864 if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
14865 (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))) {
14876 if (WXS_IS_UNION(baseType)) {
14877 xmlSchemaTypeLinkPtr
cur;
14879 cur = baseType->memberTypes;
14881 if (WXS_IS_TYPE_NOT_FIXED(
cur->type))
14882 if (xmlSchemaTypeFixup(
cur->type, actxt) == -1)
14884 if (xmlSchemaCheckCOSSTDerivedOK(actxt,
14885 type,
cur->type, subset) == 0)
14912xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
14913 xmlSchemaTypePtr ctxtType,
14914 xmlSchemaTypePtr ancestor)
14918 if ((ancestor ==
NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
14921 if (ctxtType == ancestor) {
14922 xmlSchemaPCustomErr(pctxt,
14924 WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
14925 "The definition is circular",
NULL);
14928 if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
14934 ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
14935 ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
14936 ancestor->baseType);
14937 ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
14950xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr
item,
14951 xmlSchemaParserCtxtPtr ctxt)
14954 (
item->
type == XML_SCHEMA_TYPE_BASIC) ||
14957 xmlSchemaCheckTypeDefCircularInternal(ctxt,
item,
14975xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
14976 xmlSchemaTypePtr ctxType,
14977 xmlSchemaTypeLinkPtr members)
14979 xmlSchemaTypeLinkPtr
member;
14980 xmlSchemaTypePtr memberType;
14985 while ((memberType !=
NULL) &&
14986 (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
14987 if (memberType == ctxType) {
14988 xmlSchemaPCustomErr(pctxt,
14990 WXS_BASIC_CAST ctxType,
NULL,
14991 "The union type definition is circular",
NULL);
14994 if ((WXS_IS_UNION(memberType)) &&
14995 ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
14998 memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
14999 res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
15001 xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
15002 memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
15006 memberType = memberType->baseType;
15014xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
15015 xmlSchemaTypePtr
type)
15017 if (! WXS_IS_UNION(
type))
15019 return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
type,
15020 type->memberTypes));
15032xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
15033 xmlSchemaParserCtxtPtr ctxt)
15035 if (typeDef ==
NULL)
15041 if (typeDef->baseType ==
NULL) {
15042 typeDef->baseType = xmlSchemaGetType(ctxt->schema,
15043 typeDef->base, typeDef->baseNs);
15044 if (typeDef->baseType ==
NULL) {
15045 xmlSchemaPResCompAttrErr(ctxt,
15047 WXS_BASIC_CAST typeDef, typeDef->node,
15048 "base", typeDef->base, typeDef->baseNs,
15049 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15053 if (WXS_IS_SIMPLE(typeDef)) {
15054 if (WXS_IS_UNION(typeDef)) {
15058 xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
15060 }
else if (WXS_IS_LIST(typeDef)) {
15064 if ((typeDef->subtypes ==
NULL) && (typeDef->base !=
NULL)) {
15066 typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
15067 typeDef->base, typeDef->baseNs);
15069 if ((typeDef->subtypes ==
NULL) ||
15070 (! WXS_IS_SIMPLE(typeDef->subtypes)))
15072 typeDef->subtypes =
NULL;
15073 xmlSchemaPResCompAttrErr(ctxt,
15075 WXS_BASIC_CAST typeDef, typeDef->node,
15076 "itemType", typeDef->base, typeDef->baseNs,
15077 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15088 else if ((WXS_TYPE_CONTENTTYPE(typeDef) !=
NULL) &&
15089 ((WXS_TYPE_CONTENTTYPE(typeDef))->
type ==
15090 XML_SCHEMA_TYPE_PARTICLE) &&
15091 (WXS_TYPE_PARTICLE_TERM(typeDef) !=
NULL) &&
15092 ((WXS_TYPE_PARTICLE_TERM(typeDef))->
type ==
15093 XML_SCHEMA_EXTRA_QNAMEREF))
15095 xmlSchemaQNameRefPtr
ref =
15096 WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
15097 xmlSchemaModelGroupDefPtr groupDef;
15102 WXS_TYPE_PARTICLE_TERM(typeDef) =
NULL;
15107 WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
15109 if (groupDef ==
NULL) {
15111 NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
15115 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15116 }
else if (WXS_MODELGROUPDEF_MODEL(groupDef) ==
NULL)
15118 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15124 WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
15126 if (WXS_MODELGROUPDEF_MODEL(groupDef)->
type == XML_SCHEMA_TYPE_ALL) {
15133 if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
15134 xmlSchemaCustomErr(ACTXT_CAST ctxt,
15137 WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
NULL,
15138 "The particle's {max occurs} must be 1, since the "
15139 "reference resolves to an 'all' model group",
15161xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
15162 xmlSchemaTypePtr
type)
15164 xmlSchemaTypePtr baseType =
type->baseType;
15178 if (baseType ==
NULL) {
15183 xmlSchemaPCustomErr(ctxt,
15186 "No base type existent",
NULL);
15190 if (! WXS_IS_SIMPLE(baseType)) {
15191 xmlSchemaPCustomErr(ctxt,
15194 "The base type '%s' is not a simple type",
15195 xmlSchemaGetComponentQName(&
str, baseType));
15199 if ((WXS_IS_LIST(
type) || WXS_IS_UNION(
type)) &&
15200 (WXS_IS_RESTRICTION(
type) == 0) &&
15201 ((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) &&
15202 (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) {
15203 xmlSchemaPCustomErr(ctxt,
15206 "A type, derived by list or union, must have "
15207 "the simple ur-type definition as base type, not '%s'",
15208 xmlSchemaGetComponentQName(&
str, baseType));
15215 if ((! WXS_IS_ATOMIC(
type)) && (! WXS_IS_UNION(
type)) &&
15216 (! WXS_IS_LIST(
type))) {
15217 xmlSchemaPCustomErr(ctxt,
15220 "The variety is absent",
NULL);
15228 if (xmlSchemaTypeFinalContains(baseType,
15229 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15230 xmlSchemaPCustomErr(ctxt,
15233 "The 'final' of its base type '%s' must not contain "
15235 xmlSchemaGetComponentQName(&
str, baseType));
15266xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
15267 xmlSchemaTypePtr
type)
15271 if (
type->type != XML_SCHEMA_TYPE_SIMPLE) {
15272 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15273 "given type is not a user-derived simpleType");
15277 if (WXS_IS_ATOMIC(
type)) {
15278 xmlSchemaTypePtr primitive;
15283 if (! WXS_IS_ATOMIC(
type->baseType)) {
15284 xmlSchemaPCustomErr(pctxt,
15287 "The base type '%s' is not an atomic simple type",
15288 xmlSchemaGetComponentQName(&
str,
type->baseType));
15296 if (xmlSchemaTypeFinalContains(
type->baseType,
15297 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15298 xmlSchemaPCustomErr(pctxt,
15301 "The final of its base type '%s' must not contain 'restriction'",
15302 xmlSchemaGetComponentQName(&
str,
type->baseType));
15313 xmlSchemaFacetPtr facet;
15316 primitive = xmlSchemaGetPrimitiveType(
type);
15317 if (primitive ==
NULL) {
15318 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15319 "failed to get primitive type");
15322 facet =
type->facets;
15324 if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
15326 xmlSchemaPIllegalFacetAtomicErr(pctxt,
15328 type, primitive, facet);
15330 facet = facet->next;
15331 }
while (facet !=
NULL);
15344 }
else if (WXS_IS_LIST(
type)) {
15345 xmlSchemaTypePtr itemType =
NULL;
15347 itemType =
type->subtypes;
15348 if ((itemType ==
NULL) || (! WXS_IS_SIMPLE(itemType))) {
15349 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15350 "failed to evaluate the item type");
15353 if (WXS_IS_TYPE_NOT_FIXED(itemType))
15354 xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
15360 if ((! WXS_IS_ATOMIC(itemType)) &&
15361 (! WXS_IS_UNION(itemType))) {
15362 xmlSchemaPCustomErr(pctxt,
15365 "The item type '%s' does not have a variety of atomic or union",
15366 xmlSchemaGetComponentQName(&
str, itemType));
15369 }
else if (WXS_IS_UNION(itemType)) {
15370 xmlSchemaTypeLinkPtr
member;
15372 member = itemType->memberTypes;
15375 xmlSchemaPCustomErr(pctxt,
15378 "The item type is a union type, but the "
15379 "member type '%s' of this item type is not atomic",
15388 if (WXS_IS_ANY_SIMPLE_TYPE(
type->baseType)) {
15389 xmlSchemaFacetPtr facet;
15398 if (xmlSchemaTypeFinalContains(itemType,
15399 XML_SCHEMAS_TYPE_FINAL_LIST)) {
15400 xmlSchemaPCustomErr(pctxt,
15403 "The final of its item type '%s' must not contain 'list'",
15404 xmlSchemaGetComponentQName(&
str, itemType));
15415 facet =
type->facets;
15417 if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
15418 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15423 facet = facet->next;
15424 }
while (facet !=
NULL);
15442 if (! WXS_IS_LIST(
type->baseType)) {
15443 xmlSchemaPCustomErr(pctxt,
15446 "The base type '%s' must be a list type",
15447 xmlSchemaGetComponentQName(&
str,
type->baseType));
15455 if (xmlSchemaTypeFinalContains(
type->baseType,
15456 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15457 xmlSchemaPCustomErr(pctxt,
15460 "The 'final' of the base type '%s' must not contain 'restriction'",
15461 xmlSchemaGetComponentQName(&
str,
type->baseType));
15471 xmlSchemaTypePtr baseItemType;
15473 baseItemType =
type->baseType->subtypes;
15474 if ((baseItemType ==
NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
15475 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15476 "failed to eval the item type of a base type");
15479 if ((itemType != baseItemType) &&
15480 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
15481 baseItemType, 0) != 0)) {
15483 xmlSchemaPCustomErrExt(pctxt,
15486 "The item type '%s' is not validly derived from "
15487 "the item type '%s' of the base type '%s'",
15488 xmlSchemaGetComponentQName(&
str, itemType),
15489 xmlSchemaGetComponentQName(&strBIT, baseItemType),
15490 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15493 FREE_AND_NULL(strBIT)
15494 FREE_AND_NULL(strBT)
15500 xmlSchemaFacetPtr facet;
15506 facet =
type->facets;
15508 switch (facet->type) {
15509 case XML_SCHEMA_FACET_LENGTH:
15510 case XML_SCHEMA_FACET_MINLENGTH:
15511 case XML_SCHEMA_FACET_MAXLENGTH:
15512 case XML_SCHEMA_FACET_WHITESPACE:
15517 case XML_SCHEMA_FACET_PATTERN:
15518 case XML_SCHEMA_FACET_ENUMERATION:
15521 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15531 facet = facet->
next;
15532 }
while (facet !=
NULL);
15543 }
else if (WXS_IS_UNION(
type)) {
15548 xmlSchemaTypeLinkPtr
member;
15553 xmlSchemaTypeFixup(
member->
type, ACTXT_CAST pctxt);
15557 xmlSchemaPCustomErr(pctxt,
15560 "The member type '%s' is neither an atomic, nor a list type",
15571 if (
type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
15578 if (xmlSchemaTypeFinalContains(
member->
type,
15579 XML_SCHEMAS_TYPE_FINAL_UNION)) {
15580 xmlSchemaPCustomErr(pctxt,
15583 "The 'final' of member type '%s' contains 'union'",
15594 xmlSchemaPCustomErr(pctxt,
15597 "No facets allowed",
NULL);
15605 if (! WXS_IS_UNION(
type->baseType)) {
15606 xmlSchemaPCustomErr(pctxt,
15609 "The base type '%s' is not a union type",
15610 xmlSchemaGetComponentQName(&
str,
type->baseType));
15617 if (xmlSchemaTypeFinalContains(
type->baseType,
15618 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15619 xmlSchemaPCustomErr(pctxt,
15622 "The 'final' of its base type '%s' must not contain 'restriction'",
15623 xmlSchemaGetComponentQName(&
str,
type->baseType));
15634 xmlSchemaTypeLinkPtr baseMember;
15650 baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(
type->baseType);
15652 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15653 "different number of member types in base");
15656 if (baseMember ==
NULL) {
15657 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15658 "different number of member types in base");
15659 }
else if ((
member->
type != baseMember->type) &&
15660 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
15664 xmlSchemaPCustomErrExt(pctxt,
15667 "The member type %s is not validly "
15668 "derived from its corresponding member "
15669 "type %s of the base type %s",
15671 xmlSchemaGetComponentQName(&strBMT, baseMember->type),
15672 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15674 FREE_AND_NULL(strBMT)
15675 FREE_AND_NULL(strBT)
15679 if (baseMember !=
NULL)
15680 baseMember = baseMember->next;
15689 xmlSchemaFacetPtr facet;
15692 facet =
type->facets;
15694 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
15695 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
15696 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15701 facet = facet->
next;
15702 }
while (facet !=
NULL);
15732xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
15733 xmlSchemaTypePtr
type)
15740 if (WXS_IS_RESTRICTION(
type)) {
15750 }
else if (WXS_IS_LIST(
type)) {
15757 }
else if (WXS_IS_UNION(
type)) {
15767xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
15769 if (ctxt->vctxt ==
NULL) {
15770 ctxt->vctxt = xmlSchemaNewValidCtxt(
NULL);
15771 if (ctxt->vctxt ==
NULL) {
15772 xmlSchemaPErr(ctxt,
NULL,
15774 "Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
15775 "failed to create a temp. validation context.\n",
15780 xmlSchemaSetValidErrors(ctxt->vctxt,
15781 ctxt->error, ctxt->warning, ctxt->errCtxt);
15782 xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
15783 ctxt->serror, ctxt->errCtxt);
15789xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
15791 xmlSchemaTypePtr
type,
15793 xmlSchemaValPtr *retVal,
15815xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
15817 xmlSchemaTypePtr
type,
15819 xmlSchemaValPtr *
val)
15829 if WXS_IS_COMPLEX(
type) {
15839 if ((! WXS_HAS_SIMPLE_CONTENT(
type)) &&
15840 ((! WXS_HAS_MIXED_CONTENT(
type)) || (! WXS_EMPTIABLE(
type)))) {
15842 xmlSchemaPCustomErr(pctxt,
15845 "For a string to be a valid default, the type definition "
15846 "must be a simple type or a complex type with mixed content "
15847 "and a particle emptiable",
NULL);
15862 if (WXS_IS_SIMPLE(
type))
15863 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15865 else if (WXS_HAS_SIMPLE_CONTENT(
type))
15866 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15872 PERROR_INT(
"xmlSchemaParseCheckCOSValidDefault",
15873 "calling xmlSchemaVCheckCVCSimpleType()");
15893xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
15894 xmlSchemaTypePtr
type)
15905 (WXS_IS_SIMPLE(
type->baseType)) &&
15906 (WXS_IS_EXTENSION(
type) == 0)) {
15911 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15914 "If the base type is a simple type, the derivation method must be "
15931 if (
type->attrUses &&
15932 (((xmlSchemaItemListPtr)
type->attrUses)->nbItems > 1))
15934 xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr)
type->attrUses;
15935 xmlSchemaAttributeUsePtr use, tmp;
15936 int i,
j, hasId = 0;
15938 for (
i = uses->nbItems -1;
i >= 0;
i--) {
15939 use = uses->items[
i];
15948 for (
j =
i -1;
j >= 0;
j--) {
15949 tmp = uses->items[
j];
15950 if ((WXS_ATTRUSE_DECL_NAME(use) ==
15951 WXS_ATTRUSE_DECL_NAME(tmp)) &&
15952 (WXS_ATTRUSE_DECL_TNS(use) ==
15953 WXS_ATTRUSE_DECL_TNS(tmp)))
15957 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15961 xmlSchemaGetComponentDesignation(&
str, use),
15963 FREE_AND_NULL(
str);
15967 if (xmlSchemaItemListRemove(uses,
i) == -1)
15979 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
15980 if (xmlSchemaIsDerivedFromBuiltInType(
15981 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
15986 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15989 "There must not exist more than one attribute "
15990 "declaration of type 'xs:ID' "
15991 "(or derived from 'xs:ID'). The %s violates this "
15993 xmlSchemaGetComponentDesignation(&
str, use),
15995 FREE_AND_NULL(
str);
15996 if (xmlSchemaItemListRemove(uses,
i) == -1)
16012xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
16013 xmlSchemaTypePtr typeB)
16019 if ((typeA ==
NULL) || (typeB ==
NULL))
16021 return (typeA == typeB);
16040xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16041 xmlSchemaTypePtr
type,
16042 xmlSchemaTypePtr baseType,
16045 int equal = xmlSchemaAreEqualTypes(
type, baseType);
16058 if (((
set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(
type))) ||
16059 ((
set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(
type))))
16070 if (
type->baseType == baseType)
16076 if (WXS_IS_ANYTYPE(
type->baseType))
16079 if (WXS_IS_COMPLEX(
type->baseType)) {
16085 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type->baseType,
16093 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
16111xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16112 xmlSchemaTypePtr
type,
16113 xmlSchemaTypePtr baseType,
16116 if (WXS_IS_SIMPLE(
type))
16117 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type, baseType,
set));
16119 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type, baseType,
set));
16140xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
16141 xmlSchemaTypePtr
type)
16143 xmlSchemaTypePtr
base =
type->baseType;
16152 if (WXS_IS_COMPLEX(
base)) {
16157 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16158 xmlSchemaPCustomErr(ctxt,
16161 "The 'final' of the base type definition "
16162 "contains 'extension'",
NULL);
16186 xmlSchemaAttributeUsePtr use, buse;
16188 for (
i = 0;
i < (WXS_LIST_CAST
base->attrUses)->nbItems;
i ++) {
16189 buse = (WXS_LIST_CAST
base->attrUses)->
items[
i];
16192 use = (WXS_LIST_CAST
type->attrUses)->
items[
j];
16193 for (
j = 0;
j < (WXS_LIST_CAST
type->attrUses)->nbItems;
j ++)
16195 if ((WXS_ATTRUSE_DECL_NAME(use) ==
16196 WXS_ATTRUSE_DECL_NAME(buse)) &&
16197 (WXS_ATTRUSE_DECL_TNS(use) ==
16198 WXS_ATTRUSE_DECL_TNS(buse)) &&
16199 (WXS_ATTRUSE_TYPEDEF(use) ==
16200 WXS_ATTRUSE_TYPEDEF(buse))
16210 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16217 "This type is missing a matching correspondent "
16218 "for its {base type}'s %s in its {attribute uses}",
16219 xmlSchemaGetComponentDesignation(&
str,
16238 if (
base->attributeWildcard !=
NULL) {
16239 if (
type->attributeWildcard ==
NULL) {
16242 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16245 "The base %s has an attribute wildcard, "
16246 "but this type is missing an attribute wildcard",
16247 xmlSchemaGetComponentDesignation(&
str,
base));
16250 }
else if (xmlSchemaCheckCOSNSSubset(
16251 base->attributeWildcard,
type->attributeWildcard))
16255 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16258 "The attribute wildcard is not a valid "
16259 "superset of the one in the base %s",
16260 xmlSchemaGetComponentDesignation(&
str,
base));
16268 if ((
type->contentTypeDef !=
NULL) &&
16269 (
type->contentTypeDef ==
base->contentTypeDef)) {
16276 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
16277 (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
16293 xmlSchemaPCustomErr(ctxt,
16296 "The content type must specify a particle",
NULL);
16302 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16312 if ((
type->contentType !=
base->contentType) ||
16313 ((
type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
16314 (
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
16319 xmlSchemaPCustomErr(ctxt,
16322 "The content type of both, the type and its base "
16323 "type, must either 'mixed' or 'element-only'",
NULL);
16348 if (
type->contentTypeDef !=
base) {
16353 xmlSchemaPCustomErr(ctxt,
16356 "The content type must be the simple base type",
NULL);
16359 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16365 xmlSchemaPCustomErr(ctxt,
16368 "The 'final' of the base type definition "
16369 "contains 'extension'",
NULL);
16397xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
16398 xmlSchemaTypePtr
type)
16400 xmlSchemaTypePtr
base;
16407 if (! WXS_IS_COMPLEX(
base)) {
16408 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16411 "The base type must be a complex type",
NULL,
NULL);
16414 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
16419 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16422 "The 'final' of the base type definition "
16423 "contains 'restriction'",
NULL,
NULL);
16424 return (ctxt->err);
16432 if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
16433 XML_SCHEMA_ACTION_DERIVE,
16434 WXS_BASIC_CAST
type, WXS_BASIC_CAST
base,
16436 type->attributeWildcard,
16437 base->attributeWildcard) == -1)
16444 if (
base->builtInType == XML_SCHEMAS_ANYTYPE) {
16450 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16451 (
type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16458 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16459 (
base->contentType == XML_SCHEMA_CONTENT_BASIC))
16472 err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
16473 type->contentTypeDef,
base->contentTypeDef, 0);
16479 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16482 "The {content type} %s is not validly derived from the "
16483 "base type's {content type} %s",
16484 xmlSchemaGetComponentDesignation(&
strA,
16485 type->contentTypeDef),
16486 xmlSchemaGetComponentDesignation(&strB,
16487 base->contentTypeDef));
16488 FREE_AND_NULL(
strA);
16489 FREE_AND_NULL(strB);
16492 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16493 (xmlSchemaIsParticleEmptiable(
16494 (xmlSchemaParticlePtr)
base->subtypes))) {
16502 xmlSchemaPCustomErr(ctxt,
16505 "The content type of the base type must be either "
16506 "a simple type or 'mixed' and an emptiable particle",
NULL);
16507 return (ctxt->err);
16509 }
else if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16514 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16520 }
else if (((
base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16521 (
base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
16522 xmlSchemaIsParticleEmptiable(
16523 (xmlSchemaParticlePtr)
base->subtypes)) {
16531 xmlSchemaPCustomErr(ctxt,
16534 "The content type of the base type must be either "
16535 "empty or 'mixed' (or 'elements-only') and an emptiable "
16537 return (ctxt->err);
16539 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16540 WXS_HAS_MIXED_CONTENT(
type)) {
16545 if (WXS_HAS_MIXED_CONTENT(
type) && (! WXS_HAS_MIXED_CONTENT(
base))) {
16551 xmlSchemaPCustomErr(ctxt,
16554 "If the content type is 'mixed', then the content type of the "
16555 "base type must also be 'mixed'",
NULL);
16556 return (ctxt->err);
16567 xmlSchemaPCustomErr(ctxt,
16570 "The type is not a valid restriction of its base type",
NULL);
16571 return (ctxt->err);
16587xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
16588 xmlSchemaTypePtr
type)
16594 ret = xmlSchemaCheckCTPropsCorrect(ctxt,
type);
16597 if (WXS_IS_EXTENSION(
type))
16598 ret = xmlSchemaCheckCOSCTExtends(ctxt,
type);
16600 ret = xmlSchemaCheckDerivationOKRestriction(ctxt,
type);
16617xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
16618 xmlSchemaTypePtr
type)
16620 xmlSchemaTypePtr
base;
16628 if (! WXS_HAS_SIMPLE_CONTENT(
type)) {
16634 if (! WXS_IS_COMPLEX(
base)) {
16636 xmlSchemaPCustomErr(ctxt,
16639 "If using <complexContent>, the base type is expected to be "
16640 "a complex type. The base type '%s' is a simple type",
16641 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16654 if (WXS_IS_SIMPLE(
base)) {
16655 if (WXS_IS_EXTENSION(
type) == 0) {
16662 xmlSchemaPCustomErr(ctxt,
16665 "If using <simpleContent> and <restriction>, the base "
16666 "type must be a complex type. The base type '%s' is "
16668 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16675 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16676 (
base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16682 if (
base->contentTypeDef ==
NULL) {
16685 "Internal error: xmlSchemaCheckSRCCT, "
16686 "'%s', base type has no content type",
16690 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16691 (WXS_IS_RESTRICTION(
type))) {
16698 if (! xmlSchemaIsParticleEmptiable(
16699 (xmlSchemaParticlePtr)
base->subtypes)) {
16706 if (
type->contentTypeDef ==
NULL) {
16714 xmlSchemaPCustomErr(ctxt,
16717 "A <simpleType> is expected among the children "
16718 "of <restriction>, if <simpleContent> is used and "
16719 "the base type '%s' is a complex type",
16720 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16731 if (WXS_IS_RESTRICTION(
type)) {
16732 xmlSchemaPCustomErr(ctxt,
16735 "If <simpleContent> and <restriction> is used, the "
16736 "base type must be a simple type or a complex type with "
16737 "mixed content and particle emptiable. The base type "
16738 "'%s' is none of those",
16739 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16742 xmlSchemaPCustomErr(ctxt,
16745 "If <simpleContent> and <extension> is used, the "
16746 "base type must be a simple type. The base type '%s' "
16747 "is a complex type",
16748 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16770#ifdef ENABLE_PARTICLE_RESTRICTION
16786xmlSchemaCheckParticleRangeOK(
int rmin,
int rmax,
16787 int bmin,
int bmax)
16791 if ((bmax != UNBOUNDED) &&
16816xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
16817 xmlSchemaParticlePtr
r,
16818 xmlSchemaParticlePtr
b)
16820 xmlSchemaElementPtr elemR, elemB;
16823 elemR = (xmlSchemaElementPtr)
r->children;
16824 elemB = (xmlSchemaElementPtr)
b->children;
16829 if ((elemR != elemB) &&
16831 (!
xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
16837 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
16838 b->minOccurs,
b->maxOccurs) != 0)
16844 if (elemR == elemB)
16849 if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
16850 (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
16857 if ((elemB->value !=
NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
16858 ((elemR->value ==
NULL) ||
16859 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
16868 if (elemB->idcs !=
NULL) {
16875 if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
16876 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
16877 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
16878 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
16879 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
16880 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
16894 set |= SUBSET_EXTENSION;
16895 set |= SUBSET_LIST;
16896 set |= SUBSET_UNION;
16897 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
16898 elemB->subtypes,
set) != 0)
16921xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
16922 xmlSchemaParticlePtr
r,
16923 xmlSchemaParticlePtr
b)
16934 if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr)
b->children,
16935 ((xmlSchemaElementPtr)
r->children)->targetNamespace) != 0)
16941 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
16942 b->minOccurs,
b->maxOccurs) != 0)
16965xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
16966 xmlSchemaParticlePtr
r,
16967 xmlSchemaParticlePtr
b)
16991xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
16992 xmlSchemaParticlePtr
r,
16993 xmlSchemaParticlePtr
b,
17001 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17002 b->minOccurs,
b->maxOccurs))
17008 if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr)
r->children,
17009 (xmlSchemaWildcardPtr)
b->children))
17017 if (! isAnyTypeBase) {
17018 if ( ((xmlSchemaWildcardPtr)
r->children)->processContents <
17019 ((xmlSchemaWildcardPtr)
b->children)->processContents)
17041xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
17042 xmlSchemaParticlePtr
r,
17043 xmlSchemaParticlePtr
b)
17082xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
17083 xmlSchemaParticlePtr
r,
17084 xmlSchemaParticlePtr
b)
17086 xmlSchemaParticlePtr part;
17088 if ((
r->children ==
NULL) || (
r->children->children ==
NULL))
17098 part = (xmlSchemaParticlePtr)
r->children->children;
17100 if (xmlSchemaCheckCOSParticleRestrict(ctxt, part,
b))
17102 part = (xmlSchemaParticlePtr) part->next;
17103 }
while (part !=
NULL);
17109 if (xmlSchemaCheckParticleRangeOK(
17110 xmlSchemaGetParticleTotalRangeMin(
r),
17111 xmlSchemaGetParticleTotalRangeMax(
r),
17112 b->minOccurs,
b->maxOccurs) != 0)
17137xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
17138 xmlSchemaParticlePtr
r,
17139 xmlSchemaParticlePtr
b)
17143 if ((
r->children ==
NULL) || (
b->children ==
NULL) ||
17144 (
r->children->type !=
b->children->type))
17153 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17154 b->minOccurs,
b->maxOccurs))
17163#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
17164 xmlSchemaPCustomErrExt(pctxt, \
17165 XML_SCHEMAP_INVALID_FACET_VALUE, \
17166 WXS_BASIC_CAST fac1, fac1->node, \
17167 "It is an error for both '%s' and '%s' to be specified on the "\
17168 "same type definition", \
17169 BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
17170 BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
17172#define FACET_RESTR_ERR(fac1, msg) \
17173 xmlSchemaPCustomErr(pctxt, \
17174 XML_SCHEMAP_INVALID_FACET_VALUE, \
17175 WXS_BASIC_CAST fac1, fac1->node, \
17178#define FACET_RESTR_FIXED_ERR(fac) \
17179 xmlSchemaPCustomErr(pctxt, \
17180 XML_SCHEMAP_INVALID_FACET_VALUE, \
17181 WXS_BASIC_CAST fac, fac->node, \
17182 "The base type's facet is 'fixed', thus the value must not " \
17186xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
17187 xmlSchemaFacetPtr facet1,
17188 xmlSchemaFacetPtr facet2,
17198 if (lessGreater == 0)
17200 if (lessGreater == 1)
17214 xmlSchemaPCustomErr(pctxt,
17216 WXS_BASIC_CAST facet1,
NULL,
17230xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
17231 xmlSchemaTypePtr
type)
17233 xmlSchemaTypePtr
base =
type->baseType;
17235 xmlSchemaFacetPtr facet, bfacet,
17279 facet =
cur->facet;
17280 switch (facet->type) {
17281 case XML_SCHEMA_FACET_LENGTH:
17282 flength = facet;
break;
17283 case XML_SCHEMA_FACET_MINLENGTH:
17284 fminlen = facet;
break;
17285 case XML_SCHEMA_FACET_MININCLUSIVE:
17286 fmininc = facet;
break;
17287 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17288 fminexc = facet;
break;
17289 case XML_SCHEMA_FACET_MAXLENGTH:
17290 fmaxlen = facet;
break;
17291 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17292 fmaxinc = facet;
break;
17293 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17294 fmaxexc = facet;
break;
17295 case XML_SCHEMA_FACET_TOTALDIGITS:
17296 ftotdig = facet;
break;
17297 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17298 ffracdig = facet;
break;
17304 facet =
cur->facet;
17305 switch (facet->type) {
17306 case XML_SCHEMA_FACET_LENGTH:
17307 bflength = facet;
break;
17308 case XML_SCHEMA_FACET_MINLENGTH:
17309 bfminlen = facet;
break;
17310 case XML_SCHEMA_FACET_MININCLUSIVE:
17311 bfmininc = facet;
break;
17312 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17313 bfminexc = facet;
break;
17314 case XML_SCHEMA_FACET_MAXLENGTH:
17315 bfmaxlen = facet;
break;
17316 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17317 bfmaxinc = facet;
break;
17318 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17319 bfmaxexc = facet;
break;
17320 case XML_SCHEMA_FACET_TOTALDIGITS:
17321 bftotdig = facet;
break;
17322 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17323 bffracdig = facet;
break;
17331 if (flength && (fminlen || fmaxlen)) {
17332 FACET_RESTR_ERR(flength,
"It is an error for both 'length' and "
17333 "either of 'minLength' or 'maxLength' to be specified on "
17334 "the same type definition")
17339 if ((fmaxinc) && (fmaxexc)) {
17343 FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
17345 if ((fmininc) && (fminexc)) {
17349 FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
17352 if (flength && bflength) {
17357 res = xmlSchemaCompareValues(flength->val, bflength->val);
17359 goto internal_error;
17361 xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
17362 if ((
res != 0) && (bflength->fixed)) {
17363 FACET_RESTR_FIXED_ERR(flength)
17367 if (fminlen && bfminlen) {
17372 res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
17374 goto internal_error;
17376 xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
17377 if ((
res != 0) && (bfminlen->fixed)) {
17378 FACET_RESTR_FIXED_ERR(fminlen)
17381 if (fmaxlen && bfmaxlen) {
17386 res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
17388 goto internal_error;
17390 xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
17391 if ((
res != 0) && (bfmaxlen->fixed)) {
17392 FACET_RESTR_FIXED_ERR(fmaxlen)
17399 flength = bflength;
17402 fminlen = bfminlen;
17405 res = xmlSchemaCompareValues(flength->val, fminlen->val);
17407 goto internal_error;
17409 xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
17412 fmaxlen = bfmaxlen;
17415 res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
17417 goto internal_error;
17419 xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
17428 res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
17430 goto internal_error;
17432 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
17440 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
17442 goto internal_error;
17444 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
17445 if ((
res != 0) && (bfmaxinc->fixed)) {
17446 FACET_RESTR_FIXED_ERR(fmaxinc)
17451 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
17453 goto internal_error;
17455 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
17460 res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
17462 goto internal_error;
17464 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
17469 res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
17471 goto internal_error;
17473 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
17482 res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
17484 goto internal_error;
17486 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
17494 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
17496 goto internal_error;
17498 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
17500 if ((
res != 0) && (bfmaxexc->fixed)) {
17501 FACET_RESTR_FIXED_ERR(fmaxexc)
17506 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
17508 goto internal_error;
17510 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
17515 res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
17517 goto internal_error;
17519 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
17524 res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
17526 goto internal_error;
17528 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
17537 res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
17539 goto internal_error;
17541 xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
17549 res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
17551 goto internal_error;
17553 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
17555 if ((
res != 0) && (bfminexc->fixed)) {
17556 FACET_RESTR_FIXED_ERR(fminexc)
17561 res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
17563 goto internal_error;
17565 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
17570 res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
17572 goto internal_error;
17574 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
17579 res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
17581 goto internal_error;
17583 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
17592 res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
17594 goto internal_error;
17596 xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
17604 res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
17606 goto internal_error;
17608 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
17610 if ((
res != 0) && (bfmininc->fixed)) {
17611 FACET_RESTR_FIXED_ERR(fmininc)
17616 res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
17618 goto internal_error;
17620 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
17625 res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
17627 goto internal_error;
17629 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
17633 res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
17635 goto internal_error;
17637 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
17640 if (ftotdig && bftotdig) {
17645 res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
17647 goto internal_error;
17649 xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
17651 if ((
res != 0) && (bftotdig->fixed)) {
17652 FACET_RESTR_FIXED_ERR(ftotdig)
17655 if (ffracdig && bffracdig) {
17660 res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
17662 goto internal_error;
17664 xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
17666 if ((
res != 0) && (bffracdig->fixed)) {
17667 FACET_RESTR_FIXED_ERR(ffracdig)
17674 ftotdig = bftotdig;
17676 ffracdig = bffracdig;
17677 if (ftotdig && ffracdig) {
17678 res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
17680 goto internal_error;
17682 xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
17697 bfacet =
cur->facet;
17702 if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
17703 (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
17712 facet =
link->facet;
17713 if (facet->type == bfacet->type) {
17714 switch (facet->type) {
17715 case XML_SCHEMA_FACET_WHITESPACE:
17719 if (facet->whitespace < bfacet->whitespace) {
17720 FACET_RESTR_ERR(facet,
17721 "The 'whitespace' value has to be equal to "
17722 "or stronger than the 'whitespace' value of "
17725 if ((bfacet->fixed) &&
17726 (facet->whitespace != bfacet->whitespace)) {
17727 FACET_RESTR_FIXED_ERR(facet)
17743 link = (xmlSchemaFacetLinkPtr)
17746 xmlSchemaPErrMemory(pctxt,
17747 "deriving facets, creating a facet link",
NULL);
17763 PERROR_INT(
"xmlSchemaDeriveAndValidateFacets",
17764 "an error occurred");
17769xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
17770 xmlSchemaTypePtr
type)
17772 xmlSchemaTypeLinkPtr
link, lastLink, prevLink, subLink, newLink;
17785 if (WXS_IS_TYPE_NOT_FIXED(
link->type))
17786 xmlSchemaTypeFixup(
link->type, ACTXT_CAST pctxt);
17788 if (WXS_IS_UNION(
link->type)) {
17789 subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
link->type);
17790 if (subLink !=
NULL) {
17791 link->type = subLink->type;
17792 if (subLink->next !=
NULL) {
17793 lastLink =
link->next;
17794 subLink = subLink->next;
17796 while (subLink !=
NULL) {
17797 newLink = (xmlSchemaTypeLinkPtr)
17799 if (newLink ==
NULL) {
17800 xmlSchemaPErrMemory(pctxt,
"allocating a type link",
17804 newLink->type = subLink->type;
17805 prevLink->next = newLink;
17806 prevLink = newLink;
17807 newLink->next = lastLink;
17809 subLink = subLink->next;
17820xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr
type)
17822 int has = 0, needVal = 0, normVal = 0;
17824 has = (
type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
17826 needVal = (
type->baseType->flags &
17827 XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
17828 normVal = (
type->baseType->flags &
17829 XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
17832 xmlSchemaFacetPtr fac;
17834 for (fac =
type->facets; fac !=
NULL; fac = fac->
next) {
17835 switch (fac->type) {
17836 case XML_SCHEMA_FACET_WHITESPACE:
17838 case XML_SCHEMA_FACET_PATTERN:
17842 case XML_SCHEMA_FACET_ENUMERATION:
17854 type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
17856 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17858 type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
17860 if (has && (! needVal) && WXS_IS_ATOMIC(
type)) {
17861 xmlSchemaTypePtr
prim = xmlSchemaGetPrimitiveType(
type);
17865 if ((
prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
17866 (
prim->builtInType != XML_SCHEMAS_STRING)) {
17867 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17873xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr
type)
17880 if (WXS_IS_LIST(
type)) {
17881 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17883 }
else if (WXS_IS_UNION(
type))
17887 xmlSchemaFacetLinkPtr lin;
17889 for (lin =
type->facetSet; lin !=
NULL; lin = lin->
next) {
17890 if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
17891 switch (lin->facet->whitespace) {
17892 case XML_SCHEMAS_FACET_PRESERVE:
17893 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17895 case XML_SCHEMAS_FACET_REPLACE:
17896 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17898 case XML_SCHEMAS_FACET_COLLAPSE:
17899 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17914 xmlSchemaTypePtr anc;
17916 for (anc =
type->baseType; anc !=
NULL &&
17917 anc->builtInType != XML_SCHEMAS_ANYTYPE;
17918 anc = anc->baseType) {
17920 if (anc->type == XML_SCHEMA_TYPE_BASIC) {
17921 if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
17922 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17924 }
else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
17925 (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
17926 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17929 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17938xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
17939 xmlSchemaTypePtr
type)
17941 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
17943 if (! WXS_IS_TYPE_NOT_FIXED_1(
type))
17945 type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
17947 if (WXS_IS_LIST(
type)) {
17955 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17956 "list type has no item-type assigned");
17959 }
else if (WXS_IS_UNION(
type)) {
17967 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17968 "union type has no member-types assigned");
17976 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17977 "type has no base-type assigned");
17980 if (WXS_IS_TYPE_NOT_FIXED_1(
type->baseType))
17981 if (xmlSchemaFixupSimpleTypeStageOne(pctxt,
type->baseType) == -1)
17988 if (WXS_IS_ATOMIC(
type->baseType))
17989 type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
17990 else if (WXS_IS_LIST(
type->baseType)) {
17991 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
17995 type->subtypes =
type->baseType->subtypes;
17996 }
else if (WXS_IS_UNION(
type->baseType)) {
17997 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
18012xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
18013 xmlSchemaTypePtr
type)
18015 int res, olderrs = pctxt->nberrors;
18017 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
18020 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18023 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18024 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
18027 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageTwo",
18028 "missing baseType");
18031 if (WXS_IS_TYPE_NOT_FIXED(
type->baseType))
18032 xmlSchemaTypeFixup(
type->baseType, ACTXT_CAST pctxt);
18039 if ((
type->memberTypes !=
NULL) &&
18040 (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt,
type) == -1))
18052 res = xmlSchemaCheckSTPropsCorrect(pctxt,
type);
18058 res = xmlSchemaCheckCOSSTRestricts(pctxt,
type);
18075 res = xmlSchemaCheckFacetValues(
type, pctxt);
18078 (
type->baseType->facetSet !=
NULL)) {
18079 res = xmlSchemaDeriveAndValidateFacets(pctxt,
type);
18085 res = xmlSchemaTypeFixupWhitespace(
type);
18087 xmlSchemaTypeFixupOptimFacets(
type);
18090 if (olderrs != pctxt->nberrors)
18091 return(pctxt->err);
18099xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
18100 xmlSchemaTypePtr
type)
18102 int res = 0, olderrs = pctxt->nberrors;
18103 xmlSchemaTypePtr baseType =
type->baseType;
18105 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18107 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18108 if (baseType ==
NULL) {
18109 PERROR_INT(
"xmlSchemaFixupComplexType",
18110 "missing baseType");
18116 if (WXS_IS_TYPE_NOT_FIXED(baseType))
18117 xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
18118 if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
18128 res = xmlSchemaCheckSRCCT(pctxt,
type);
18133 if (
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
18137 if ((WXS_IS_COMPLEX(baseType)) &&
18138 (baseType->contentTypeDef !=
NULL) &&
18139 (WXS_IS_RESTRICTION(
type))) {
18140 xmlSchemaTypePtr contentBase,
content;
18141#ifdef ENABLE_NAMED_LOCALS
18149 if (
type->contentTypeDef !=
NULL) {
18157 contentBase =
type->contentTypeDef;
18165 contentBase = baseType->contentTypeDef;
18176#ifdef ENABLE_NAMED_LOCALS
18177 snprintf(
buf, 29,
"#scST%d", ++(pctxt->counter));
18179 content = xmlSchemaAddType(pctxt, pctxt->schema,
18180 XML_SCHEMA_TYPE_SIMPLE, tmpname,
type->targetNamespace,
18183 content = xmlSchemaAddType(pctxt, pctxt->schema,
18184 XML_SCHEMA_TYPE_SIMPLE,
NULL,
type->targetNamespace,
18193 content->type = XML_SCHEMA_TYPE_SIMPLE;
18194 content->baseType = contentBase;
18205 if (WXS_IS_TYPE_NOT_FIXED(contentBase))
18206 xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
18211 res = xmlSchemaFixupSimpleTypeStageOne(pctxt,
content);
18213 res = xmlSchemaFixupSimpleTypeStageTwo(pctxt,
content);
18216 }
else if ((WXS_IS_COMPLEX(baseType)) &&
18217 (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
18218 (WXS_IS_RESTRICTION(
type))) {
18224 if ((
type->contentTypeDef ==
NULL) ||
18225 (
type->contentTypeDef->baseType ==
NULL)) {
18229 xmlSchemaPCustomErr(pctxt,
18232 "Internal error: xmlSchemaTypeFixup, "
18233 "complex type '%s': the <simpleContent><restriction> "
18234 "is missing a <simpleType> child, but was not caught "
18235 "by xmlSchemaCheckSRCCT()",
type->
name);
18238 }
else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(
type)) {
18244 if (baseType->contentTypeDef ==
NULL) {
18249 xmlSchemaPCustomErr(pctxt,
18252 "Internal error: xmlSchemaTypeFixup, "
18253 "complex type '%s': the <extension>ed base type is "
18254 "a complex type with no simple content type",
18258 type->contentTypeDef = baseType->contentTypeDef;
18259 }
else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(
type)) {
18264 type->contentTypeDef = baseType;
18269 xmlSchemaPCustomErr(pctxt,
18272 "Internal error: xmlSchemaTypeFixup, "
18273 "complex type '%s' with <simpleContent>: unhandled "
18278 int dummySequence = 0;
18279 xmlSchemaParticlePtr particle =
18280 (xmlSchemaParticlePtr)
type->subtypes;
18291 if ((particle ==
NULL) ||
18292 ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
18293 ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
18294 (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
18295 ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
18296 (particle->minOccurs == 0))) &&
18297 ( ((xmlSchemaTreeItemPtr) particle->children)->children ==
NULL))) {
18298 if (
type->flags & XML_SCHEMAS_TYPE_MIXED) {
18308 if ((particle ==
NULL) ||
18309 (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
18313 particle = xmlSchemaAddParticle(pctxt,
18315 if (particle ==
NULL)
18320 particle->children = (xmlSchemaTreeItemPtr)
18321 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18322 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18323 if (particle->children ==
NULL)
18326 type->subtypes = (xmlSchemaTypePtr) particle;
18329 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18334 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
18342 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18347 if (WXS_IS_RESTRICTION(
type)) {
18351 if (
type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
18352 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18353 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18359 if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18365 type->contentType = baseType->contentType;
18366 type->subtypes = baseType->subtypes;
18372 type->contentTypeDef = baseType->contentTypeDef;
18376 }
else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18380 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18381 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18386 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18387 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18392 if ((WXS_TYPE_PARTICLE(
type) !=
NULL) &&
18393 (WXS_TYPE_PARTICLE_TERM(
type) !=
NULL) &&
18394 ((WXS_TYPE_PARTICLE_TERM(
type))->type ==
18395 XML_SCHEMA_TYPE_ALL))
18400 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18404 "The type has an 'all' model group in its "
18405 "{content type} and thus cannot be derived from "
18406 "a non-empty type, since this would produce a "
18407 "'sequence' model group containing the 'all' "
18408 "model group; 'all' model groups are not "
18409 "allowed to appear inside other model groups",
18412 }
else if ((WXS_TYPE_PARTICLE(baseType) !=
NULL) &&
18413 (WXS_TYPE_PARTICLE_TERM(baseType) !=
NULL) &&
18414 ((WXS_TYPE_PARTICLE_TERM(baseType))->
type ==
18415 XML_SCHEMA_TYPE_ALL))
18420 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18424 "A type cannot be derived by extension from a type "
18425 "which has an 'all' model group in its "
18426 "{content type}, since this would produce a "
18427 "'sequence' model group containing the 'all' "
18428 "model group; 'all' model groups are not "
18429 "allowed to appear inside other model groups",
18432 }
else if ((!dummySequence) && (baseType->subtypes !=
NULL)) {
18433 xmlSchemaTreeItemPtr effectiveContent =
18434 (xmlSchemaTreeItemPtr)
type->subtypes;
18438 particle = xmlSchemaAddParticle(pctxt,
18440 if (particle ==
NULL)
18445 particle->children = (xmlSchemaTreeItemPtr)
18446 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18447 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18448 if (particle->children ==
NULL)
18450 WXS_TYPE_CONTENTTYPE(
type) = (xmlSchemaTypePtr) particle;
18457 particle->children->children =
18458 (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
18460 ((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs,
18461 ((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs);
18462 if (particle->children->children ==
NULL)
18464 particle = (xmlSchemaParticlePtr)
18465 particle->children->children;
18466 particle->children =
18467 ((xmlSchemaParticlePtr) baseType->subtypes)->children;
18471 particle->next = effectiveContent;
18492 particle->children->children =
18493 (xmlSchemaTreeItemPtr) baseType->subtypes;
18506 res = xmlSchemaFixupTypeAttributeUses(pctxt,
type);
18513 res = xmlSchemaCheckCTComponent(pctxt,
type);
18516 if (olderrs != pctxt->nberrors)
18517 return(pctxt->err);
18522 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18523 return(pctxt->err);
18526 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18540xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
18541 xmlSchemaAbstractCtxtPtr actxt)
18545 if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
18546 AERROR_INT(
"xmlSchemaTypeFixup",
18547 "this function needs a parser context");
18550 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18552 if (
type->type == XML_SCHEMA_TYPE_COMPLEX)
18553 return(xmlSchemaFixupComplexType(PCTXT_CAST actxt,
type));
18554 else if (
type->type == XML_SCHEMA_TYPE_SIMPLE)
18555 return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt,
type));
18572xmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
18573 xmlSchemaTypePtr typeDecl,
18574 xmlSchemaParserCtxtPtr pctxt,
18577 int ret = 0, ctxtGiven;
18579 if ((facet ==
NULL) || (typeDecl ==
NULL))
18590 switch (facet->type) {
18591 case XML_SCHEMA_FACET_MININCLUSIVE:
18592 case XML_SCHEMA_FACET_MINEXCLUSIVE:
18593 case XML_SCHEMA_FACET_MAXINCLUSIVE:
18594 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
18595 case XML_SCHEMA_FACET_ENUMERATION: {
18600 xmlSchemaTypePtr
base;
18620 if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
18621 base = typeDecl->baseType;
18623 PERROR_INT(
"xmlSchemaCheckFacet",
18624 "a type user derived type has no base type");
18634 pctxt = xmlSchemaNewParserCtxt(
"*");
18645 ret = xmlSchemaVCheckCVCSimpleType(
18646 ACTXT_CAST pctxt, facet->node,
base,
18647 facet->value, &(facet->val), 1, 1, 0);
18652 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18654 "Internal error: xmlSchemaCheckFacet, "
18655 "failed to validate the value '%s' of the "
18656 "facet '%s' against the base type",
18657 facet->
value, xmlSchemaFacetTypeToString(facet->type));
18659 goto internal_error;
18666 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18667 ret, facet->node, WXS_BASIC_CAST facet,
18668 "The value '%s' of the facet does not validate "
18669 "against the base type '%s'",
18671 xmlSchemaFormatQName(&
str,
18672 base->targetNamespace,
base->name));
18673 FREE_AND_NULL(
str);
18676 }
else if (facet->val ==
NULL) {
18678 PERROR_INT(
"xmlSchemaCheckFacet",
18679 "value was not computed");
18685 case XML_SCHEMA_FACET_PATTERN:
18686 facet->regexp = xmlRegexpCompile(facet->value);
18687 if (facet->regexp ==
NULL) {
18691 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18692 ret, facet->node, WXS_BASIC_CAST typeDecl,
18693 "The value '%s' of the facet 'pattern' is not a "
18694 "valid regular expression",
18695 facet->value,
NULL);
18699 case XML_SCHEMA_FACET_TOTALDIGITS:
18700 case XML_SCHEMA_FACET_FRACTIONDIGITS:
18701 case XML_SCHEMA_FACET_LENGTH:
18702 case XML_SCHEMA_FACET_MAXLENGTH:
18703 case XML_SCHEMA_FACET_MINLENGTH:
18705 if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
18706 ret = xmlSchemaValidatePredefinedType(
18707 xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
18708 facet->value, &(facet->val));
18710 ret = xmlSchemaValidatePredefinedType(
18711 xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
18712 facet->value, &(facet->val));
18718 PERROR_INT(
"xmlSchemaCheckFacet",
18719 "validating facet value");
18721 goto internal_error;
18727 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
18728 ret, facet->node, WXS_BASIC_CAST typeDecl,
18729 "The value '%s' of the facet '%s' is not a valid '%s'",
18731 xmlSchemaFacetTypeToString(facet->type),
18732 (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
18740 case XML_SCHEMA_FACET_WHITESPACE:{
18742 facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
18744 facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
18746 facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
18752 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18753 ret, facet->node, WXS_BASIC_CAST typeDecl,
18754 "The value '%s' of the facet 'whitespace' is not "
18755 "valid", facet->value,
NULL);
18763 if ((! ctxtGiven) && (pctxt !=
NULL))
18764 xmlSchemaFreeParserCtxt(pctxt);
18767 if ((! ctxtGiven) && (pctxt !=
NULL))
18768 xmlSchemaFreeParserCtxt(pctxt);
18780xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
18781 xmlSchemaParserCtxtPtr pctxt)
18783 int res, olderrs = pctxt->nberrors;
18789 if (typeDecl->facets !=
NULL) {
18790 xmlSchemaFacetPtr facet = typeDecl->facets;
18796 if (pctxt->vctxt ==
NULL) {
18797 if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
18800 pctxt->vctxt->schema = pctxt->schema;
18801 while (facet !=
NULL) {
18802 res = xmlSchemaCheckFacet(facet, typeDecl, pctxt,
name);
18804 facet = facet->next;
18806 pctxt->vctxt->schema =
NULL;
18808 if (olderrs != pctxt->nberrors)
18809 return(pctxt->err);
18827static xmlSchemaTreeItemPtr
18828xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
18829 xmlSchemaTreeItemPtr particle)
18831 xmlSchemaTreeItemPtr circ =
NULL;
18832 xmlSchemaTreeItemPtr term;
18833 xmlSchemaModelGroupDefPtr gdef;
18835 for (; particle !=
NULL; particle = particle->
next) {
18836 term = particle->children;
18839 switch (term->type) {
18840 case XML_SCHEMA_TYPE_GROUP:
18841 gdef = (xmlSchemaModelGroupDefPtr) term;
18842 if (gdef == groupDef)
18848 if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
18850 if (gdef->children !=
NULL) {
18851 gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18852 circ = xmlSchemaGetCircModelGrDefRef(groupDef,
18853 gdef->children->children);
18854 gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18859 case XML_SCHEMA_TYPE_SEQUENCE:
18860 case XML_SCHEMA_TYPE_CHOICE:
18861 case XML_SCHEMA_TYPE_ALL:
18862 circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
18882xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr
item,
18883 xmlSchemaParserCtxtPtr ctxt)
18892 (
item->
type != XML_SCHEMA_TYPE_GROUP) ||
18896 xmlSchemaTreeItemPtr circ;
18898 circ = xmlSchemaGetCircModelGrDefRef(
item,
item->children->children);
18899 if (circ !=
NULL) {
18908 xmlSchemaPCustomErr(ctxt,
18910 NULL, WXS_ITEM_NODE(circ),
18911 "Circular reference to the model group definition '%s' "
18912 "defined", xmlSchemaFormatQName(&
str,
18913 item->targetNamespace,
item->name));
18919 circ->children =
NULL;
18939xmlSchemaModelGroupToModelGroupDefFixup(
18941 xmlSchemaModelGroupPtr mg)
18943 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
18945 while (particle !=
NULL) {
18946 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
18947 ((WXS_PARTICLE_TERM(particle))->
type !=
18948 XML_SCHEMA_TYPE_GROUP))
18950 particle = WXS_PTC_CAST particle->next;
18953 if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) ==
NULL) {
18957 WXS_PARTICLE_TERM(particle) =
NULL;
18958 particle = WXS_PTC_CAST particle->
next;
18964 WXS_PARTICLE_TERM(particle) =
18965 WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
18967 particle = WXS_PTC_CAST particle->next;
18981static xmlSchemaQNameRefPtr
18982xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
18983 xmlSchemaItemListPtr
list)
18985 xmlSchemaAttributeGroupPtr gr;
18986 xmlSchemaQNameRefPtr
ref, circ;
18992 for (
i = 0;
i <
list->nbItems;
i++) {
18994 if ((
ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
18995 (
ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
18998 gr = WXS_ATTR_GROUP_CAST
ref->item;
19001 if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
19007 if ((gr->attrUses) &&
19008 (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
19010 gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
19011 circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
19012 (xmlSchemaItemListPtr) gr->attrUses);
19013 gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
19032xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
19033 xmlSchemaParserCtxtPtr ctxt)
19049 if (attrGr->attrUses ==
NULL)
19051 else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
19054 xmlSchemaQNameRefPtr circ;
19056 circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
19057 (xmlSchemaItemListPtr) attrGr->attrUses);
19058 if (circ !=
NULL) {
19063 xmlSchemaPCustomErr(ctxt,
19065 NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
19066 "Circular reference to the attribute group '%s' "
19067 "defined", xmlSchemaGetComponentQName(&
str, attrGr));
19068 FREE_AND_NULL(
str);
19082xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19083 xmlSchemaAttributeGroupPtr attrGr);
19100xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
19101 xmlSchemaBasicItemPtr
item,
19102 xmlSchemaWildcardPtr *completeWild,
19103 xmlSchemaItemListPtr
list,
19104 xmlSchemaItemListPtr prohibs)
19106 xmlSchemaAttributeGroupPtr gr;
19107 xmlSchemaAttributeUsePtr use;
19108 xmlSchemaItemListPtr sublist;
19110 int created = (*completeWild ==
NULL) ? 0 : 1;
19113 prohibs->nbItems = 0;
19115 for (
i = 0;
i <
list->nbItems;
i++) {
19116 use =
list->items[
i];
19118 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
19119 if (prohibs ==
NULL) {
19120 PERROR_INT(
"xmlSchemaExpandAttributeGroupRefs",
19121 "unexpected attr prohibition found");
19127 if (xmlSchemaItemListRemove(
list,
i) == -1)
19137 xmlSchemaItemListAddSize(prohibs, 2, use);
19140 if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19141 ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
19143 if ((WXS_QNAME_CAST use)->
item ==
NULL)
19145 gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
19151 if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
19152 if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
19159 if (gr->attributeWildcard !=
NULL) {
19160 if (*completeWild ==
NULL) {
19161 *completeWild = gr->attributeWildcard;
19164 xmlSchemaWildcardPtr tmpWild;
19174 tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema,
19175 XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
19176 WXS_ITEM_NODE(
item));
19177 if (tmpWild ==
NULL)
19179 if (xmlSchemaCloneWildcardNsConstraints(pctxt,
19180 tmpWild, *completeWild) == -1)
19182 tmpWild->processContents = (*completeWild)->processContents;
19183 *completeWild = tmpWild;
19187 if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
19188 gr->attributeWildcard) == -1)
19196 sublist = ((xmlSchemaItemListPtr) gr->attrUses);
19197 if ((sublist ==
NULL) || sublist->nbItems == 0) {
19198 if (xmlSchemaItemListRemove(
list,
i) == -1)
19206 list->items[
i] = sublist->items[0];
19207 if (sublist->nbItems != 1) {
19208 for (
j = 1;
j < sublist->nbItems;
j++) {
19210 if (xmlSchemaItemListInsert(
list,
19211 sublist->items[
j],
i) == -1)
19221 if (prohibs && (prohibs->nbItems != 0) && (
list->nbItems != 0)) {
19222 xmlSchemaAttributeUseProhibPtr prohib;
19224 for (
i = prohibs->nbItems -1;
i >= 0;
i--) {
19225 prohib = prohibs->items[
i];
19226 for (
j = 0;
j <
list->nbItems;
j++) {
19227 use =
list->items[
j];
19229 if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
19230 (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
19234 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
19236 prohib->node,
NULL,
19237 "Skipping pointless attribute use prohibition "
19238 "'%s', since a corresponding attribute use "
19239 "exists already in the type definition",
19240 xmlSchemaFormatQName(&
str,
19241 prohib->targetNamespace, prohib->name),
19243 FREE_AND_NULL(
str);
19247 if (xmlSchemaItemListRemove(prohibs,
i) == -1)
19270xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19271 xmlSchemaAttributeGroupPtr attrGr)
19273 if ((attrGr->attrUses ==
NULL) ||
19274 (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
19277 attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
19278 if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
19279 &(attrGr->attributeWildcard), attrGr->attrUses,
NULL) == -1)
19296xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19297 xmlSchemaAttributeGroupPtr attrGr)
19307 if ((attrGr->attrUses !=
NULL) &&
19308 (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
19310 xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
19311 xmlSchemaAttributeUsePtr use, tmp;
19312 int i,
j, hasId = 0;
19314 for (
i = uses->nbItems -1;
i >= 0;
i--) {
19315 use = uses->items[
i];
19323 for (
j =
i -1;
j >= 0;
j--) {
19324 tmp = uses->items[
j];
19325 if ((WXS_ATTRUSE_DECL_NAME(use) ==
19326 WXS_ATTRUSE_DECL_NAME(tmp)) &&
19327 (WXS_ATTRUSE_DECL_TNS(use) ==
19328 WXS_ATTRUSE_DECL_TNS(tmp)))
19332 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19334 attrGr->node, WXS_BASIC_CAST attrGr,
19336 xmlSchemaGetComponentDesignation(&
str, use),
19338 FREE_AND_NULL(
str);
19342 if (xmlSchemaItemListRemove(uses,
i) == -1)
19355 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
19356 if (xmlSchemaIsDerivedFromBuiltInType(
19357 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
19362 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19364 attrGr->node, WXS_BASIC_CAST attrGr,
19365 "There must not exist more than one attribute "
19366 "declaration of type 'xs:ID' "
19367 "(or derived from 'xs:ID'). The %s violates this "
19369 xmlSchemaGetComponentDesignation(&
str, use),
19371 FREE_AND_NULL(
str);
19372 if (xmlSchemaItemListRemove(uses,
i) == -1)
19393xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr
ref,
19394 xmlSchemaParserCtxtPtr ctxt)
19396 xmlSchemaAttributeGroupPtr
group;
19400 group = xmlSchemaGetAttributeGroup(ctxt->schema,
19402 ref->targetNamespace);
19404 xmlSchemaPResCompAttrErr(ctxt,
19430xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19431 xmlSchemaAttributePtr
attr)
19442 if (WXS_ATTR_TYPEDEF(
attr) ==
NULL)
19453 if (xmlSchemaIsDerivedFromBuiltInType(
19454 WXS_ATTR_TYPEDEF(
attr), XML_SCHEMAS_ID))
19456 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19459 "Value constraints are not allowed if the type definition "
19460 "is or is derived from xs:ID",
19462 return(pctxt->err);
19472 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
19473 attr->node, WXS_ATTR_TYPEDEF(
attr),
19478 PERROR_INT(
"xmlSchemaCheckAttrPropsCorrect",
19479 "calling xmlSchemaVCheckCVCSimpleType()");
19482 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19485 "The value of the value constraint is not valid",
19487 return(pctxt->err);
19494static xmlSchemaElementPtr
19495xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
19496 xmlSchemaElementPtr ancestor)
19498 xmlSchemaElementPtr
ret;
19500 if (WXS_SUBST_HEAD(ancestor) ==
NULL)
19502 if (WXS_SUBST_HEAD(ancestor) == elemDecl)
19505 if (WXS_SUBST_HEAD(ancestor)->
flags & XML_SCHEMAS_ELEM_CIRCULAR)
19507 WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
19508 ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
19509 WXS_SUBST_HEAD(ancestor));
19510 WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
19528xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19529 xmlSchemaElementPtr elemDecl)
19532 xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
19539 if (WXS_SUBST_HEAD(elemDecl) !=
NULL) {
19540 xmlSchemaElementPtr
head = WXS_SUBST_HEAD(elemDecl), circ;
19542 xmlSchemaCheckElementDeclComponent(
head, pctxt);
19547 if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
19548 xmlSchemaPCustomErr(pctxt,
19550 WXS_BASIC_CAST elemDecl,
NULL,
19551 "Only global element declarations can have a "
19552 "substitution group affiliation",
NULL);
19561 if (
head == elemDecl)
19563 else if (WXS_SUBST_HEAD(
head) !=
NULL)
19564 circ = xmlSchemaCheckSubstGroupCircular(
head,
head);
19567 if (circ !=
NULL) {
19570 xmlSchemaPCustomErrExt(pctxt,
19572 WXS_BASIC_CAST circ,
NULL,
19573 "The element declaration '%s' defines a circular "
19574 "substitution group to element declaration '%s'",
19575 xmlSchemaGetComponentQName(&
strA, circ),
19576 xmlSchemaGetComponentQName(&strB,
head),
19578 FREE_AND_NULL(
strA)
19579 FREE_AND_NULL(strB)
19597 if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
19600 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
19601 set |= SUBSET_EXTENSION;
19602 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
19603 set |= SUBSET_RESTRICTION;
19605 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
19606 WXS_ELEM_TYPEDEF(
head),
set) != 0) {
19610 xmlSchemaPCustomErrExt(pctxt,
19612 WXS_BASIC_CAST elemDecl,
NULL,
19613 "The type definition '%s' was "
19614 "either rejected by the substitution group "
19615 "affiliation '%s', or not validly derived from its type "
19617 xmlSchemaGetComponentQName(&
strA, typeDef),
19618 xmlSchemaGetComponentQName(&strB,
head),
19619 xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(
head)));
19620 FREE_AND_NULL(
strA)
19621 FREE_AND_NULL(strB)
19622 FREE_AND_NULL(strC)
19633 if ((elemDecl->value !=
NULL) &&
19634 ((WXS_IS_SIMPLE(typeDef) &&
19635 xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
19636 (WXS_IS_COMPLEX(typeDef) &&
19637 WXS_HAS_SIMPLE_CONTENT(typeDef) &&
19638 xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
19639 XML_SCHEMAS_ID)))) {
19642 xmlSchemaPCustomErr(pctxt,
19644 WXS_BASIC_CAST elemDecl,
NULL,
19645 "The type definition (or type definition's content type) is or "
19646 "is derived from ID; value constraints are not allowed in "
19647 "conjunction with such a type definition",
NULL);
19648 }
else if (elemDecl->value !=
NULL) {
19658 if (typeDef ==
NULL) {
19659 xmlSchemaPErr(pctxt, elemDecl->node,
19661 "Internal error: xmlSchemaCheckElemPropsCorrect, "
19662 "type is missing... skipping validation of "
19663 "the value constraint",
NULL,
NULL);
19666 if (elemDecl->node !=
NULL) {
19667 if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
19668 node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19671 node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19674 vcret = xmlSchemaParseCheckCOSValidDefault(pctxt,
node,
19675 typeDef, elemDecl->value, &(elemDecl->defVal));
19678 PERROR_INT(
"xmlSchemaElemCheckValConstr",
19679 "failed to validate the value constraint of an "
19680 "element declaration");
19710xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
19711 xmlSchemaElementPtr elemDecl)
19713 if ((WXS_SUBST_HEAD(elemDecl) ==
NULL) ||
19715 (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
19718 xmlSchemaElementPtr
head;
19719 xmlSchemaTypePtr headType,
type;
19733 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
19735 headType =
head->subtypes;
19736 type = elemDecl->subtypes;
19737 if (headType ==
type)
19739 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
19740 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19741 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
19742 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19763 if ((WXS_IS_EXTENSION(
type)) &&
19764 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19765 methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19767 if (WXS_IS_RESTRICTION(
type) &&
19768 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19769 methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19777 type = elemDecl->subtypes->baseType;
19779 if (WXS_IS_COMPLEX(
type)) {
19781 XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19782 ((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
19783 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19785 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19786 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19787 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19790 if (
type == headType)
19795 (((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19796 (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
19797 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19798 (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
19802 xmlSchemaAddElementSubstitutionMember(ctxt,
head, elemDecl);
19803 if ((
head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
19804 head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
19809#ifdef WXS_ELEM_DECL_CONS_ENABLED
19820xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
19821 xmlSchemaBasicItemPtr ctxtComponent,
19822 xmlSchemaParticlePtr ctxtParticle,
19823 xmlSchemaParticlePtr searchParticle,
19824 xmlSchemaParticlePtr curParticle,
19830 xmlSchemaParticlePtr
cur = curParticle;
19831 if (curParticle ==
NULL) {
19834 if (WXS_PARTICLE_TERM(curParticle) ==
NULL) {
19842 switch (WXS_PARTICLE_TERM(
cur)->
type) {
19843 case XML_SCHEMA_TYPE_ANY:
19845 case XML_SCHEMA_TYPE_ELEMENT:
19847 ret = xmlSchemaCheckElementDeclConsistent(pctxt,
19848 ctxtComponent, ctxtParticle,
cur, ctxtParticle, 1);
19852 xmlSchemaElementPtr
elem =
19853 WXS_ELEM_CAST(WXS_PARTICLE_TERM(
cur));
19865 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->
name) &&
19867 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
19871 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19873 XML_SCHEMAP_COS_NONAMBIG,
19875 "In the content model of %s, there are multiple "
19876 "element declarations for '%s' with different "
19877 "type definitions",
19878 xmlSchemaGetComponentDesignation(&
strA,
19880 xmlSchemaFormatQName(&strB,
19881 WXS_PARTICLE_TERM_AS_ELEM(
cur)->targetNamespace,
19882 WXS_PARTICLE_TERM_AS_ELEM(
cur)->
name));
19883 FREE_AND_NULL(
strA);
19884 FREE_AND_NULL(strB);
19885 return(XML_SCHEMAP_COS_NONAMBIG);
19889 case XML_SCHEMA_TYPE_SEQUENCE: {
19892 case XML_SCHEMA_TYPE_CHOICE:{
19907 case XML_SCHEMA_TYPE_ALL:
19909 case XML_SCHEMA_TYPE_GROUP:
19912 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
19913 "xmlSchemaCheckElementDeclConsistent",
19914 "found unexpected term of type '%s' in content model",
19915 WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(
cur)),
NULL);
19918 cur = (xmlSchemaParticlePtr)
cur->next;
19936xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
19937 xmlSchemaParserCtxtPtr ctxt)
19939 if (elemDecl ==
NULL)
19941 if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
19943 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
19944 if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
19948 xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
19961xmlSchemaResolveModelGroupParticleReferences(
19962 xmlSchemaParserCtxtPtr ctxt,
19963 xmlSchemaModelGroupPtr mg)
19965 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
19966 xmlSchemaQNameRefPtr
ref;
19967 xmlSchemaBasicItemPtr refItem;
19972 while (particle !=
NULL) {
19973 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
19974 ((WXS_PARTICLE_TERM(particle))->
type !=
19975 XML_SCHEMA_EXTRA_QNAMEREF))
19977 goto next_particle;
19979 ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
19984 particle->children =
NULL;
19986 refItem = xmlSchemaGetNamedComponent(ctxt->schema,
19988 if (refItem ==
NULL) {
19993 goto next_particle;
19995 if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
19996 if (WXS_MODELGROUPDEF_MODEL(refItem) ==
NULL)
19998 goto next_particle;
20006 if ((WXS_MODELGROUPDEF_MODEL(refItem))->
type ==
20007 XML_SCHEMA_TYPE_ALL) {
20018 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20021 WXS_ITEM_NODE(particle),
NULL,
20022 "A model group definition is referenced, but "
20023 "it contains an 'all' model group, which "
20024 "cannot be contained by model groups",
20027 goto next_particle;
20029 particle->children = (xmlSchemaTreeItemPtr) refItem;
20035 particle->children = (xmlSchemaTreeItemPtr) refItem;
20038 particle = WXS_PTC_CAST particle->next;
20043xmlSchemaAreValuesEqual(xmlSchemaValPtr
x,
20046 xmlSchemaTypePtr tx,
ty, ptx, pty;
20049 while (
x !=
NULL) {
20051 tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
x));
20052 ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
y));
20053 ptx = xmlSchemaGetPrimitiveType(tx);
20054 pty = xmlSchemaGetPrimitiveType(
ty);
20070 if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
20071 WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
20073 xmlSchemaValueGetAsString(
x),
20074 xmlSchemaValueGetAsString(
y)))
20077 ret = xmlSchemaCompareValuesWhtsp(
20078 x, XML_SCHEMA_WHITESPACE_PRESERVE,
20079 y, XML_SCHEMA_WHITESPACE_PRESERVE);
20088 x = xmlSchemaValueGetNext(
x);
20090 y = xmlSchemaValueGetNext(
y);
20093 }
else if (xmlSchemaValueGetNext(
y) !=
NULL)
20109xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
20110 xmlSchemaParserCtxtPtr ctxt)
20112 if ((ctxt ==
NULL) || (ause ==
NULL))
20114 if ((ause->attrDecl ==
NULL) ||
20115 (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
20119 xmlSchemaQNameRefPtr
ref = WXS_QNAME_CAST ause->attrDecl;
20125 ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
20127 if (ause->attrDecl ==
NULL) {
20128 xmlSchemaPResCompAttrErr(ctxt,
20130 WXS_BASIC_CAST ause, ause->node,
20132 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20149xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
20150 xmlSchemaAttributeUsePtr use)
20152 if ((ctxt ==
NULL) || (use ==
NULL))
20154 if ((use->defValue ==
NULL) || (WXS_ATTRUSE_DECL(use) ==
NULL) ||
20155 ((WXS_ATTRUSE_DECL(use))->
type != XML_SCHEMA_TYPE_ATTRIBUTE))
20166 if (((WXS_ATTRUSE_DECL(use))->defValue !=
NULL) &&
20167 ((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMAS_ATTR_FIXED) &&
20168 ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20170 xmlSchemaPCustomErr(ctxt,
20172 WXS_BASIC_CAST use,
NULL,
20173 "The attribute declaration has a 'fixed' value constraint "
20174 ", thus the attribute use must also have a 'fixed' value "
20182 if ((use->defVal !=
NULL) && (WXS_ATTRUSE_TYPEDEF(use) !=
NULL)) {
20191 if (xmlSchemaIsDerivedFromBuiltInType(
20192 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
20194 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20196 NULL, WXS_BASIC_CAST use,
20197 "Value constraints are not allowed if the type definition "
20198 "is or is derived from xs:ID",
20203 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
20204 use->node, WXS_ATTRUSE_TYPEDEF(use),
20205 use->defValue, &(use->defVal),
20209 PERROR_INT2(
"xmlSchemaCheckAttrUsePropsCorrect",
20210 "calling xmlSchemaVCheckCVCSimpleType()");
20213 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20215 NULL, WXS_BASIC_CAST use,
20216 "The value of the value constraint is not valid",
20228 if (((WXS_ATTRUSE_DECL(use))->defVal !=
NULL) &&
20229 (((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20231 if (! xmlSchemaAreValuesEqual(use->defVal,
20232 (WXS_ATTRUSE_DECL(use))->defVal))
20234 xmlSchemaPCustomErr(ctxt,
20236 WXS_BASIC_CAST use,
NULL,
20237 "The 'fixed' value constraint of the attribute use "
20238 "must match the attribute declaration's value "
20240 (WXS_ATTRUSE_DECL(use))->defValue);
20258xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr
item,
20259 xmlSchemaParserCtxtPtr ctxt)
20267 if (
item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
20269 item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
20273 xmlSchemaTypePtr
type;
20275 type = xmlSchemaGetType(ctxt->schema,
item->typeName,
20278 xmlSchemaPResCompAttrErr(ctxt,
20281 "type",
item->typeName,
item->typeNs,
20282 XML_SCHEMA_TYPE_SIMPLE,
NULL);
20291 item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
20307xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
20308 xmlSchemaParserCtxtPtr pctxt)
20310 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
20312 if (idc->ref->name !=
NULL) {
20313 idc->ref->item = (xmlSchemaBasicItemPtr)
20314 xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
20315 idc->ref->targetNamespace);
20316 if (idc->ref->item ==
NULL) {
20321 xmlSchemaPResCompAttrErr(pctxt,
20323 WXS_BASIC_CAST idc, idc->node,
20324 "refer", idc->ref->name,
20325 idc->ref->targetNamespace,
20326 XML_SCHEMA_TYPE_IDC_KEY,
NULL);
20327 return(pctxt->err);
20328 }
else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
20332 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20334 NULL, WXS_BASIC_CAST idc,
20335 "The keyref references a keyref",
20337 idc->ref->item =
NULL;
20338 return(pctxt->err);
20340 if (idc->nbFields !=
20341 ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
20343 xmlSchemaIDCPtr refer;
20345 refer = (xmlSchemaIDCPtr) idc->ref->item;
20352 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20354 NULL, WXS_BASIC_CAST idc,
20355 "The cardinality of the keyref differs from the "
20356 "cardinality of the referenced key/unique '%s'",
20357 xmlSchemaFormatQName(&
str, refer->targetNamespace,
20361 return(pctxt->err);
20369xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
20370 xmlSchemaParserCtxtPtr pctxt)
20372 if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
20373 prohib->targetNamespace) ==
NULL) {
20375 xmlSchemaPResCompAttrErr(pctxt,
20377 NULL, prohib->node,
20378 "ref", prohib->
name, prohib->targetNamespace,
20379 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20385#define WXS_REDEFINED_TYPE(c) \
20386(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
20388#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
20389(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20391#define WXS_REDEFINED_ATTR_GROUP(c) \
20392(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
20395xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
20398 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20399 xmlSchemaBasicItemPtr prev,
item;
20406 item = redef->item;
20420 prev = xmlSchemaFindRedefCompInGraph(
20422 redef->refName, redef->refTargetNs);
20423 if (prev ==
NULL) {
20442 if (redef->reference)
20443 node = WXS_ITEM_NODE(redef->reference);
20446 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20453 "The %s '%s' to be redefined could not be found in "
20454 "the redefined schema",
20455 WXS_ITEM_TYPE_NAME(
item),
20456 xmlSchemaFormatQName(&
str, redef->refTargetNs,
20458 FREE_AND_NULL(
str);
20460 redef = redef->
next;
20469 case XML_SCHEMA_TYPE_COMPLEX:
20470 case XML_SCHEMA_TYPE_SIMPLE:
20471 if ((WXS_TYPE_CAST prev)->
flags &
20472 XML_SCHEMAS_TYPE_REDEFINED)
20478 (WXS_TYPE_CAST prev)->
flags |= XML_SCHEMAS_TYPE_REDEFINED;
20484 ((xmlSchemaTypePtr)
item)->baseType =
20485 (xmlSchemaTypePtr) prev;
20487 case XML_SCHEMA_TYPE_GROUP:
20488 if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
20489 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20495 (WXS_MODEL_GROUPDEF_CAST prev)->
flags |=
20496 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
20497 if (redef->reference !=
NULL) {
20502 (WXS_PTC_CAST redef->reference)->children =
20503 WXS_TREE_CAST prev;
20505 redef->target = prev;
20507 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20508 if ((WXS_ATTR_GROUP_CAST prev)->flags &
20509 XML_SCHEMAS_ATTRGROUP_REDEFINED)
20514 (WXS_ATTR_GROUP_CAST prev)->
flags |=
20515 XML_SCHEMAS_ATTRGROUP_REDEFINED;
20516 if (redef->reference !=
NULL) {
20523 (WXS_QNAME_CAST redef->reference)->
item = prev;
20524 redef->target =
NULL;
20533 redef->target = prev;
20537 PERROR_INT(
"xmlSchemaResolveRedefReferences",
20538 "Unexpected redefined component type");
20541 if (wasRedefined) {
20545 if (redef->reference)
20546 node = WXS_ITEM_NODE(redef->reference);
20548 node = WXS_ITEM_NODE(redef->item);
20550 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20554 "The referenced %s was already redefined. Multiple "
20555 "redefinition of the same component is not supported",
20556 xmlSchemaGetComponentDesignation(&
str, prev),
20560 redef = redef->
next;
20563 redef = redef->next;
20564 }
while (redef !=
NULL);
20570xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
20573 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20574 xmlSchemaBasicItemPtr
item;
20580 if (redef->target ==
NULL) {
20581 redef = redef->next;
20584 item = redef->item;
20587 case XML_SCHEMA_TYPE_SIMPLE:
20588 case XML_SCHEMA_TYPE_COMPLEX:
20593 (WXS_TYPE_CAST redef->target)->
name =
NULL;
20600 case XML_SCHEMA_TYPE_GROUP:
20612 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20626 err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
20627 XML_SCHEMA_ACTION_REDEFINE,
20628 item, redef->target,
20629 (WXS_ATTR_GROUP_CAST
item)->attrUses,
20630 (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
20631 (WXS_ATTR_GROUP_CAST
item)->attributeWildcard,
20632 (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
20639 redef = redef->next;
20640 }
while (redef !=
NULL);
20646xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
20647 xmlSchemaBucketPtr bucket)
20649 xmlSchemaBasicItemPtr
item;
20655#define WXS_GET_GLOBAL_HASH(c, slot) { \
20656 if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
20657 table = &(WXS_IMPBUCKET((c))->schema->slot); \
20659 table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
20673 if (bucket ==
NULL)
20675 if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
20677 bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
20679 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
20680 item = bucket->globals->items[
i];
20683 case XML_SCHEMA_TYPE_COMPLEX:
20684 case XML_SCHEMA_TYPE_SIMPLE:
20685 if (WXS_REDEFINED_TYPE(
item))
20688 WXS_GET_GLOBAL_HASH(bucket, typeDecl)
20690 case XML_SCHEMA_TYPE_ELEMENT:
20692 WXS_GET_GLOBAL_HASH(bucket, elemDecl)
20694 case XML_SCHEMA_TYPE_ATTRIBUTE:
20696 WXS_GET_GLOBAL_HASH(bucket, attrDecl)
20698 case XML_SCHEMA_TYPE_GROUP:
20699 if (WXS_REDEFINED_MODEL_GROUP_DEF(
item))
20702 WXS_GET_GLOBAL_HASH(bucket, groupDecl)
20704 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20705 if (WXS_REDEFINED_ATTR_GROUP(
item))
20708 WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
20710 case XML_SCHEMA_TYPE_IDC_KEY:
20711 case XML_SCHEMA_TYPE_IDC_UNIQUE:
20712 case XML_SCHEMA_TYPE_IDC_KEYREF:
20714 WXS_GET_GLOBAL_HASH(bucket, idcDef)
20716 case XML_SCHEMA_TYPE_NOTATION:
20718 WXS_GET_GLOBAL_HASH(bucket, notaDecl)
20721 PERROR_INT(
"xmlSchemaAddComponents",
20722 "Unexpected global component type");
20728 PERROR_INT(
"xmlSchemaAddComponents",
20729 "failed to create a component hash table");
20737 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20739 WXS_ITEM_NODE(
item),
20740 WXS_BASIC_CAST
item,
20741 "A global %s '%s' does already exist",
20742 WXS_ITEM_TYPE_NAME(
item),
20743 xmlSchemaGetComponentQName(&
str,
item));
20744 FREE_AND_NULL(
str);
20750 if (bucket->relations !=
NULL) {
20751 xmlSchemaSchemaRelationPtr rel = bucket->relations;
20753 if ((rel->bucket !=
NULL) &&
20754 ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
20755 if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
20759 }
while (rel !=
NULL);
20765xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
20766 xmlSchemaBucketPtr rootBucket)
20768 xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
20770 int nbItems,
i,
ret = 0;
20771 xmlSchemaBucketPtr oldbucket = con->bucket;
20772 xmlSchemaElementPtr elemDecl;
20774#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
20776 if ((con->pending ==
NULL) ||
20777 (con->pending->nbItems == 0))
20787 if (con->bucket ==
NULL)
20788 con->bucket = rootBucket;
20801 xmlSchemaCheckSRCRedefineFirst(pctxt);
20806 xmlSchemaAddComponents(pctxt, rootBucket);
20808 pctxt->ctxtType =
NULL;
20809 items = (xmlSchemaTreeItemPtr *) con->pending->items;
20810 nbItems = con->pending->nbItems;
20837 for (
i = 0;
i < nbItems;
i++) {
20840 case XML_SCHEMA_TYPE_ELEMENT:
20841 xmlSchemaResolveElementReferences(
20842 (xmlSchemaElementPtr)
item, pctxt);
20845 case XML_SCHEMA_TYPE_COMPLEX:
20846 case XML_SCHEMA_TYPE_SIMPLE:
20847 xmlSchemaResolveTypeReferences(
20848 (xmlSchemaTypePtr)
item, pctxt);
20851 case XML_SCHEMA_TYPE_ATTRIBUTE:
20852 xmlSchemaResolveAttrTypeReferences(
20853 (xmlSchemaAttributePtr)
item, pctxt);
20856 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
20857 xmlSchemaResolveAttrUseReferences(
20858 (xmlSchemaAttributeUsePtr)
item, pctxt);
20861 case XML_SCHEMA_EXTRA_QNAMEREF:
20862 if ((WXS_QNAME_CAST
item)->itemType ==
20863 XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
20865 xmlSchemaResolveAttrGroupReferences(
20866 WXS_QNAME_CAST
item, pctxt);
20870 case XML_SCHEMA_TYPE_SEQUENCE:
20871 case XML_SCHEMA_TYPE_CHOICE:
20872 case XML_SCHEMA_TYPE_ALL:
20873 xmlSchemaResolveModelGroupParticleReferences(pctxt,
20874 WXS_MODEL_GROUP_CAST
item);
20877 case XML_SCHEMA_TYPE_IDC_KEY:
20878 case XML_SCHEMA_TYPE_IDC_UNIQUE:
20879 case XML_SCHEMA_TYPE_IDC_KEYREF:
20880 xmlSchemaResolveIDCKeyReferences(
20881 (xmlSchemaIDCPtr)
item, pctxt);
20884 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
20889 xmlSchemaResolveAttrUseProhibReferences(
20890 WXS_ATTR_PROHIB_CAST
item, pctxt);
20897 if (pctxt->nberrors != 0)
20908 for (
i = 0;
i < nbItems;
i++) {
20914 case XML_SCHEMA_TYPE_COMPLEX:
20915 case XML_SCHEMA_TYPE_SIMPLE:
20916 xmlSchemaCheckTypeDefCircular(
20917 (xmlSchemaTypePtr)
item, pctxt);
20919 if (pctxt->nberrors != 0)
20922 case XML_SCHEMA_TYPE_GROUP:
20923 xmlSchemaCheckGroupDefCircular(
20924 (xmlSchemaModelGroupDefPtr)
item, pctxt);
20926 if (pctxt->nberrors != 0)
20929 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20930 xmlSchemaCheckAttrGroupCircular(
20931 (xmlSchemaAttributeGroupPtr)
item, pctxt);
20933 if (pctxt->nberrors != 0)
20940 if (pctxt->nberrors != 0)
20950 for (
i = 0;
i < nbItems;
i++) {
20953 case XML_SCHEMA_TYPE_SEQUENCE:
20954 case XML_SCHEMA_TYPE_CHOICE:
20955 xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
20956 WXS_MODEL_GROUP_CAST
item);
20962 if (pctxt->nberrors != 0)
20967 for (
i = 0;
i < nbItems;
i++) {
20970 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20971 if ((! WXS_ATTR_GROUP_EXPANDED(
item)) &&
20972 WXS_ATTR_GROUP_HAS_REFS(
item))
20974 xmlSchemaAttributeGroupExpandRefs(pctxt,
20975 WXS_ATTR_GROUP_CAST
item);
20983 if (pctxt->nberrors != 0)
20990 for (
i = 0;
i < nbItems;
i++) {
20993 case XML_SCHEMA_TYPE_SIMPLE:
20994 if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr)
item)) {
20995 xmlSchemaFixupSimpleTypeStageOne(pctxt,
20996 (xmlSchemaTypePtr)
item);
21004 if (pctxt->nberrors != 0)
21010 for (
i = 0;
i < nbItems;
i++) {
21013 case XML_SCHEMA_TYPE_SIMPLE:
21014 if (((xmlSchemaTypePtr)
item)->memberTypes !=
NULL) {
21015 xmlSchemaCheckUnionTypeDefCircular(pctxt,
21016 (xmlSchemaTypePtr)
item);
21024 if (pctxt->nberrors != 0)
21030 for (
i = 0;
i < nbItems;
i++) {
21033 case XML_SCHEMA_TYPE_SIMPLE:
21034 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21035 xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST
item);
21043 if (pctxt->nberrors != 0)
21051 for (
i = 0;
i < nbItems;
i++) {
21054 case XML_SCHEMA_TYPE_ATTRIBUTE:
21055 xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST
item);
21062 if (pctxt->nberrors != 0)
21067 for (
i = 0;
i < nbItems;
i++) {
21070 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21071 if (((xmlSchemaAttributeUsePtr)
item)->defValue !=
NULL) {
21072 xmlSchemaCheckAttrUsePropsCorrect(pctxt,
21073 WXS_ATTR_USE_CAST
item);
21081 if (pctxt->nberrors != 0)
21087 for (
i = 0;
i < nbItems;
i++) {
21090 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21091 if (( (WXS_ATTR_GROUP_CAST
item)->attrUses !=
NULL) &&
21092 ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST
item)->attrUses)->nbItems > 1))
21094 xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST
item);
21102 if (pctxt->nberrors != 0)
21108 if (WXS_CONSTRUCTOR(pctxt)->redefs !=
NULL)
21109 xmlSchemaCheckSRCRedefineSecond(pctxt);
21110 if (pctxt->nberrors != 0)
21116 for (
i = 0;
i < nbItems;
i++) {
21117 item = con->pending->items[
i];
21119 case XML_SCHEMA_TYPE_COMPLEX:
21120 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21121 xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST
item);
21129 if (pctxt->nberrors != 0)
21136 items = (xmlSchemaTreeItemPtr *) con->pending->items;
21137 nbItems = con->pending->nbItems;
21142 for (
i = 0;
i < nbItems;
i++) {
21145 case XML_SCHEMA_TYPE_ELEMENT:
21146 elemDecl = (xmlSchemaElementPtr)
item;
21148 if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
21150 xmlSchemaCheckElementDeclComponent(
21151 (xmlSchemaElementPtr) elemDecl, pctxt);
21155#ifdef WXS_ELEM_DECL_CONS_ENABLED
21160 if ((WXS_ELEM_TYPEDEF(elemDecl) !=
NULL) &&
21161 (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
21162 (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
21164 xmlSchemaCheckElementDeclConsistent(pctxt,
21165 WXS_BASIC_CAST elemDecl,
21166 WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
21175 if (pctxt->nberrors != 0)
21183 for (
i = 0;
i < nbItems;
i++) {
21186 case XML_SCHEMA_TYPE_COMPLEX:
21187 xmlSchemaBuildContentModel((xmlSchemaTypePtr)
item, pctxt);
21194 if (pctxt->nberrors != 0)
21214 con->bucket = oldbucket;
21215 con->pending->nbItems = 0;
21216 if (con->substGroups !=
NULL) {
21217 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
21218 con->substGroups =
NULL;
21220 if (con->redefs !=
NULL) {
21221 xmlSchemaRedefListFree(con->redefs);
21222 con->redefs =
NULL;
21237xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
21239 xmlSchemaPtr mainSchema =
NULL;
21240 xmlSchemaBucketPtr bucket =
NULL;
21248 if (xmlSchemaInitTypes() < 0)
21255 ctxt->nberrors = 0;
21260 mainSchema = xmlSchemaNewSchema(ctxt);
21261 if (mainSchema ==
NULL)
21266 if (ctxt->constructor ==
NULL) {
21267 ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
21268 if (ctxt->constructor ==
NULL)
21271 ctxt->ownsConstructor = 1;
21273 ctxt->constructor->mainSchema = mainSchema;
21277 res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
21278 ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size,
NULL,
21285 if (bucket ==
NULL) {
21290 "Failed to locate the main schema resource at '%s'",
21295 "Failed to locate the main schema resource",
21300 if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
21302 if (ctxt->nberrors != 0)
21305 mainSchema->doc = bucket->doc;
21306 mainSchema->preserve = ctxt->preserve;
21308 ctxt->schema = mainSchema;
21310 if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
21318 if (ctxt->nberrors != 0) {
21320 xmlSchemaFree(mainSchema);
21323 if (ctxt->constructor) {
21324 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21325 ctxt->constructor =
NULL;
21326 ctxt->ownsConstructor = 0;
21329 ctxt->schema =
NULL;
21330 return(mainSchema);
21337 xmlSchemaFree(mainSchema);
21340 if (ctxt->constructor) {
21341 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21342 ctxt->constructor =
NULL;
21343 ctxt->ownsConstructor = 0;
21345 PERROR_INT2(
"xmlSchemaParse",
21346 "An internal error occurred");
21347 ctxt->schema =
NULL;
21361xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21362 xmlSchemaValidityErrorFunc
err,
21363 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
21368 ctxt->warning =
warn;
21369 ctxt->errCtxt =
ctx;
21370 if (ctxt->vctxt !=
NULL)
21371 xmlSchemaSetValidErrors(ctxt->vctxt,
err,
warn,
ctx);
21383xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
21389 ctxt->serror = serror;
21390 ctxt->errCtxt =
ctx;
21391 if (ctxt->vctxt !=
NULL)
21392 xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror,
ctx);
21407xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21408 xmlSchemaValidityErrorFunc *
err,
21409 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
21414 *
err = ctxt->error;
21416 *
warn = ctxt->warning;
21418 *
ctx = ctxt->errCtxt;
21432xmlSchemaFacetTypeToString(xmlSchemaTypeType
type)
21435 case XML_SCHEMA_FACET_PATTERN:
21437 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
21439 case XML_SCHEMA_FACET_MAXINCLUSIVE:
21441 case XML_SCHEMA_FACET_MINEXCLUSIVE:
21443 case XML_SCHEMA_FACET_MININCLUSIVE:
21445 case XML_SCHEMA_FACET_WHITESPACE:
21447 case XML_SCHEMA_FACET_ENUMERATION:
21449 case XML_SCHEMA_FACET_LENGTH:
21451 case XML_SCHEMA_FACET_MAXLENGTH:
21453 case XML_SCHEMA_FACET_MINLENGTH:
21455 case XML_SCHEMA_FACET_TOTALDIGITS:
21457 case XML_SCHEMA_FACET_FRACTIONDIGITS:
21458 return (
BAD_CAST "fractionDigits");
21462 return (
BAD_CAST "Internal Error");
21465static xmlSchemaWhitespaceValueType
21466xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type)
21472 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
21476 if ((
type->builtInType == XML_SCHEMAS_STRING) ||
21477 (
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
21478 return(XML_SCHEMA_WHITESPACE_PRESERVE);
21479 else if (
type->builtInType == XML_SCHEMAS_NORMSTRING)
21480 return(XML_SCHEMA_WHITESPACE_REPLACE);
21488 return(XML_SCHEMA_WHITESPACE_COLLAPSE);
21490 }
else if (WXS_IS_LIST(
type)) {
21494 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21495 }
else if (WXS_IS_UNION(
type)) {
21496 return (XML_SCHEMA_WHITESPACE_UNKNOWN);
21497 }
else if (WXS_IS_ATOMIC(
type)) {
21498 if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
21499 return (XML_SCHEMA_WHITESPACE_PRESERVE);
21500 else if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
21501 return (XML_SCHEMA_WHITESPACE_REPLACE);
21503 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21536xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
21543 xmlSchemaParserCtxtPtr pctxt;
21544 xmlSchemaBucketPtr bucket =
NULL;
21549 if (vctxt->pctxt ==
NULL) {
21550 VERROR_INT(
"xmlSchemaAssembleByLocation",
21551 "no parser context available");
21554 pctxt = vctxt->pctxt;
21555 if (pctxt->constructor ==
NULL) {
21556 PERROR_INT(
"xmlSchemaAssembleByLocation",
21563 location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
21570 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
21575 if (bucket ==
NULL) {
21581 "The document at location '%s' could not be acquired",
21589 if ((bucket !=
NULL) &&
21590 (WXS_CONSTRUCTOR(pctxt)->bucket ==
NULL))
21591 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
21596 if ((bucket ==
NULL) || (! CAN_PARSE_SCHEMA(bucket)))
21602 pctxt->nberrors = 0;
21604 pctxt->doc = bucket->doc;
21606 ret = xmlSchemaParseNewDocWithContext(pctxt,
schema, bucket);
21612 if ((
ret == 0) && (pctxt->nberrors != 0))
21614 if (pctxt->nberrors == 0) {
21621 xmlSchemaFixupComponents(pctxt, bucket);
21627 if ((
ret != 0) && (vctxt->err == 0))
21629 vctxt->nberrors += pctxt->nberrors;
21632 vctxt->nberrors += pctxt->nberrors;
21641static xmlSchemaAttrInfoPtr
21642xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
21645 if (vctxt->nbAttrInfos == 0)
21649 xmlSchemaAttrInfoPtr iattr;
21651 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
21652 iattr = vctxt->attrInfos[
i];
21653 if (iattr->metaType == metaType)
21674xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
21679 xmlSchemaAttrInfoPtr iattr;
21689 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21690 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
21692 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21693 XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
21696 cur = iattr->value;
21701 if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
21725 if (iattr->metaType ==
21726 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
21734 "The value must consist of tuples: the target namespace "
21742 ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
21745 VERROR_INT(
"xmlSchemaAssembleByXSI",
21746 "assembling schemata");
21749 }
while (*
cur != 0);
21754xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
21757 if (vctxt->sax !=
NULL) {
21759 xmlSchemaNodeInfoPtr
inode;
21761 for (
i = vctxt->depth;
i >= 0;
i--) {
21762 if (vctxt->elemInfos[
i]->nbNsBindings != 0) {
21763 inode = vctxt->elemInfos[
i];
21764 for (
j = 0;
j <
inode->nbNsBindings * 2;
j += 2) {
21768 inode->nsBindings[
j]))) {
21774 return (
inode->nsBindings[
j+1]);
21780#ifdef LIBXML_READER_ENABLED
21781 }
else if (vctxt->reader !=
NULL) {
21784 nsName = xmlTextReaderLookupNamespace(vctxt->reader,
prefix);
21785 if (nsName !=
NULL) {
21797 if ((vctxt->inode->node ==
NULL) ||
21798 (vctxt->inode->node->doc ==
NULL)) {
21799 VERROR_INT(
"xmlSchemaLookupNamespace",
21800 "no node or node's doc available");
21803 ns = xmlSearchNs(vctxt->inode->node->doc,
21804 vctxt->inode->node,
prefix);
21815xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
21819 xmlSchemaValPtr *
val,
21824 if (vctxt && (vctxt->schema ==
NULL)) {
21825 VERROR_INT(
"xmlSchemaValidateNotation",
21826 "a schema is needed on the validation context");
21851 if (nsName ==
NULL) {
21856 if (xmlSchemaGetNotation(
schema, localName, nsName) !=
NULL) {
21857 if ((valNeeded) && (
val !=
NULL)) {
21858 (*val) = xmlSchemaNewNOTATIONValue(
xmlStrdup(localName),
21869 if (valNeeded && (
val !=
NULL)) {
21870 (*val) = xmlSchemaNewNOTATIONValue(
21883xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
21892 if (nsname !=
NULL) {
21894 if (nsname ==
NULL)
21897 for (
i = 0;
i < vctxt->nodeQNames->nbItems;
i += 2) {
21898 if ((vctxt->nodeQNames->items [
i] == lname) &&
21899 (vctxt->nodeQNames->items[
i +1] == nsname))
21904 i = vctxt->nodeQNames->nbItems;
21905 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) lname);
21906 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) nsname);
21925xmlSchemaAugmentIDC(
void *payload,
void *
data,
21928 xmlSchemaIDCPtr idcDef = (xmlSchemaIDCPtr) payload;
21929 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
21930 xmlSchemaIDCAugPtr aidc;
21932 aidc = (xmlSchemaIDCAugPtr)
xmlMalloc(
sizeof(xmlSchemaIDCAug));
21933 if (aidc ==
NULL) {
21934 xmlSchemaVErrMemory(vctxt,
21935 "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
21939 aidc->keyrefDepth = -1;
21940 aidc->def = idcDef;
21942 if (vctxt->aidcs ==
NULL)
21943 vctxt->aidcs = aidc;
21945 aidc->
next = vctxt->aidcs;
21946 vctxt->aidcs = aidc;
21951 if ((vctxt->hasKeyrefs == 0) &&
21952 (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
21953 vctxt->hasKeyrefs = 1;
21963xmlSchemaAugmentImportedIDC(
void *payload,
void *
data,
21965 xmlSchemaImportPtr imported = (xmlSchemaImportPtr) payload;
21966 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
21967 if (imported->schema->idcDef !=
NULL) {
21968 xmlHashScan(imported->schema->idcDef, xmlSchemaAugmentIDC, vctxt);
21980static xmlSchemaPSVIIDCBindingPtr
21981xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
21983 xmlSchemaPSVIIDCBindingPtr
ret;
21986 sizeof(xmlSchemaPSVIIDCBinding));
21988 xmlSchemaVErrMemory(
NULL,
21989 "allocating a PSVI IDC binding item",
NULL);
21992 memset(
ret, 0,
sizeof(xmlSchemaPSVIIDCBinding));
21993 ret->definition = idcDef;
22009xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
22010 xmlSchemaPSVIIDCNodePtr
item)
22015 if (vctxt->idcNodes ==
NULL) {
22016 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22017 xmlMalloc(20 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22018 if (vctxt->idcNodes ==
NULL) {
22019 xmlSchemaVErrMemory(vctxt,
22020 "allocating the IDC node table item list",
NULL);
22023 vctxt->sizeIdcNodes = 20;
22024 }
else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
22025 vctxt->sizeIdcNodes *= 2;
22026 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22027 xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
22028 sizeof(xmlSchemaPSVIIDCNodePtr));
22029 if (vctxt->idcNodes ==
NULL) {
22030 xmlSchemaVErrMemory(vctxt,
22031 "re-allocating the IDC node table item list",
NULL);
22035 vctxt->idcNodes[vctxt->nbIdcNodes++] =
item;
22050xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
22051 xmlSchemaPSVIIDCKeyPtr
key)
22056 if (vctxt->idcKeys ==
NULL) {
22057 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22058 xmlMalloc(40 *
sizeof(xmlSchemaPSVIIDCKeyPtr));
22059 if (vctxt->idcKeys ==
NULL) {
22060 xmlSchemaVErrMemory(vctxt,
22061 "allocating the IDC key storage list",
NULL);
22064 vctxt->sizeIdcKeys = 40;
22065 }
else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
22066 vctxt->sizeIdcKeys *= 2;
22067 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22068 xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
22069 sizeof(xmlSchemaPSVIIDCKeyPtr));
22070 if (vctxt->idcKeys ==
NULL) {
22071 xmlSchemaVErrMemory(vctxt,
22072 "re-allocating the IDC key storage list",
NULL);
22076 vctxt->idcKeys[vctxt->nbIdcKeys++] =
key;
22091xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr
bind,
22092 xmlSchemaPSVIIDCNodePtr ntItem)
22095 bind->sizeNodes = 10;
22096 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22097 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22099 xmlSchemaVErrMemory(
NULL,
22100 "allocating an array of IDC node-table items",
NULL);
22103 }
else if (
bind->sizeNodes <=
bind->nbNodes) {
22104 bind->sizeNodes *= 2;
22105 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22107 sizeof(xmlSchemaPSVIIDCNodePtr));
22109 xmlSchemaVErrMemory(
NULL,
22110 "re-allocating an array of IDC node-table items",
NULL);
22114 bind->nodeTable[
bind->nbNodes++] = ntItem;
22129static xmlSchemaPSVIIDCBindingPtr
22130xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
22131 xmlSchemaIDCMatcherPtr matcher)
22133 xmlSchemaNodeInfoPtr ielem;
22135 ielem = vctxt->elemInfos[matcher->depth];
22137 if (ielem->idcTable ==
NULL) {
22138 ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
22139 if (ielem->idcTable ==
NULL)
22141 return(ielem->idcTable);
22143 xmlSchemaPSVIIDCBindingPtr
bind =
NULL;
22145 bind = ielem->idcTable;
22147 if (
bind->definition == matcher->aidc->def)
22150 bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
22153 return(
bind->next);
22161static xmlSchemaItemListPtr
22162xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt
ATTRIBUTE_UNUSED,
22163 xmlSchemaIDCMatcherPtr matcher)
22165 if (matcher->targets ==
NULL)
22166 matcher->targets = xmlSchemaItemListCreate();
22167 return(matcher->targets);
22177xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr
key)
22180 xmlSchemaFreeValue(
key->val);
22191xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr
bind)
22196 xmlSchemaItemListFree(
bind->dupls);
22207xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr
bind)
22209 xmlSchemaPSVIIDCBindingPtr prev;
22214 xmlSchemaIDCFreeBinding(prev);
22221 xmlIDCHashEntryPtr
e = payload,
n;
22236xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
22238 xmlSchemaIDCMatcherPtr
next;
22240 while (matcher !=
NULL) {
22241 next = matcher->next;
22242 if (matcher->keySeqs !=
NULL) {
22244 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22245 if (matcher->keySeqs[
i] !=
NULL)
22249 if (matcher->targets !=
NULL) {
22250 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22252 xmlSchemaPSVIIDCNodePtr idcNode;
22258 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22260 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22265 xmlSchemaItemListFree(matcher->targets);
22267 if (matcher->htab !=
NULL)
22282xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
22283 xmlSchemaIDCMatcherPtr matcher)
22285 xmlSchemaIDCMatcherPtr
next;
22287 while (matcher !=
NULL) {
22288 next = matcher->next;
22289 if (matcher->keySeqs !=
NULL) {
22294 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22295 if (matcher->keySeqs[
i] !=
NULL) {
22297 matcher->keySeqs[
i] =
NULL;
22300 if (matcher->targets) {
22301 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22303 xmlSchemaPSVIIDCNodePtr idcNode;
22309 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22311 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22316 xmlSchemaItemListFree(matcher->targets);
22317 matcher->targets =
NULL;
22319 if (matcher->htab !=
NULL) {
22321 matcher->htab =
NULL;
22327 if (vctxt->idcMatcherCache !=
NULL)
22328 matcher->nextCached = vctxt->idcMatcherCache;
22329 vctxt->idcMatcherCache = matcher;
22350xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
22351 xmlSchemaIDCMatcherPtr matcher,
22352 xmlSchemaIDCSelectPtr sel,
22355 xmlSchemaIDCStateObjPtr sto;
22360 if (vctxt->xpathStatePool !=
NULL) {
22361 sto = vctxt->xpathStatePool;
22362 vctxt->xpathStatePool = sto->next;
22368 sto = (xmlSchemaIDCStateObjPtr)
xmlMalloc(
sizeof(xmlSchemaIDCStateObj));
22370 xmlSchemaVErrMemory(
NULL,
22371 "allocating an IDC state object",
NULL);
22374 memset(sto, 0,
sizeof(xmlSchemaIDCStateObj));
22379 if (vctxt->xpathStates !=
NULL)
22380 sto->next = vctxt->xpathStates;
22381 vctxt->xpathStates = sto;
22386 if (sto->xpathCtxt !=
NULL)
22387 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
22392 sto->xpathCtxt = (
void *) xmlPatternGetStreamCtxt(
22393 (xmlPatternPtr) sel->xpathComp);
22394 if (sto->xpathCtxt ==
NULL) {
22395 VERROR_INT(
"xmlSchemaIDCAddStateObject",
22396 "failed to create an XPath validation context");
22400 sto->depth = vctxt->depth;
22401 sto->matcher = matcher;
22403 sto->nbHistory = 0;
22419xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
22420 xmlElementType nodeType)
22423 int res, resolved = 0,
depth = vctxt->depth;
22425 if (vctxt->xpathStates ==
NULL)
22428 if (nodeType == XML_ATTRIBUTE_NODE)
22433 first = vctxt->xpathStates;
22435 while (sto !=
head) {
22436 if (nodeType == XML_ELEMENT_NODE)
22437 res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
22438 vctxt->inode->localName, vctxt->inode->nsName);
22440 res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
22441 vctxt->inode->localName, vctxt->inode->nsName);
22444 VERROR_INT(
"xmlSchemaXPathEvaluate",
22445 "calling xmlStreamPush()");
22456 if (sto->history ==
NULL) {
22457 sto->history = (
int *)
xmlMalloc(5 *
sizeof(
int));
22458 if (sto->history ==
NULL) {
22459 xmlSchemaVErrMemory(
NULL,
22460 "allocating the state object history",
NULL);
22463 sto->sizeHistory = 5;
22464 }
else if (sto->sizeHistory <= sto->nbHistory) {
22465 sto->sizeHistory *= 2;
22466 sto->history = (
int *)
xmlRealloc(sto->history,
22467 sto->sizeHistory *
sizeof(
int));
22468 if (sto->history ==
NULL) {
22469 xmlSchemaVErrMemory(
NULL,
22470 "re-allocating the state object history",
NULL);
22474 sto->history[sto->nbHistory++] =
depth;
22476 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22477 xmlSchemaIDCSelectPtr sel;
22482 sel = sto->matcher->aidc->def->fields;
22483 while (sel !=
NULL) {
22484 if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
22485 sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
22489 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22497 if (resolved == 0) {
22498 if ((vctxt->inode->flags &
22499 XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
22500 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
22505 if (sto->next ==
NULL) {
22510 sto = vctxt->xpathStates;
22518xmlSchemaFormatIDCKeySequence_1(xmlSchemaValidCtxtPtr vctxt,
22520 xmlSchemaPSVIIDCKeyPtr *seq,
22521 int count,
int for_hash)
22530 res = xmlSchemaGetCanonValueWhtspExt(seq[
i]->
val,
22531 xmlSchemaGetWhiteSpaceFacetValue(seq[
i]->
type),
22534 res = xmlSchemaGetCanonValueHash(seq[
i]->
val, &
value);
22539 VERROR_INT(
"xmlSchemaFormatIDCKeySequence",
22540 "failed to compute a canonical value");
22558xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
22560 xmlSchemaPSVIIDCKeyPtr *seq,
22563 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 0);
22567xmlSchemaHashKeySequence(xmlSchemaValidCtxtPtr vctxt,
22569 xmlSchemaPSVIIDCKeyPtr *seq,
22572 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 1);
22584xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
22586 xmlSchemaIDCStateObjPtr sto;
22589 if (vctxt->xpathStates ==
NULL)
22591 sto = vctxt->xpathStates;
22593 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22597 }
while (sto !=
NULL);
22613xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
22616 xmlSchemaIDCStateObjPtr sto, nextsto;
22617 int res, matchDepth;
22618 xmlSchemaPSVIIDCKeyPtr
key =
NULL;
22619 xmlSchemaTypePtr
type = vctxt->inode->typeDef, simpleType =
NULL;
22621 if (vctxt->xpathStates ==
NULL)
22623 sto = vctxt->xpathStates;
22628 while (sto !=
NULL) {
22629 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22631 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22632 "calling xmlStreamPop()");
22635 if (sto->nbHistory == 0)
22636 goto deregister_check;
22638 matchDepth = sto->history[sto->nbHistory -1];
22643 if (matchDepth !=
depth) {
22647 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22654 if (WXS_IS_COMPLEX(
type)) {
22655 if (WXS_HAS_SIMPLE_CONTENT(
type)) {
22659 simpleType =
type->contentTypeDef;
22660 if (simpleType ==
NULL) {
22661 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22662 "field resolves to a CT with simple content "
22663 "but the CT is missing the ST definition");
22670 if (simpleType ==
NULL) {
22677 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22679 WXS_BASIC_CAST sto->matcher->aidc->def,
22680 "The XPath '%s' of a field of %s does evaluate to a node of "
22683 xmlSchemaGetIDCDesignation(&
str, sto->matcher->aidc->def));
22684 FREE_AND_NULL(
str);
22686 goto deregister_check;
22689 if ((
key ==
NULL) && (vctxt->inode->val ==
NULL)) {
22695 WXS_BASIC_CAST sto->matcher->aidc->def,
22696 "Warning: No precomputed value available, the value "
22697 "was either invalid or something strange happened");
22699 goto deregister_check;
22701 xmlSchemaIDCMatcherPtr matcher = sto->matcher;
22702 xmlSchemaPSVIIDCKeyPtr *keySeq;
22723 pos = sto->depth - matcher->depth;
22724 idx = sto->sel->index;
22729 if (matcher->keySeqs ==
NULL) {
22731 matcher->sizeKeySeqs =
pos * 2;
22733 matcher->sizeKeySeqs = 10;
22734 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22736 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22737 if (matcher->keySeqs ==
NULL) {
22738 xmlSchemaVErrMemory(
NULL,
22739 "allocating an array of key-sequences",
22743 memset(matcher->keySeqs, 0,
22744 matcher->sizeKeySeqs *
22745 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22746 }
else if (
pos >= matcher->sizeKeySeqs) {
22747 int i = matcher->sizeKeySeqs;
22749 matcher->sizeKeySeqs =
pos * 2;
22750 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22752 matcher->sizeKeySeqs *
22753 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22754 if (matcher->keySeqs ==
NULL) {
22755 xmlSchemaVErrMemory(
NULL,
22756 "reallocating an array of key-sequences",
22764 for (;
i < matcher->sizeKeySeqs;
i++)
22765 matcher->keySeqs[
i] =
NULL;
22771 keySeq = matcher->keySeqs[
pos];
22772 if (keySeq ==
NULL) {
22773 goto create_sequence;
22774 }
else if (keySeq[
idx] !=
NULL) {
22786 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22788 WXS_BASIC_CAST matcher->aidc->def,
22789 "The XPath '%s' of a field of %s evaluates to a "
22790 "node-set with more than one member",
22792 xmlSchemaGetIDCDesignation(&
str, matcher->aidc->def));
22793 FREE_AND_NULL(
str);
22795 goto deregister_check;
22803 keySeq = (xmlSchemaPSVIIDCKeyPtr *)
xmlMalloc(
22804 matcher->aidc->def->nbFields *
22805 sizeof(xmlSchemaPSVIIDCKeyPtr));
22806 if (keySeq ==
NULL) {
22807 xmlSchemaVErrMemory(
NULL,
22808 "allocating an IDC key-sequence",
NULL);
22811 memset(keySeq, 0, matcher->aidc->def->nbFields *
22812 sizeof(xmlSchemaPSVIIDCKeyPtr));
22813 matcher->keySeqs[
pos] = keySeq;
22820 sizeof(xmlSchemaPSVIIDCKey));
22822 xmlSchemaVErrMemory(
NULL,
22823 "allocating a IDC key",
NULL);
22825 matcher->keySeqs[
pos] =
NULL;
22831 key->type = simpleType;
22832 key->val = vctxt->inode->val;
22833 vctxt->inode->val =
NULL;
22837 if (xmlSchemaIDCStoreKey(vctxt,
key) == -1) {
22838 xmlSchemaIDCFreeKey(
key);
22844 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22846 xmlSchemaPSVIIDCKeyPtr **keySeq =
NULL;
22848 xmlSchemaPSVIIDCNodePtr ntItem;
22849 xmlSchemaIDCMatcherPtr matcher;
22850 xmlSchemaIDCPtr idc;
22851 xmlSchemaItemListPtr targets;
22852 int pos,
i,
j, nbKeys;
22864 matcher = sto->matcher;
22865 idc = matcher->aidc->def;
22866 nbKeys = idc->nbFields;
22872 if ((matcher->keySeqs ==
NULL) ||
22873 (matcher->sizeKeySeqs <=
pos)) {
22874 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22875 goto selector_key_error;
22877 goto selector_leave;
22880 keySeq = &(matcher->keySeqs[
pos]);
22881 if (*keySeq ==
NULL) {
22882 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22883 goto selector_key_error;
22885 goto selector_leave;
22888 for (
i = 0;
i < nbKeys;
i++) {
22889 if ((*keySeq)[
i] ==
NULL) {
22893 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
22897 goto selector_key_error;
22899 goto selector_leave;
22916 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
22918 targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
22919 if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
22920 (targets->nbItems != 0)) {
22921 xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
22922 xmlIDCHashEntryPtr
e;
22926 if (!matcher->htab)
22930 xmlSchemaHashKeySequence(vctxt, &
value, *keySeq, nbKeys);
22932 FREE_AND_NULL(
value);
22940 ((xmlSchemaPSVIIDCNodePtr) targets->items[
e->index])->keys;
22941 for (
j = 0;
j < nbKeys;
j++) {
22942 ckey = (*keySeq)[
j];
22944 res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
22947 }
else if (
res == 0) {
22967 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22969 WXS_BASIC_CAST idc,
22970 "Duplicate key-sequence %s in %s",
22971 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
22972 (*keySeq), nbKeys),
22973 xmlSchemaGetIDCDesignation(&strB, idc));
22974 FREE_AND_NULL(
str);
22975 FREE_AND_NULL(strB);
22976 goto selector_leave;
22982 ntItem = (xmlSchemaPSVIIDCNodePtr)
xmlMalloc(
22983 sizeof(xmlSchemaPSVIIDCNode));
22984 if (ntItem ==
NULL) {
22985 xmlSchemaVErrMemory(
NULL,
22986 "allocating an IDC node-table item",
NULL);
22991 memset(ntItem, 0,
sizeof(xmlSchemaPSVIIDCNode));
22996 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
22997 if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
23003 ntItem->nodeQNameID = -1;
23009 ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
23010 vctxt->inode->localName, vctxt->inode->nsName);
23011 if (ntItem->nodeQNameID == -1) {
23022 ntItem->node = vctxt->node;
23023 ntItem->nodeLine = vctxt->inode->nodeLine;
23024 ntItem->keys = *keySeq;
23027 if (xmlSchemaIDCAppendNodeTableItem(
bind, ntItem) == -1)
23029 if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
23030 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23040 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23042 xmlIDCHashEntryPtr
r,
e;
23043 if (!matcher->htab)
23045 xmlSchemaHashKeySequence(vctxt, &
value, ntItem->keys, nbKeys);
23047 e->index = targets->nbItems - 1;
23056 FREE_AND_NULL(
value);
23059 goto selector_leave;
23069 xmlSchemaCustomErr(ACTXT_CAST vctxt,
23071 WXS_BASIC_CAST idc,
23072 "Not all fields of %s evaluate to a node",
23073 xmlSchemaGetIDCDesignation(&
str, idc),
NULL);
23074 FREE_AND_NULL(
str);
23080 if ((keySeq !=
NULL) && (*keySeq !=
NULL)) {
23092 if ((sto->nbHistory == 0) && (sto->depth ==
depth)) {
23093 if (vctxt->xpathStates != sto) {
23094 VERROR_INT(
"xmlSchemaXPathProcessHistory",
23095 "The state object to be removed is not the first "
23098 nextsto = sto->next;
23102 vctxt->xpathStates = sto->next;
23103 sto->next = vctxt->xpathStatePool;
23107 vctxt->xpathStatePool = sto;
23126xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
23127 xmlSchemaElementPtr elemDecl)
23129 xmlSchemaIDCMatcherPtr matcher,
last =
NULL;
23130 xmlSchemaIDCPtr idc, refIdc;
23131 xmlSchemaIDCAugPtr aidc;
23133 idc = (xmlSchemaIDCPtr) elemDecl->idcs;
23137 if (vctxt->inode->idcMatchers !=
NULL) {
23138 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23139 "The chain of IDC matchers is expected to be empty");
23143 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23151 refIdc = (xmlSchemaIDCPtr) idc->ref->item;
23156 vctxt->inode->hasKeyrefs = 1;
23160 aidc = vctxt->aidcs;
23161 while (aidc !=
NULL) {
23162 if (aidc->def == refIdc)
23166 if (aidc ==
NULL) {
23167 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23168 "Could not find an augmented IDC item for an IDC "
23172 if ((aidc->keyrefDepth == -1) ||
23173 (vctxt->depth < aidc->keyrefDepth))
23174 aidc->keyrefDepth = vctxt->depth;
23180 aidc = vctxt->aidcs;
23181 while (aidc !=
NULL) {
23182 if (aidc->def == idc)
23186 if (aidc ==
NULL) {
23187 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23188 "Could not find an augmented IDC item for an IDC definition");
23194 if (vctxt->idcMatcherCache !=
NULL) {
23198 matcher = vctxt->idcMatcherCache;
23199 vctxt->idcMatcherCache = matcher->nextCached;
23200 matcher->nextCached =
NULL;
23202 matcher = (xmlSchemaIDCMatcherPtr)
23203 xmlMalloc(
sizeof(xmlSchemaIDCMatcher));
23204 if (matcher ==
NULL) {
23205 xmlSchemaVErrMemory(vctxt,
23206 "allocating an IDC matcher",
NULL);
23209 memset(matcher, 0,
sizeof(xmlSchemaIDCMatcher));
23212 vctxt->inode->idcMatchers = matcher;
23214 last->next = matcher;
23217 matcher->type = IDC_MATCHER;
23218 matcher->depth = vctxt->depth;
23219 matcher->aidc = aidc;
23220 matcher->idcType = aidc->def->type;
23224 if (xmlSchemaIDCAddStateObject(vctxt, matcher,
23225 idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
23229 }
while (idc !=
NULL);
23234xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
23235 xmlSchemaNodeInfoPtr ielem)
23237 xmlSchemaPSVIIDCBindingPtr
bind;
23238 int res,
i,
j,
k, nbTargets, nbFields, nbDupls, nbNodeTable;
23239 xmlSchemaPSVIIDCKeyPtr *
keys, *ntkeys;
23240 xmlSchemaPSVIIDCNodePtr *targets, *dupls;
23242 xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
23244 while (matcher !=
NULL) {
23248 if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
23249 WXS_ILIST_IS_EMPTY(matcher->targets))
23251 matcher = matcher->next;
23258 if ((! vctxt->createIDCNodeTables) &&
23259 ((matcher->aidc->keyrefDepth == -1) ||
23260 (matcher->aidc->keyrefDepth > vctxt->depth)))
23262 matcher = matcher->next;
23268 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23270 goto internal_error;
23272 if (! WXS_ILIST_IS_EMPTY(
bind->dupls)) {
23273 dupls = (xmlSchemaPSVIIDCNodePtr *)
bind->dupls->items;
23274 nbDupls =
bind->dupls->nbItems;
23280 nbNodeTable =
bind->nbNodes;
23285 if ((nbNodeTable == 0) && (nbDupls == 0)) {
23290 (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23291 bind->sizeNodes = matcher->targets->sizeItems;
23292 bind->nbNodes = matcher->targets->nbItems;
23294 matcher->targets->items =
NULL;
23295 matcher->targets->sizeItems = 0;
23296 matcher->targets->nbItems = 0;
23297 if (matcher->htab) {
23299 matcher->htab =
NULL;
23305 nbTargets = matcher->targets->nbItems;
23306 targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23307 nbFields = matcher->aidc->def->nbFields;
23310 keys = targets[
i]->keys;
23317 if (nbFields == 1) {
23321 goto internal_error;
23330 ntkeys = dupls[
j]->keys;
23331 for (
k = 0;
k < nbFields;
k++) {
23335 goto internal_error;
23351 }
while (
j < nbDupls);
23356 if (nbFields == 1) {
23358 bind->nodeTable[
j]->keys[0]->val);
23360 goto internal_error;
23365 goto next_node_table_entry;
23369 ntkeys =
bind->nodeTable[
j]->keys;
23370 for (
k = 0;
k < nbFields;
k++) {
23374 goto internal_error;
23379 goto next_node_table_entry;
23387 bind->dupls = xmlSchemaItemListCreate();
23389 goto internal_error;
23391 if (xmlSchemaItemListAdd(
bind->dupls,
bind->nodeTable[
j]) == -1)
23392 goto internal_error;
23401next_node_table_entry:
23403 }
while (
j < nbNodeTable);
23409 if (xmlSchemaIDCAppendNodeTableItem(
bind, targets[
i]) == -1)
23410 goto internal_error;
23414 }
while (
i < nbTargets);
23416 matcher = matcher->next;
23436xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
23438 xmlSchemaPSVIIDCBindingPtr
bind;
23439 xmlSchemaPSVIIDCBindingPtr *parTable, parBind =
NULL;
23440 xmlSchemaPSVIIDCNodePtr
node, parNode =
NULL, *dupls, *parNodes;
23441 xmlSchemaIDCAugPtr aidc;
23442 int i,
j,
k,
ret = 0, nbFields, oldNum, oldDupls;
23444 bind = vctxt->inode->idcTable;
23450 parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
23457 if ((
bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(
bind->dupls))
23462 if (! vctxt->createIDCNodeTables) {
23463 aidc = vctxt->aidcs;
23465 if (aidc->def ==
bind->definition) {
23466 if ((aidc->keyrefDepth == -1) ||
23467 (aidc->keyrefDepth >= vctxt->depth)) {
23473 }
while (aidc !=
NULL);
23476 if (parTable !=
NULL)
23477 parBind = *parTable;
23482 while (parBind !=
NULL) {
23483 if (parBind->definition ==
bind->definition)
23485 parBind = parBind->next;
23488 if (parBind !=
NULL) {
23493 oldNum = parBind->nbNodes;
23495 if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
23496 oldDupls = parBind->dupls->nbItems;
23497 dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
23503 parNodes = parBind->nodeTable;
23504 nbFields =
bind->definition->nbFields;
23506 for (
i = 0;
i <
bind->nbNodes;
i++) {
23516 while (
j < oldDupls) {
23517 if (nbFields == 1) {
23518 ret = xmlSchemaAreValuesEqual(
23519 node->keys[0]->val,
23520 dupls[
j]->keys[0]->val);
23522 goto internal_error;
23528 parNode = dupls[
j];
23529 for (
k = 0;
k < nbFields;
k++) {
23530 ret = xmlSchemaAreValuesEqual(
23531 node->keys[
k]->val,
23532 parNode->keys[
k]->val);
23534 goto internal_error;
23544 if (
j != oldDupls) {
23554 while (
j < oldNum) {
23555 parNode = parNodes[
j];
23556 if (nbFields == 1) {
23557 ret = xmlSchemaAreValuesEqual(
23558 node->keys[0]->val,
23559 parNode->keys[0]->val);
23561 goto internal_error;
23567 for (
k = 0;
k < nbFields;
k++) {
23568 ret = xmlSchemaAreValuesEqual(
23569 node->keys[
k]->val,
23570 parNode->keys[
k]->val);
23572 goto internal_error;
23589 parBind->nbNodes--;
23593 parNodes[
j] = parNodes[oldNum];
23595 if (parBind->nbNodes != oldNum) {
23601 parNodes[parBind->nbNodes];
23603 if (parBind->dupls ==
NULL) {
23604 parBind->dupls = xmlSchemaItemListCreate();
23605 if (parBind->dupls ==
NULL)
23606 goto internal_error;
23608 xmlSchemaItemListAdd(parBind->dupls, parNode);
23614 if (parBind->nodeTable ==
NULL) {
23615 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23616 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
23617 if (parBind->nodeTable ==
NULL) {
23618 xmlSchemaVErrMemory(
NULL,
23619 "allocating IDC list of node-table items",
NULL);
23620 goto internal_error;
23622 parBind->sizeNodes = 1;
23623 }
else if (parBind->nbNodes >= parBind->sizeNodes) {
23624 parBind->sizeNodes *= 2;
23625 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23626 xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
23627 sizeof(xmlSchemaPSVIIDCNodePtr));
23628 if (parBind->nodeTable ==
NULL) {
23629 xmlSchemaVErrMemory(
NULL,
23630 "re-allocating IDC list of node-table items",
NULL);
23631 goto internal_error;
23634 parNodes = parBind->nodeTable;
23639 parNodes[parBind->nbNodes++] =
node;
23650 parBind = xmlSchemaIDCNewBinding(
bind->definition);
23651 if (parBind ==
NULL)
23652 goto internal_error;
23658 if (
bind->nbNodes != 0) {
23662 if (! vctxt->psviExposeIDCNodeTables) {
23669 parBind->nodeTable =
bind->nodeTable;
23671 parBind->sizeNodes =
bind->sizeNodes;
23672 bind->sizeNodes = 0;
23673 parBind->nbNodes =
bind->nbNodes;
23679 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23681 sizeof(xmlSchemaPSVIIDCNodePtr));
23682 if (parBind->nodeTable ==
NULL) {
23683 xmlSchemaVErrMemory(
NULL,
23684 "allocating an array of IDC node-table "
23686 xmlSchemaIDCFreeBinding(parBind);
23687 goto internal_error;
23689 parBind->sizeNodes =
bind->nbNodes;
23690 parBind->nbNodes =
bind->nbNodes;
23692 bind->nbNodes *
sizeof(xmlSchemaPSVIIDCNodePtr));
23699 if (parBind->dupls !=
NULL)
23700 xmlSchemaItemListFree(parBind->dupls);
23701 parBind->dupls =
bind->dupls;
23704 if (parTable !=
NULL) {
23705 if (*parTable ==
NULL)
23706 *parTable = parBind;
23708 parBind->
next = *parTable;
23709 *parTable = parBind;
23731xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
23733 xmlSchemaIDCMatcherPtr matcher;
23734 xmlSchemaPSVIIDCBindingPtr
bind;
23736 matcher = vctxt->inode->idcMatchers;
23740 while (matcher !=
NULL) {
23741 if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
23742 matcher->targets &&
23743 matcher->targets->nbItems)
23745 int i,
j,
k,
res, nbFields, hasDupls;
23746 xmlSchemaPSVIIDCKeyPtr *refKeys, *
keys;
23747 xmlSchemaPSVIIDCNodePtr refNode =
NULL;
23750 nbFields = matcher->aidc->def->nbFields;
23755 bind = vctxt->inode->idcTable;
23757 if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
23762 hasDupls = (
bind &&
bind->dupls &&
bind->dupls->nbItems) ? 1 : 0;
23768 for (
j = 0;
j <
bind->nbNodes;
j++) {
23770 xmlIDCHashEntryPtr
r,
e;
23772 xmlSchemaHashKeySequence(vctxt, &
value,
keys, nbFields);
23783 FREE_AND_NULL(
value);
23786 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
23788 refNode = matcher->targets->items[
i];
23791 xmlIDCHashEntryPtr
e;
23792 refKeys = refNode->keys;
23793 xmlSchemaHashKeySequence(vctxt, &
value, refKeys, nbFields);
23795 FREE_AND_NULL(
value);
23798 keys =
bind->nodeTable[
e->index]->keys;
23799 for (
k = 0;
k < nbFields;
k++) {
23804 else if (
res == -1) {
23815 if ((
res == 0) && hasDupls) {
23819 for (
j = 0;
j <
bind->dupls->nbItems;
j++) {
23820 keys = ((xmlSchemaPSVIIDCNodePtr)
23821 bind->dupls->items[
j])->keys;
23822 for (
k = 0;
k < nbFields;
k++) {
23827 else if (
res == -1) {
23836 xmlSchemaKeyrefErr(vctxt,
23838 (xmlSchemaTypePtr) matcher->aidc->def,
23839 "More than one match found for "
23840 "key-sequence %s of keyref '%s'",
23841 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
23842 refNode->keys, nbFields),
23843 xmlSchemaGetComponentQName(&strB,
23844 matcher->aidc->def));
23845 FREE_AND_NULL(
str);
23846 FREE_AND_NULL(strB);
23855 xmlSchemaKeyrefErr(vctxt,
23857 (xmlSchemaTypePtr) matcher->aidc->def,
23858 "No match found for key-sequence %s of keyref '%s'",
23859 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
23860 refNode->keys, nbFields),
23861 xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
23862 FREE_AND_NULL(
str);
23863 FREE_AND_NULL(strB);
23870 matcher = matcher->next;
23882static xmlSchemaAttrInfoPtr
23883xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
23885 xmlSchemaAttrInfoPtr iattr;
23889 if (vctxt->attrInfos ==
NULL) {
23890 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23891 xmlMalloc(
sizeof(xmlSchemaAttrInfoPtr));
23892 vctxt->sizeAttrInfos = 1;
23893 if (vctxt->attrInfos ==
NULL) {
23894 xmlSchemaVErrMemory(vctxt,
23895 "allocating attribute info list",
NULL);
23898 }
else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
23899 vctxt->sizeAttrInfos++;
23900 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23902 vctxt->sizeAttrInfos *
sizeof(xmlSchemaAttrInfoPtr));
23903 if (vctxt->attrInfos ==
NULL) {
23904 xmlSchemaVErrMemory(vctxt,
23905 "re-allocating attribute info list",
NULL);
23909 iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
23910 if (iattr->localName !=
NULL) {
23911 VERROR_INT(
"xmlSchemaGetFreshAttrInfo",
23912 "attr info not cleared");
23915 iattr->nodeType = XML_ATTRIBUTE_NODE;
23921 iattr = (xmlSchemaAttrInfoPtr)
23923 if (iattr ==
NULL) {
23924 xmlSchemaVErrMemory(vctxt,
"creating new attribute info",
NULL);
23927 memset(iattr, 0,
sizeof(xmlSchemaAttrInfo));
23928 iattr->nodeType = XML_ATTRIBUTE_NODE;
23929 vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
23935xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
23936 xmlNodePtr attrNode,
23944 xmlSchemaAttrInfoPtr
attr;
23946 attr = xmlSchemaGetFreshAttrInfo(vctxt);
23948 VERROR_INT(
"xmlSchemaPushAttribute",
23949 "calling xmlSchemaGetFreshAttrInfo()");
23952 attr->node = attrNode;
23953 attr->nodeLine = nodeLine;
23954 attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
23955 attr->localName = localName;
23956 attr->nsName = nsName;
23958 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
23962 if (nsName !=
NULL) {
23965 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
23969 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
23973 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
23977 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
23980 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
23985 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
23986 if (
attr->metaType != 0)
23987 attr->state = XML_SCHEMAS_ATTR_META;
23997xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
23998 xmlSchemaNodeInfoPtr ielem)
24000 ielem->hasKeyrefs = 0;
24001 ielem->appliedXPath = 0;
24002 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
24003 FREE_AND_NULL(ielem->localName);
24004 FREE_AND_NULL(ielem->nsName);
24006 ielem->localName =
NULL;
24007 ielem->nsName =
NULL;
24009 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
24010 FREE_AND_NULL(ielem->value);
24012 ielem->value =
NULL;
24014 if (ielem->val !=
NULL) {
24019 xmlSchemaFreeValue(ielem->val);
24022 if (ielem->idcMatchers !=
NULL) {
24027 xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
24029 xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
24031 ielem->idcMatchers =
NULL;
24033 if (ielem->idcTable !=
NULL) {
24037 xmlSchemaIDCFreeIDCTable(ielem->idcTable);
24038 ielem->idcTable =
NULL;
24040 if (ielem->regexCtxt !=
NULL) {
24041 xmlRegFreeExecCtxt(ielem->regexCtxt);
24042 ielem->regexCtxt =
NULL;
24044 if (ielem->nsBindings !=
NULL) {
24046 ielem->nsBindings =
NULL;
24047 ielem->nbNsBindings = 0;
24048 ielem->sizeNsBindings = 0;
24061static xmlSchemaNodeInfoPtr
24062xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
24066 if (vctxt->depth > vctxt->sizeElemInfos) {
24067 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24068 "inconsistent depth encountered");
24071 if (vctxt->elemInfos ==
NULL) {
24072 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24073 xmlMalloc(10 *
sizeof(xmlSchemaNodeInfoPtr));
24074 if (vctxt->elemInfos ==
NULL) {
24075 xmlSchemaVErrMemory(vctxt,
24076 "allocating the element info array",
NULL);
24079 memset(vctxt->elemInfos, 0, 10 *
sizeof(xmlSchemaNodeInfoPtr));
24080 vctxt->sizeElemInfos = 10;
24081 }
else if (vctxt->sizeElemInfos <= vctxt->depth) {
24082 int i = vctxt->sizeElemInfos;
24084 vctxt->sizeElemInfos *= 2;
24085 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24086 xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
24087 sizeof(xmlSchemaNodeInfoPtr));
24088 if (vctxt->elemInfos ==
NULL) {
24089 xmlSchemaVErrMemory(vctxt,
24090 "re-allocating the element info array",
NULL);
24097 for (;
i < vctxt->sizeElemInfos;
i++)
24098 vctxt->elemInfos[
i] =
NULL;
24100 info = vctxt->elemInfos[vctxt->depth];
24103 info = (xmlSchemaNodeInfoPtr)
24106 xmlSchemaVErrMemory(vctxt,
24107 "allocating an element info",
NULL);
24110 vctxt->elemInfos[vctxt->depth] =
info;
24113 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24114 "elem info has not been cleared");
24119 info->nodeType = XML_ELEMENT_NODE;
24120 info->depth = vctxt->depth;
24125#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
24126#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
24127#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
24130xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
24132 xmlSchemaTypePtr
type,
24133 xmlSchemaValType valType,
24135 xmlSchemaValPtr
val,
24141 xmlSchemaTypePtr tmpType;
24142 xmlSchemaFacetLinkPtr facetLink;
24143 xmlSchemaFacetPtr facet;
24144 unsigned long len = 0;
24145 xmlSchemaWhitespaceValueType
ws;
24150 if (
type->type == XML_SCHEMA_TYPE_BASIC)
24159 goto pattern_and_enum;
24161 if (! WXS_IS_ATOMIC(
type)) {
24162 if (WXS_IS_LIST(
type))
24165 goto pattern_and_enum;
24172 tmpType = xmlSchemaGetPrimitiveType(
type);
24173 if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
24174 WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
24175 ws = xmlSchemaGetWhiteSpaceFacetValue(
type);
24177 ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
24185 valType = xmlSchemaGetValType(
val);
24188 for (facetLink =
type->facetSet; facetLink !=
NULL;
24189 facetLink = facetLink->
next) {
24194 switch (facetLink->facet->type) {
24195 case XML_SCHEMA_FACET_WHITESPACE:
24196 case XML_SCHEMA_FACET_PATTERN:
24197 case XML_SCHEMA_FACET_ENUMERATION:
24199 case XML_SCHEMA_FACET_LENGTH:
24200 case XML_SCHEMA_FACET_MINLENGTH:
24201 case XML_SCHEMA_FACET_MAXLENGTH:
24202 ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
24206 ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
24211 AERROR_INT(
"xmlSchemaValidateFacets",
24212 "validating against a atomic type facet");
24214 }
else if (
ret > 0) {
24216 xmlSchemaFacetErr(actxt,
ret,
node,
24227 if (! WXS_IS_LIST(
type))
24228 goto pattern_and_enum;
24233 for (facetLink =
type->facetSet; facetLink !=
NULL;
24234 facetLink = facetLink->
next) {
24236 switch (facetLink->facet->type) {
24237 case XML_SCHEMA_FACET_LENGTH:
24238 case XML_SCHEMA_FACET_MINLENGTH:
24239 case XML_SCHEMA_FACET_MAXLENGTH:
24240 ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
24247 AERROR_INT(
"xmlSchemaValidateFacets",
24248 "validating against a list type facet");
24250 }
else if (
ret > 0) {
24252 xmlSchemaFacetErr(actxt,
ret,
node,
24274 for (facet = tmpType->facets; facet !=
NULL; facet = facet->
next) {
24275 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
24278 ret = xmlSchemaAreValuesEqual(facet->val,
val);
24281 else if (
ret < 0) {
24282 AERROR_INT(
"xmlSchemaValidateFacets",
24283 "validating against an enumeration facet");
24297 tmpType = tmpType->baseType;
24298 }
while ((tmpType !=
NULL) &&
24299 (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24300 if (found && (
ret == 0)) {
24303 xmlSchemaFacetErr(actxt,
ret,
node,
24319 for (facetLink = tmpType->facetSet; facetLink !=
NULL;
24320 facetLink = facetLink->
next) {
24321 if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
24328 ret = xmlRegexpExec(facetLink->facet->regexp,
value);
24331 else if (
ret < 0) {
24332 AERROR_INT(
"xmlSchemaValidateFacets",
24333 "validating against a pattern facet");
24339 facet = facetLink->facet;
24342 if (found && (
ret != 1)) {
24345 xmlSchemaFacetErr(actxt,
ret,
node,
24353 tmpType = tmpType->baseType;
24354 }
while ((tmpType !=
NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24360xmlSchemaNormalizeValue(xmlSchemaTypePtr
type,
24363 switch (xmlSchemaGetWhiteSpaceFacetValue(
type)) {
24364 case XML_SCHEMA_WHITESPACE_COLLAPSE:
24365 return (xmlSchemaCollapseString(
value));
24366 case XML_SCHEMA_WHITESPACE_REPLACE:
24367 return (xmlSchemaWhiteSpaceReplace(
value));
24374xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
24376 xmlSchemaValPtr *
val,
24387 VERROR_INT(
"xmlSchemaValidateQName",
24388 "calling xmlValidateQName()");
24398 stripped = xmlSchemaCollapseString(
value);
24408 nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
24416 if (nsName ==
NULL) {
24418 xmlSchemaCustomErr(ACTXT_CAST vctxt,
ret,
NULL,
24419 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24420 "The QName value '%s' has no "
24421 "corresponding namespace declaration in "
24428 if (valNeeded &&
val) {
24429 if (nsName !=
NULL)
24430 *
val = xmlSchemaNewQNameValue(
24433 *
val = xmlSchemaNewQNameValue(
NULL,
24444xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
24446 xmlSchemaTypePtr
type,
24448 xmlSchemaValPtr *retVal,
24453 int ret = 0, valNeeded = (retVal) ? 1 : 0;
24458#define NORMALIZE(atype) \
24459 if ((! isNormalized) && \
24460 (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
24461 normValue = xmlSchemaNormalizeValue(atype, value); \
24462 if (normValue != NULL) \
24463 value = normValue; \
24464 isNormalized = 1; \
24467 if ((retVal !=
NULL) && (*retVal !=
NULL)) {
24468 xmlSchemaFreeValue(*retVal);
24493 if ((! valNeeded) && (
type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
24497 if (WXS_IS_ANY_SIMPLE_TYPE(
type) || WXS_IS_ATOMIC(
type)) {
24498 xmlSchemaTypePtr biType;
24507 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
24511 biType =
type->baseType;
24512 while ((biType !=
NULL) &&
24513 (biType->type != XML_SCHEMA_TYPE_BASIC))
24514 biType = biType->baseType;
24516 if (biType ==
NULL) {
24517 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24518 "could not get the built-in type");
24519 goto internal_error;
24527 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
24528 switch (biType->builtInType) {
24529 case XML_SCHEMAS_NOTATION:
24530 ret = xmlSchemaValidateNotation(
24531 (xmlSchemaValidCtxtPtr) actxt,
24532 ((xmlSchemaValidCtxtPtr) actxt)->
schema,
24535 case XML_SCHEMAS_QNAME:
24536 ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
24542 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24545 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24549 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
24550 switch (biType->builtInType) {
24551 case XML_SCHEMAS_NOTATION:
24552 ret = xmlSchemaValidateNotation(
NULL,
24553 ((xmlSchemaParserCtxtPtr) actxt)->
schema,
node,
24559 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24562 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24571 goto internal_error;
24575 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24576 "validating against a built-in type");
24577 goto internal_error;
24579 if (WXS_IS_LIST(
type))
24584 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24589 (xmlSchemaValType) biType->builtInType,
value,
val,
24593 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24594 "validating facets of atomic simple type");
24595 goto internal_error;
24597 if (WXS_IS_LIST(
type))
24603 else if (fireErrors && (
ret > 0))
24605 }
else if (WXS_IS_LIST(
type)) {
24607 xmlSchemaTypePtr itemType;
24610 unsigned long len = 0;
24611 xmlSchemaValPtr prevVal =
NULL, curVal =
NULL;
24625 itemType = WXS_LIST_ITEMTYPE(
type);
24639 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24640 tmpValue, &curVal, fireErrors, 0, 1);
24642 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24643 tmpValue,
NULL, fireErrors, 0, 1);
24644 FREE_AND_NULL(tmpValue);
24645 if (curVal !=
NULL) {
24652 xmlSchemaValueAppend(prevVal, curVal);
24658 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24659 "validating an item of list simple type");
24660 goto internal_error;
24666 }
while (*
cur != 0);
24667 FREE_AND_NULL(tmpValue);
24668 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24677 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24678 "validating facets of list simple type");
24679 goto internal_error;
24684 if (fireErrors && (
ret > 0)) {
24692 }
else if (WXS_IS_UNION(
type)) {
24693 xmlSchemaTypeLinkPtr memberLink;
24710 memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
type);
24711 if (memberLink ==
NULL) {
24712 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24713 "union simple type has no member types");
24714 goto internal_error;
24722 while (memberLink !=
NULL) {
24724 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24725 memberLink->type,
value, &
val, 0, 1, 0);
24727 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24728 memberLink->type,
value,
NULL, 0, 1, 0);
24731 memberLink = memberLink->next;
24735 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24736 "validating members of union simple type");
24737 goto internal_error;
24744 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24756 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24757 "validating facets of union simple type");
24758 goto internal_error;
24763 if (fireErrors && (
ret > 0))
24767 if (normValue !=
NULL)
24770 if (retVal !=
NULL)
24773 xmlSchemaFreeValue(
val);
24775 xmlSchemaFreeValue(
val);
24778 if (normValue !=
NULL)
24781 xmlSchemaFreeValue(
val);
24786xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
24793 if ((nsName ==
NULL) || (localName ==
NULL))
24802 xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
24804 value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
24823 *nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
24830 if (*nsName ==
NULL) {
24831 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24833 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24834 "The QName value '%s' has no "
24835 "corresponding namespace declaration in scope",
24845xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
24846 xmlSchemaAttrInfoPtr iattr,
24847 xmlSchemaTypePtr *localType,
24848 xmlSchemaElementPtr elemDecl)
24858 if (localType ==
NULL)
24869 ACTIVATE_ATTRIBUTE(iattr);
24874 ret = xmlSchemaVExpandQName(vctxt, iattr->value,
24878 VERROR_INT(
"xmlSchemaValidateElementByDeclaration",
24879 "calling xmlSchemaQNameExpand() to validate the "
24880 "attribute 'xsi:type'");
24881 goto internal_error;
24889 *localType = xmlSchemaGetType(vctxt->schema,
local, nsName);
24890 if (*localType ==
NULL) {
24893 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24895 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24896 "The QName value '%s' of the xsi:type attribute does not "
24897 "resolve to a type definition",
24899 FREE_AND_NULL(
str);
24903 if (elemDecl !=
NULL) {
24926 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
24927 (elemDecl->subtypes->flags &
24928 XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
24929 set |= SUBSET_EXTENSION;
24931 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
24932 (elemDecl->subtypes->flags &
24933 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
24934 set |= SUBSET_RESTRICTION;
24947 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
24948 elemDecl->subtypes,
set) != 0) {
24951 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24953 "The type definition '%s', specified by xsi:type, is "
24954 "blocked or not validly derived from the type definition "
24955 "of the element declaration",
24956 xmlSchemaFormatQName(&
str,
24957 (*localType)->targetNamespace,
24958 (*localType)->name),
24960 FREE_AND_NULL(
str);
24975xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
24977 xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
24978 xmlSchemaTypePtr actualType;
24983 if (elemDecl ==
NULL) {
24985 "No matching declaration available");
24986 return (vctxt->err);
24988 actualType = WXS_ELEM_TYPEDEF(elemDecl);
24992 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
24994 "The element declaration is abstract");
24995 return (vctxt->err);
24997 if (actualType ==
NULL) {
24999 "The type definition is absent");
25002 if (vctxt->nbAttrInfos != 0) {
25004 xmlSchemaAttrInfoPtr iattr;
25009 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25010 XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
25012 ACTIVATE_ATTRIBUTE(iattr);
25016 ret = xmlSchemaVCheckCVCSimpleType(
25017 ACTXT_CAST vctxt,
NULL,
25018 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
25019 iattr->
value, &(iattr->val), 1, 0, 0);
25022 VERROR_INT(
"xmlSchemaValidateElemDecl",
25023 "calling xmlSchemaVCheckCVCSimpleType() to "
25024 "validate the attribute 'xsi:nil'");
25028 if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
25033 "The element is not 'nillable'");
25036 if (xmlSchemaValueGetAsBoolean(iattr->val)) {
25040 if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
25041 (elemDecl->value !=
NULL)) {
25043 "The element cannot be 'nilled' because "
25044 "there is a fixed value constraint defined "
25048 vctxt->inode->flags |=
25049 XML_SCHEMA_ELEM_INFO_NILLED;
25058 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25059 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25061 xmlSchemaTypePtr localType =
NULL;
25063 ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
25067 VERROR_INT(
"xmlSchemaValidateElemDecl",
25068 "calling xmlSchemaProcessXSIType() to "
25069 "process the attribute 'xsi:type'");
25074 if (localType !=
NULL) {
25075 vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
25076 actualType = localType;
25083 if ((elemDecl->idcs !=
NULL) &&
25084 (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
25089 if (actualType ==
NULL) {
25091 "The type definition is absent");
25097 vctxt->inode->typeDef = actualType;
25103xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
25105 xmlSchemaAttrInfoPtr iattr;
25115 if (vctxt->nbAttrInfos == 0)
25117 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25118 iattr = vctxt->attrInfos[
i];
25119 if (! iattr->metaType) {
25120 ACTIVATE_ATTRIBUTE(iattr)
25121 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25134xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
25137 xmlSchemaAttrInfoPtr
attr;
25139 if (vctxt->nbAttrInfos == 0)
25141 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25142 attr = vctxt->attrInfos[
i];
25143 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
25149 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
25154 xmlSchemaFreeValue(
attr->val);
25159 vctxt->nbAttrInfos = 0;
25173xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
25175 xmlSchemaTypePtr
type = vctxt->inode->typeDef;
25176 xmlSchemaItemListPtr attrUseList;
25177 xmlSchemaAttributeUsePtr attrUse =
NULL;
25178 xmlSchemaAttributePtr attrDecl =
NULL;
25179 xmlSchemaAttrInfoPtr iattr, tmpiattr;
25180 int i,
j, found, nbAttrs, nbUses;
25181 int xpathRes = 0,
res, wildIDs = 0,
fixed;
25182 xmlNodePtr defAttrOwnerElem =
NULL;
25203 attrUseList = (xmlSchemaItemListPtr)
type->attrUses;
25207 nbAttrs = vctxt->nbAttrInfos;
25208 if (attrUseList !=
NULL)
25209 nbUses = attrUseList->nbItems;
25212 for (
i = 0;
i < nbUses;
i++) {
25214 attrUse = attrUseList->items[
i];
25215 attrDecl = WXS_ATTRUSE_DECL(attrUse);
25216 for (
j = 0;
j < nbAttrs;
j++) {
25217 iattr = vctxt->attrInfos[
j];
25222 if (iattr->metaType)
25224 if (iattr->localName[0] != attrDecl->name[0])
25226 if (!
xmlStrEqual(iattr->localName, attrDecl->name))
25228 if (!
xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
25247 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25248 iattr->use = attrUse;
25252 iattr->decl = attrDecl;
25253 iattr->typeDef = attrDecl->subtypes;
25260 if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
25270 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25271 if (tmpiattr ==
NULL) {
25273 "xmlSchemaVAttributesComplex",
25274 "calling xmlSchemaGetFreshAttrInfo()");
25277 tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
25278 tmpiattr->use = attrUse;
25279 tmpiattr->decl = attrDecl;
25280 }
else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
25281 ((attrUse->defValue !=
NULL) ||
25282 (attrDecl->defValue !=
NULL))) {
25286 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25287 if (tmpiattr ==
NULL) {
25289 "xmlSchemaVAttributesComplex",
25290 "calling xmlSchemaGetFreshAttrInfo()");
25293 tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
25294 tmpiattr->use = attrUse;
25295 tmpiattr->decl = attrDecl;
25296 tmpiattr->typeDef = attrDecl->subtypes;
25297 tmpiattr->localName = attrDecl->name;
25298 tmpiattr->nsName = attrDecl->targetNamespace;
25302 if (vctxt->nbAttrInfos == 0)
25307 if (
type->attributeWildcard !=
NULL) {
25312 for (
i = 0;
i < nbAttrs;
i++) {
25313 iattr = vctxt->attrInfos[
i];
25318 if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
25330 if (xmlSchemaCheckCVCWildcardNamespace(
type->attributeWildcard,
25331 iattr->nsName) == 0) {
25341 if (
type->attributeWildcard->processContents ==
25342 XML_SCHEMAS_ANY_SKIP) {
25350 iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
25356 iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
25357 iattr->localName, iattr->nsName);
25358 if (iattr->decl !=
NULL) {
25359 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25373 iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
25374 if (xmlSchemaIsDerivedFromBuiltInType(
25375 iattr->typeDef, XML_SCHEMAS_ID)) {
25380 if (wildIDs != 0) {
25382 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
25394 if (attrUseList !=
NULL) {
25395 for (
j = 0;
j < attrUseList->nbItems;
j++) {
25396 if (xmlSchemaIsDerivedFromBuiltInType(
25397 WXS_ATTRUSE_TYPEDEF(attrUseList->items[
j]),
25400 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
25407 }
else if (
type->attributeWildcard->processContents ==
25408 XML_SCHEMAS_ANY_LAX) {
25409 iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
25416 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
25422 if (vctxt->nbAttrInfos == 0)
25429 if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
25430 xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
25431 if (ielem && ielem->node && ielem->node->doc)
25432 defAttrOwnerElem = ielem->node;
25437 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25438 iattr = vctxt->attrInfos[
i];
25444 if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
25445 (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
25450 if (iattr->typeDef ==
NULL) {
25451 iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
25455 ACTIVATE_ATTRIBUTE(iattr);
25459 if (vctxt->xpathStates !=
NULL) {
25463 xpathRes = xmlSchemaXPathEvaluate(vctxt,
25464 XML_ATTRIBUTE_NODE);
25465 if (xpathRes == -1) {
25466 VERROR_INT(
"xmlSchemaVAttributesComplex",
25467 "calling xmlSchemaXPathEvaluate()");
25468 goto internal_error;
25472 if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
25478 if ((xpathRes) || (defAttrOwnerElem)) {
25479 if (iattr->use->defValue !=
NULL) {
25480 iattr->value = (
xmlChar *) iattr->use->defValue;
25481 iattr->val = iattr->use->defVal;
25483 iattr->value = (
xmlChar *) iattr->decl->defValue;
25484 iattr->val = iattr->decl->defVal;
25490 if (iattr->val ==
NULL) {
25491 VERROR_INT(
"xmlSchemaVAttributesComplex",
25492 "default/fixed value on an attribute use was "
25493 "not precomputed");
25494 goto internal_error;
25496 iattr->val = xmlSchemaCopyValue(iattr->val);
25497 if (iattr->val ==
NULL) {
25498 VERROR_INT(
"xmlSchemaVAttributesComplex",
25499 "calling xmlSchemaCopyValue()");
25500 goto internal_error;
25509 if (defAttrOwnerElem) {
25513 value = iattr->value;
25517 normValue = xmlSchemaNormalizeValue(iattr->typeDef,
25519 if (normValue !=
NULL)
25522 if (iattr->nsName ==
NULL) {
25523 if (xmlNewProp(defAttrOwnerElem,
25525 VERROR_INT(
"xmlSchemaVAttributesComplex",
25526 "calling xmlNewProp()");
25527 if (normValue !=
NULL)
25529 goto internal_error;
25534 ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
25535 defAttrOwnerElem, iattr->nsName);
25546 ns = xmlSearchNs(defAttrOwnerElem->doc,
25550 "xmlSchemaVAttributesComplex",
25551 "could not compute a ns prefix for a "
25552 "default/fixed attribute");
25553 if (normValue !=
NULL)
25555 goto internal_error;
25558 ns = xmlNewNs(vctxt->validationRoot,
25567 xmlNewNsProp(defAttrOwnerElem,
ns, iattr->localName,
value);
25569 if (normValue !=
NULL)
25580 if (vctxt->value !=
NULL) {
25584 xmlSchemaFreeValue(vctxt->value);
25585 vctxt->value =
NULL;
25591 if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
25592 ((iattr->use !=
NULL) &&
25593 (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
25606 if (xpathRes ||
fixed) {
25607 iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
25611 res = xmlSchemaVCheckCVCSimpleType(
25613 iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
25616 res = xmlSchemaVCheckCVCSimpleType(
25618 iattr->node, iattr->typeDef, iattr->value,
NULL,
25624 VERROR_INT(
"xmlSchemaVAttributesComplex",
25625 "calling xmlSchemaStreamValidateSimpleTypeValue()");
25626 goto internal_error;
25628 iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
25653 if (iattr->val ==
NULL) {
25658 if ((iattr->use !=
NULL) &&
25659 (iattr->use->defValue !=
NULL)) {
25660 if (iattr->use->defVal ==
NULL) {
25665 iattr->vcValue = iattr->use->defValue;
25672 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
25673 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25675 if (iattr->decl->defVal ==
NULL) {
25680 iattr->vcValue = iattr->decl->defValue;
25687 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
25688 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25699 if (xmlSchemaXPathProcessHistory(vctxt,
25700 vctxt->depth +1) == -1) {
25701 VERROR_INT(
"xmlSchemaVAttributesComplex",
25702 "calling xmlSchemaXPathEvaluate()");
25703 goto internal_error;
25705 }
else if (vctxt->xpathStates !=
NULL)
25706 xmlSchemaXPathPop(vctxt);
25712 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25713 iattr = vctxt->attrInfos[
i];
25714 if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
25715 (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
25716 (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
25717 (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
25719 ACTIVATE_ATTRIBUTE(iattr);
25720 switch (iattr->state) {
25721 case XML_SCHEMAS_ATTR_ERR_MISSING: {
25724 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25726 "The attribute '%s' is required but missing",
25727 xmlSchemaFormatQName(&
str,
25728 iattr->decl->targetNamespace,
25729 iattr->decl->name),
25734 case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
25736 "The type definition is absent");
25738 case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
25739 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25741 "The value '%s' does not match the fixed "
25742 "value constraint '%s'",
25743 iattr->
value, iattr->vcValue);
25745 case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
25747 "No matching global attribute declaration available, but "
25748 "demanded by the strict wildcard");
25750 case XML_SCHEMAS_ATTR_UNKNOWN:
25751 if (iattr->metaType)
25757 if (
type->attributeWildcard ==
NULL) {
25758 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25761 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25778xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
25781 xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
25787 (wild->type != XML_SCHEMA_TYPE_ANY)) {
25788 VERROR_INT(
"xmlSchemaValidateElemWildcard",
25793 if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
25802 xmlSchemaElementPtr decl =
NULL;
25804 decl = xmlSchemaGetElem(vctxt->schema,
25805 vctxt->inode->localName, vctxt->inode->nsName);
25806 if (decl !=
NULL) {
25807 vctxt->inode->decl = decl;
25811 if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
25814 "No matching global element declaration available, but "
25815 "demanded by the strict wildcard");
25816 return (vctxt->err);
25818 if (vctxt->nbAttrInfos != 0) {
25819 xmlSchemaAttrInfoPtr iattr;
25826 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25827 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25828 if (iattr !=
NULL) {
25829 if (xmlSchemaProcessXSIType(vctxt, iattr,
25830 &(vctxt->inode->typeDef),
NULL) == -1) {
25831 VERROR_INT(
"xmlSchemaValidateElemWildcard",
25832 "calling xmlSchemaProcessXSIType() to "
25833 "process the attribute 'xsi:nil'");
25847 vctxt->inode->typeDef =
25848 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
25860xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
25862 xmlSchemaValPtr *
val)
25865 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
25873 if WXS_IS_COMPLEX(
inode->typeDef) {
25883 if ((! WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) &&
25884 ((! WXS_HAS_MIXED_CONTENT(
inode->typeDef)) ||
25885 (! WXS_EMPTIABLE(
inode->typeDef)))) {
25889 "For a string to be a valid default, the type definition "
25890 "must be a simple type or a complex type with simple content "
25891 "or mixed content and a particle emptiable");
25906 if (WXS_IS_SIMPLE(
inode->typeDef)) {
25908 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25911 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
25913 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25917 VERROR_INT(
"xmlSchemaCheckCOSValidDefault",
25918 "calling xmlSchemaVCheckCVCSimpleType()");
25926 void *transdata,
void *inputdata)
25928 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) transdata;
25929 xmlSchemaNodeInfoPtr
inode = (xmlSchemaNodeInfoPtr) inputdata;
25934xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
25936 vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
25937 if (vctxt->inode ==
NULL) {
25938 VERROR_INT(
"xmlSchemaValidatorPushElem",
25939 "calling xmlSchemaGetFreshElemInfo()");
25942 vctxt->nbAttrInfos = 0;
25947xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
25948 xmlSchemaNodeInfoPtr
inode,
25949 xmlSchemaTypePtr
type,
25952 if (
inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
25953 return (xmlSchemaVCheckCVCSimpleType(
25954 ACTXT_CAST vctxt,
NULL,
25957 return (xmlSchemaVCheckCVCSimpleType(
25958 ACTXT_CAST vctxt,
NULL,
25968xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
25971 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
25973 if (vctxt->nbAttrInfos != 0)
25974 xmlSchemaClearAttrInfos(vctxt);
25975 if (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
25981 vctxt->skipDepth = vctxt->depth -1;
25985 (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
25996 if ((
inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
25997 (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
26002 if (
inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
26003 goto character_content;
26005 if ((
inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
26007 int terminal, nbval = 10, nbneg;
26014 xmlRegNewExecCtxt(
inode->typeDef->contModel,
26015 xmlSchemaVContentModelCallback, vctxt);
26017 VERROR_INT(
"xmlSchemaValidatorPopElem",
26018 "failed to create a regex context");
26019 goto internal_error;
26026 if (INODE_NILLED(
inode)) {
26035 xmlRegExecNextValues(
inode->regexCtxt,
26036 &nbval, &nbneg, &
values[0], &terminal);
26038 if ((
ret<0) || ((
ret==0) && (!INODE_NILLED(
inode)))) {
26044 XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26045 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26047 "Missing child element(s)",
26061 if (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
26066 if (vctxt->value !=
NULL) {
26067 xmlSchemaFreeValue(vctxt->value);
26068 vctxt->value =
NULL;
26077 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26078 ret = xmlSchemaVCheckINodeDataType(vctxt,
26080 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26081 ret = xmlSchemaVCheckINodeDataType(vctxt,
26086 VERROR_INT(
"xmlSchemaValidatorPopElem",
26087 "calling xmlSchemaVCheckCVCSimpleType()");
26088 goto internal_error;
26103 (
inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
26104 (! INODE_NILLED(
inode))) {
26118 if (
inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
26120 ret = xmlSchemaCheckCOSValidDefault(vctxt,
26124 VERROR_INT(
"xmlSchemaValidatorPopElem",
26125 "calling xmlSchemaCheckCOSValidDefault()");
26126 goto internal_error;
26144 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26145 ret = xmlSchemaVCheckINodeDataType(vctxt,
26147 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26148 ret = xmlSchemaVCheckINodeDataType(vctxt,
26150 inode->decl->value);
26154 VERROR_INT(
"xmlSchemaValidatorPopElem",
26155 "calling xmlSchemaVCheckCVCSimpleType()");
26156 goto internal_error;
26165 if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
26167 xmlNodePtr textChild;
26172 normValue = xmlSchemaNormalizeValue(
inode->typeDef,
26173 inode->decl->value);
26174 if (normValue !=
NULL) {
26175 textChild = xmlNewDocText(
inode->node->doc,
26179 textChild = xmlNewDocText(
inode->node->doc,
26180 inode->decl->value);
26181 if (textChild ==
NULL) {
26182 VERROR_INT(
"xmlSchemaValidatorPopElem",
26183 "calling xmlNewDocText()");
26184 goto internal_error;
26186 xmlAddChild(
inode->node, textChild);
26189 }
else if (! INODE_NILLED(
inode)) {
26195 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26204 ret = xmlSchemaVCheckINodeDataType(vctxt,
26206 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26219 ret = xmlSchemaVCheckINodeDataType(vctxt,
26224 VERROR_INT(
"xmlSchemaValidatorPopElem",
26225 "calling xmlSchemaVCheckCVCSimpleType()");
26226 goto internal_error;
26235 (
inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
26246 XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
26249 "The content must not contain element nodes since "
26250 "there is a fixed value constraint");
26257 if (WXS_HAS_MIXED_CONTENT(
inode->typeDef)) {
26275 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26277 "The initial value '%s' does not match the fixed "
26278 "value constraint '%s'",
26282 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26296 inode->decl->value)) {
26298 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26300 "The actual value '%s' does not match the fixed "
26301 "value constraint '%s'",
26303 inode->decl->value);
26312 if (vctxt->depth < 0) {
26316 if (vctxt->depth == vctxt->skipDepth)
26317 vctxt->skipDepth = -1;
26321 if (
inode->appliedXPath &&
26322 (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
26323 goto internal_error;
26341 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26343 if (xmlSchemaIDCFillNodeTables(vctxt,
inode) == -1)
26344 goto internal_error;
26349 if (vctxt->inode->hasKeyrefs)
26350 if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
26351 goto internal_error;
26356 if ((vctxt->depth > 0) &&
26357 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26362 if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
26363 goto internal_error;
26371 xmlSchemaClearElemInfo(vctxt,
inode);
26375 if (vctxt->depth == 0) {
26377 vctxt->inode =
NULL;
26383 if (vctxt->aidcs !=
NULL) {
26384 xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
26386 if (aidc->keyrefDepth == vctxt->depth) {
26392 aidc->keyrefDepth = -1;
26395 }
while (aidc !=
NULL);
26398 vctxt->inode = vctxt->elemInfos[vctxt->depth];
26415xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
26417 xmlSchemaNodeInfoPtr pielem;
26418 xmlSchemaTypePtr ptype;
26421 if (vctxt->depth <= 0) {
26422 VERROR_INT(
"xmlSchemaValidateChildElem",
26423 "not intended for the validation root");
26426 pielem = vctxt->elemInfos[vctxt->depth -1];
26427 if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
26428 pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
26432 if (INODE_NILLED(pielem)) {
26436 ACTIVATE_PARENT_ELEM;
26439 "Neither character nor element content is allowed, "
26440 "because the element was 'nilled'");
26442 goto unexpected_elem;
26445 ptype = pielem->typeDef;
26447 if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
26453 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26454 vctxt->inode->localName,
26455 vctxt->inode->nsName);
26457 if (vctxt->inode->decl ==
NULL) {
26458 xmlSchemaAttrInfoPtr iattr;
26463 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26464 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26465 if (iattr !=
NULL) {
26466 ret = xmlSchemaProcessXSIType(vctxt, iattr,
26467 &(vctxt->inode->typeDef),
NULL);
26470 VERROR_INT(
"xmlSchemaValidateChildElem",
26471 "calling xmlSchemaProcessXSIType() to "
26472 "process the attribute 'xsi:nil'");
26488 vctxt->inode->typeDef =
26489 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26495 switch (ptype->contentType) {
26496 case XML_SCHEMA_CONTENT_EMPTY:
26502 ACTIVATE_PARENT_ELEM
26505 "Element content is not allowed, "
26506 "because the content type is empty");
26508 goto unexpected_elem;
26511 case XML_SCHEMA_CONTENT_MIXED:
26512 case XML_SCHEMA_CONTENT_ELEMENTS: {
26513 xmlRegExecCtxtPtr regexCtxt;
26515 int terminal, nbval = 10, nbneg;
26519 if (ptype->contModel ==
NULL) {
26520 VERROR_INT(
"xmlSchemaValidateChildElem",
26521 "type has elem content but no content model");
26528 if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
26529 VERROR_INT(
"xmlSchemaValidateChildElem",
26530 "validating elem, but elem content is already invalid");
26534 regexCtxt = pielem->regexCtxt;
26535 if (regexCtxt ==
NULL) {
26539 regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
26540 xmlSchemaVContentModelCallback, vctxt);
26541 if (regexCtxt ==
NULL) {
26542 VERROR_INT(
"xmlSchemaValidateChildElem",
26543 "failed to create a regex context");
26546 pielem->regexCtxt = regexCtxt;
26557 ret = xmlRegExecPushString2(regexCtxt,
26558 vctxt->inode->localName,
26559 vctxt->inode->nsName,
26562 VERROR_INT(
"xmlSchemaValidateChildElem",
26563 "calling xmlRegExecPushString2()");
26567 xmlRegExecErrInfo(regexCtxt,
NULL, &nbval, &nbneg,
26569 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26571 "This element is not expected",
26574 goto unexpected_elem;
26579 case XML_SCHEMA_CONTENT_SIMPLE:
26580 case XML_SCHEMA_CONTENT_BASIC:
26581 ACTIVATE_PARENT_ELEM
26582 if (WXS_IS_COMPLEX(ptype)) {
26590 VERROR(
ret,
NULL,
"Element content is not allowed, "
26591 "because the content type is a simple type definition");
26598 VERROR(
ret,
NULL,
"Element content is not allowed, "
26599 "because the type definition is simple");
26603 goto unexpected_elem;
26615 vctxt->skipDepth = vctxt->depth;
26616 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
26617 pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26621#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
26622#define XML_SCHEMA_PUSH_TEXT_CREATED 2
26623#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
26626xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
26641 if (INODE_NILLED(vctxt->inode)) {
26648 "Neither character nor element content is allowed "
26649 "because the element is 'nilled'");
26650 return (vctxt->err);
26657 if (vctxt->inode->typeDef->contentType ==
26658 XML_SCHEMA_CONTENT_EMPTY) {
26660 "Character content is not allowed, "
26661 "because the content type is empty");
26662 return (vctxt->err);
26665 if (vctxt->inode->typeDef->contentType ==
26666 XML_SCHEMA_CONTENT_ELEMENTS) {
26667 if ((nodeType != XML_TEXT_NODE) ||
26678 "Character content other than whitespace is not allowed "
26679 "because the content type is 'element-only'");
26680 return (vctxt->err);
26692 if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
26693 ((vctxt->inode->decl ==
NULL) ||
26694 (vctxt->inode->decl->value ==
NULL)))
26697 if (vctxt->inode->value ==
NULL) {
26702 case XML_SCHEMA_PUSH_TEXT_PERSIST:
26706 vctxt->inode->value =
value;
26708 case XML_SCHEMA_PUSH_TEXT_CREATED:
26713 vctxt->inode->value =
value;
26716 vctxt->inode->flags |=
26717 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26719 case XML_SCHEMA_PUSH_TEXT_VOLATILE:
26728 vctxt->inode->flags |=
26729 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26740 if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
26744 vctxt->inode->value =
26746 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26754xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
26758 if ((vctxt->skipDepth != -1) &&
26759 (vctxt->depth >= vctxt->skipDepth)) {
26760 VERROR_INT(
"xmlSchemaValidateElem",
26762 goto internal_error;
26764 if (vctxt->xsiAssemble) {
26775 ret = xmlSchemaAssembleByXSI(vctxt);
26778 goto internal_error;
26779 vctxt->skipDepth = 0;
26786 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
26789 if (vctxt->depth > 0) {
26794 ret = xmlSchemaValidateChildElem(vctxt);
26797 VERROR_INT(
"xmlSchemaValidateElem",
26798 "calling xmlSchemaStreamValidateChildElement()");
26799 goto internal_error;
26803 if (vctxt->depth == vctxt->skipDepth)
26805 if ((vctxt->inode->decl ==
NULL) &&
26806 (vctxt->inode->typeDef ==
NULL)) {
26807 VERROR_INT(
"xmlSchemaValidateElem",
26808 "the child element was valid but neither the "
26809 "declaration nor the type was set");
26810 goto internal_error;
26816 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26817 vctxt->inode->localName,
26818 vctxt->inode->nsName);
26819 if (vctxt->inode->decl ==
NULL) {
26822 "No matching global declaration available "
26823 "for the validation root");
26828 if (vctxt->inode->decl ==
NULL)
26829 goto type_validation;
26831 if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
26836 ret = xmlSchemaValidateElemWildcard(vctxt, &
skip);
26839 VERROR_INT(
"xmlSchemaValidateElem",
26840 "calling xmlSchemaValidateElemWildcard()");
26841 goto internal_error;
26846 vctxt->skipDepth = vctxt->depth;
26853 if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
26857 vctxt->inode->decl =
NULL;
26858 goto type_validation;
26864 ret = xmlSchemaValidateElemDecl(vctxt);
26867 VERROR_INT(
"xmlSchemaValidateElem",
26868 "calling xmlSchemaValidateElemDecl()");
26869 goto internal_error;
26878 if (vctxt->inode->typeDef ==
NULL) {
26879 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26882 "The type definition is absent");
26885 if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
26886 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26889 "The type definition is abstract");
26897 if (vctxt->xpathStates !=
NULL) {
26898 ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
26899 vctxt->inode->appliedXPath = 1;
26901 VERROR_INT(
"xmlSchemaValidateElem",
26902 "calling xmlSchemaXPathEvaluate()");
26903 goto internal_error;
26909 if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
26910 if ((vctxt->nbAttrInfos != 0) ||
26911 (vctxt->inode->typeDef->attrUses !=
NULL)) {
26913 ret = xmlSchemaVAttributesComplex(vctxt);
26915 }
else if (vctxt->nbAttrInfos != 0) {
26917 ret = xmlSchemaVAttributesSimple(vctxt);
26922 if (vctxt->nbAttrInfos != 0)
26923 xmlSchemaClearAttrInfos(vctxt);
26925 VERROR_INT(
"xmlSchemaValidateElem",
26926 "calling attributes validation");
26927 goto internal_error;
26936 vctxt->skipDepth = vctxt->depth;
26942#ifdef XML_SCHEMA_READER_ENABLED
26944xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
26946 const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
26948 xmlSchemaNodeInfoPtr ielem;
26951 ret = xmlTextReaderRead(vctxt->reader);
26956 nodeType = xmlTextReaderNodeType(vctxt->reader);
26957 if (nodeType == XML_ELEMENT_NODE)
26959 ret = xmlTextReaderRead(vctxt->reader);
26966 depth = xmlTextReaderDepth(vctxt->reader);
26967 nodeType = xmlTextReaderNodeType(vctxt->reader);
26969 if (nodeType == XML_ELEMENT_NODE) {
26972 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
26973 VERROR_INT(
"xmlSchemaVReaderWalk",
26974 "calling xmlSchemaValidatorPushElem()");
26975 goto internal_error;
26977 ielem = vctxt->inode;
26978 ielem->localName = xmlTextReaderLocalName(vctxt->reader);
26979 ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
26980 ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
26984 ret = xmlTextReaderIsEmptyElement(vctxt->reader);
26986 VERROR_INT(
"xmlSchemaVReaderWalk",
26987 "calling xmlTextReaderIsEmptyElement()");
26988 goto internal_error;
26991 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
26996 vctxt->nbAttrInfos = 0;
26997 ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
26999 VERROR_INT(
"xmlSchemaVReaderWalk",
27000 "calling xmlTextReaderMoveToFirstAttribute()");
27001 goto internal_error;
27009 if (xmlSchemaValidatorPushAttribute(vctxt,
NULL,
27010 (
const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
27011 xmlTextReaderNamespaceUri(vctxt->reader), 1,
27012 xmlTextReaderValue(vctxt->reader), 1) == -1) {
27014 VERROR_INT(
"xmlSchemaVReaderWalk",
27015 "calling xmlSchemaValidatorPushAttribute()");
27016 goto internal_error;
27018 ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
27020 VERROR_INT(
"xmlSchemaVReaderWalk",
27021 "calling xmlTextReaderMoveToFirstAttribute()");
27022 goto internal_error;
27024 }
while (
ret == 1);
27028 ret = xmlTextReaderMoveToElement(vctxt->reader);
27030 VERROR_INT(
"xmlSchemaVReaderWalk",
27031 "calling xmlTextReaderMoveToElement()");
27032 goto internal_error;
27038 ret= xmlSchemaValidateElem(vctxt);
27041 VERROR_INT(
"xmlSchemaVReaderWalk",
27042 "calling xmlSchemaValidateElem()");
27043 goto internal_error;
27047 if (vctxt->depth == vctxt->skipDepth) {
27052 if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
27053 ret = xmlTextReaderRead(vctxt->reader);
27054 curDepth = xmlTextReaderDepth(vctxt->reader);
27055 while ((
ret == 1) && (curDepth !=
depth)) {
27056 ret = xmlTextReaderRead(vctxt->reader);
27057 curDepth = xmlTextReaderDepth(vctxt->reader);
27073 if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27075 }
else if (nodeType == END_ELEM) {
27080 ret = xmlSchemaValidatorPopElem(vctxt);
27083 VERROR_INT(
"xmlSchemaVReaderWalk",
27084 "calling xmlSchemaValidatorPopElem()");
27085 goto internal_error;
27089 if (vctxt->depth >= 0)
27090 ielem = vctxt->inode;
27093 }
else if ((nodeType == XML_TEXT_NODE) ||
27094 (nodeType == XML_CDATA_SECTION_NODE) ||
27095 (nodeType == WHTSP) ||
27096 (nodeType == SIGN_WHTSP)) {
27102 if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
27103 nodeType = XML_TEXT_NODE;
27105 value = xmlTextReaderValue(vctxt->reader);
27107 -1, XML_SCHEMA_PUSH_TEXT_CREATED, &
consumed);
27111 VERROR_INT(
"xmlSchemaVReaderWalk",
27112 "calling xmlSchemaVPushText()");
27113 goto internal_error;
27115 }
else if ((nodeType == XML_ENTITY_NODE) ||
27116 (nodeType == XML_ENTITY_REF_NODE)) {
27125 ret = xmlTextReaderRead(vctxt->reader);
27126 }
while (
ret == 1);
27145xmlSchemaSAXHandleText(
void *
ctx,
27149 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27151 if (vctxt->depth < 0)
27153 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27155 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27156 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27157 if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE,
ch,
len,
27158 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27159 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27160 "calling xmlSchemaVPushText()");
27170xmlSchemaSAXHandleCDataSection(
void *
ctx,
27174 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27176 if (vctxt->depth < 0)
27178 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27180 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27181 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27182 if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE,
ch,
len,
27183 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27184 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27185 "calling xmlSchemaVPushText()");
27195 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27197 if (vctxt->depth < 0)
27199 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27206xmlSchemaSAXHandleStartElementNs(
void *
ctx,
27216 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27218 xmlSchemaNodeInfoPtr ielem;
27228 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27233 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27234 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27235 "calling xmlSchemaValidatorPushElem()");
27236 goto internal_error;
27238 ielem = vctxt->inode;
27243 ielem->localName = localname;
27244 ielem->nsName = URI;
27245 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27249 if (nb_namespaces != 0) {
27254 for (
i = 0,
j = 0;
i < nb_namespaces;
i++,
j += 2) {
27258 if (ielem->nsBindings ==
NULL) {
27259 ielem->nsBindings =
27262 if (ielem->nsBindings ==
NULL) {
27263 xmlSchemaVErrMemory(vctxt,
27264 "allocating namespace bindings for SAX validation",
27266 goto internal_error;
27268 ielem->nbNsBindings = 0;
27269 ielem->sizeNsBindings = 5;
27270 }
else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
27271 ielem->sizeNsBindings *= 2;
27272 ielem->nsBindings =
27274 (
void *) ielem->nsBindings,
27275 ielem->sizeNsBindings * 2 *
sizeof(
const xmlChar *));
27276 if (ielem->nsBindings ==
NULL) {
27277 xmlSchemaVErrMemory(vctxt,
27278 "re-allocating namespace bindings for SAX validation",
27280 goto internal_error;
27284 ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[
j];
27285 if (namespaces[
j+1][0] == 0) {
27289 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
NULL;
27291 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
27293 ielem->nbNsBindings++;
27301 if (nb_attributes != 0) {
27302 int valueLen,
k,
l;
27305 for (
j = 0,
i = 0;
i < nb_attributes;
i++,
j += 5) {
27314 valueLen = attributes[
j+4] - attributes[
j+3];
27317 xmlSchemaVErrMemory(vctxt,
27318 "allocating string for decoded attribute",
27320 goto internal_error;
27322 for (
k = 0,
l = 0;
k < valueLen;
l++) {
27323 if (
k < valueLen - 4 &&
27324 attributes[
j+3][
k+0] ==
'&' &&
27325 attributes[
j+3][
k+1] ==
'#' &&
27326 attributes[
j+3][
k+2] ==
'3' &&
27327 attributes[
j+3][
k+3] ==
'8' &&
27328 attributes[
j+3][
k+4] ==
';') {
27340 ret = xmlSchemaValidatorPushAttribute(vctxt,
27341 NULL, ielem->nodeLine, attributes[
j], attributes[
j+2], 0,
27344 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27345 "calling xmlSchemaValidatorPushAttribute()");
27346 goto internal_error;
27353 ret = xmlSchemaValidateElem(vctxt);
27356 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27357 "calling xmlSchemaValidateElem()");
27358 goto internal_error;
27372xmlSchemaSAXHandleEndElementNs(
void *
ctx,
27377 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27383 if (vctxt->skipDepth != -1) {
27384 if (vctxt->depth > vctxt->skipDepth) {
27388 vctxt->skipDepth = -1;
27393 if ((!
xmlStrEqual(vctxt->inode->localName, localname)) ||
27395 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27396 "elem pop mismatch");
27398 res = xmlSchemaValidatorPopElem(vctxt);
27401 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27402 "calling xmlSchemaValidatorPopElem()");
27403 goto internal_error;
27429xmlSchemaValidCtxtPtr
27430xmlSchemaNewValidCtxt(xmlSchemaPtr
schema)
27432 xmlSchemaValidCtxtPtr
ret;
27434 ret = (xmlSchemaValidCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaValidCtxt));
27436 xmlSchemaVErrMemory(
NULL,
"allocating validation context",
NULL);
27439 memset(
ret, 0,
sizeof(xmlSchemaValidCtxt));
27440 ret->type = XML_SCHEMA_CTXT_VALIDATOR;
27442 ret->nodeQNames = xmlSchemaItemListCreate();
27456xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt,
const char *
filename) {
27459 if (vctxt->filename !=
NULL)
27464 vctxt->filename =
NULL;
27475xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
27486 vctxt->validationRoot =
NULL;
27488#ifdef LIBXML_READER_ENABLED
27489 vctxt->reader =
NULL;
27491 vctxt->hasKeyrefs = 0;
27493 if (vctxt->value !=
NULL) {
27494 xmlSchemaFreeValue(vctxt->value);
27495 vctxt->value =
NULL;
27500 if (vctxt->aidcs !=
NULL) {
27501 xmlSchemaIDCAugPtr
cur = vctxt->aidcs,
next;
27507 vctxt->aidcs =
NULL;
27510 if (vctxt->idcNodes !=
NULL) {
27512 xmlSchemaPSVIIDCNodePtr
item;
27514 for (
i = 0;
i < vctxt->nbIdcNodes;
i++) {
27515 item = vctxt->idcNodes[
i];
27520 vctxt->idcNodes =
NULL;
27521 vctxt->nbIdcNodes = 0;
27522 vctxt->sizeIdcNodes = 0;
27525 if (vctxt->idcKeys !=
NULL) {
27527 for (
i = 0;
i < vctxt->nbIdcKeys;
i++)
27528 xmlSchemaIDCFreeKey(vctxt->idcKeys[
i]);
27530 vctxt->idcKeys =
NULL;
27531 vctxt->nbIdcKeys = 0;
27532 vctxt->sizeIdcKeys = 0;
27538 if (vctxt->xpathStates !=
NULL) {
27539 xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
27540 vctxt->xpathStates =
NULL;
27545 if (vctxt->nbAttrInfos != 0) {
27546 xmlSchemaClearAttrInfos(vctxt);
27551 if (vctxt->elemInfos !=
NULL) {
27553 xmlSchemaNodeInfoPtr ei;
27555 for (
i = 0;
i < vctxt->sizeElemInfos;
i++) {
27556 ei = vctxt->elemInfos[
i];
27559 xmlSchemaClearElemInfo(vctxt, ei);
27562 xmlSchemaItemListClear(vctxt->nodeQNames);
27571 if (vctxt->filename !=
NULL) {
27573 vctxt->filename =
NULL;
27580 if (vctxt->idcMatcherCache !=
NULL) {
27581 xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
27585 matcher = matcher->nextCached;
27586 xmlSchemaIDCFreeMatcherList(tmp);
27588 vctxt->idcMatcherCache =
NULL;
27599xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
27603 if (ctxt->value !=
NULL)
27604 xmlSchemaFreeValue(ctxt->value);
27605 if (ctxt->pctxt !=
NULL)
27606 xmlSchemaFreeParserCtxt(ctxt->pctxt);
27607 if (ctxt->idcNodes !=
NULL) {
27609 xmlSchemaPSVIIDCNodePtr
item;
27611 for (
i = 0;
i < ctxt->nbIdcNodes;
i++) {
27612 item = ctxt->idcNodes[
i];
27618 if (ctxt->idcKeys !=
NULL) {
27620 for (
i = 0;
i < ctxt->nbIdcKeys;
i++)
27621 xmlSchemaIDCFreeKey(ctxt->idcKeys[
i]);
27625 if (ctxt->xpathStates !=
NULL) {
27626 xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
27627 ctxt->xpathStates =
NULL;
27629 if (ctxt->xpathStatePool !=
NULL) {
27630 xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
27631 ctxt->xpathStatePool =
NULL;
27637 if (ctxt->aidcs !=
NULL) {
27638 xmlSchemaIDCAugPtr
cur = ctxt->aidcs,
next;
27645 if (ctxt->attrInfos !=
NULL) {
27647 xmlSchemaAttrInfoPtr
attr;
27650 if (ctxt->nbAttrInfos != 0)
27651 xmlSchemaClearAttrInfos(ctxt);
27652 for (
i = 0;
i < ctxt->sizeAttrInfos;
i++) {
27653 attr = ctxt->attrInfos[
i];
27658 if (ctxt->elemInfos !=
NULL) {
27660 xmlSchemaNodeInfoPtr ei;
27662 for (
i = 0;
i < ctxt->sizeElemInfos;
i++) {
27663 ei = ctxt->elemInfos[
i];
27666 xmlSchemaClearElemInfo(ctxt, ei);
27671 if (ctxt->nodeQNames !=
NULL)
27672 xmlSchemaItemListFree(ctxt->nodeQNames);
27673 if (ctxt->dict !=
NULL)
27675 if (ctxt->filename !=
NULL)
27690xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
27694 return(ctxt->err == 0);
27707xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27708 xmlSchemaValidityErrorFunc
err,
27709 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
27714 ctxt->warning =
warn;
27715 ctxt->errCtxt =
ctx;
27716 if (ctxt->pctxt !=
NULL)
27717 xmlSchemaSetParserErrors(ctxt->pctxt,
err,
warn,
ctx);
27729xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
27734 ctxt->serror = serror;
27735 ctxt->error =
NULL;
27736 ctxt->warning =
NULL;
27737 ctxt->errCtxt =
ctx;
27738 if (ctxt->pctxt !=
NULL)
27739 xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror,
ctx);
27754xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27755 xmlSchemaValidityErrorFunc *
err,
27756 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
27761 *
err = ctxt->error;
27763 *
warn = ctxt->warning;
27765 *
ctx = ctxt->errCtxt;
27781xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
27795 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
27812xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
27818 return (ctxt->options);
27822xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
27826 xmlSchemaNodeInfoPtr ielem =
NULL;
27827 xmlNodePtr
node, valRoot;
27831 if (vctxt->validationRoot !=
NULL)
27832 valRoot = vctxt->validationRoot;
27834 valRoot = xmlDocGetRootElement(vctxt->doc);
27835 if (valRoot ==
NULL) {
27837 VERROR(1,
NULL,
"The document has no document element");
27841 vctxt->validationRoot = valRoot;
27844 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27846 if (
node->type == XML_ELEMENT_NODE) {
27852 if (xmlSchemaValidatorPushElem(vctxt) == -1)
27853 goto internal_error;
27854 ielem = vctxt->inode;
27855 ielem->node =
node;
27856 ielem->nodeLine =
node->line;
27857 ielem->localName =
node->name;
27859 ielem->nsName =
node->ns->href;
27860 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27866 vctxt->nbAttrInfos = 0;
27871 nsName =
attr->ns->href;
27874 ret = xmlSchemaValidatorPushAttribute(vctxt,
27882 xmlNodeListGetString(
attr->doc,
attr->children, 1), 1);
27884 VERROR_INT(
"xmlSchemaDocWalk",
27885 "calling xmlSchemaValidatorPushAttribute()");
27886 goto internal_error;
27894 ret = xmlSchemaValidateElem(vctxt);
27897 VERROR_INT(
"xmlSchemaDocWalk",
27898 "calling xmlSchemaValidateElem()");
27899 goto internal_error;
27907 if ((vctxt->skipDepth != -1) &&
27908 (vctxt->depth >= vctxt->skipDepth))
27910 }
else if ((
node->type == XML_TEXT_NODE) ||
27911 (
node->type == XML_CDATA_SECTION_NODE)) {
27915 if ((ielem !=
NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
27916 ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27917 ret = xmlSchemaVPushText(vctxt,
node->type,
node->content,
27918 -1, XML_SCHEMA_PUSH_TEXT_PERSIST,
NULL);
27920 VERROR_INT(
"xmlSchemaVDocWalk",
27921 "calling xmlSchemaVPushText()");
27922 goto internal_error;
27928 }
else if ((
node->type == XML_ENTITY_NODE) ||
27929 (
node->type == XML_ENTITY_REF_NODE)) {
27933 VERROR_INT(
"xmlSchemaVDocWalk",
27934 "there is at least one entity reference in the node-tree "
27935 "currently being validated. Processing of entities with "
27936 "this XML Schema processor is not supported (yet). Please "
27937 "substitute entities before validation.");
27938 goto internal_error;
27953 if (
node->type == XML_ELEMENT_NODE) {
27957 if (
node != vctxt->inode->node) {
27958 VERROR_INT(
"xmlSchemaVDocWalk",
27959 "element position mismatch");
27960 goto internal_error;
27962 ret = xmlSchemaValidatorPopElem(vctxt);
27965 VERROR_INT(
"xmlSchemaVDocWalk",
27966 "calling xmlSchemaValidatorPopElem()");
27967 goto internal_error;
27970 if (
node == valRoot)
27989xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
27994 vctxt->nberrors = 0;
27996 vctxt->skipDepth = -1;
27997 vctxt->hasKeyrefs = 0;
27998#ifdef ENABLE_IDC_NODE_TABLES_TEST
27999 vctxt->createIDCNodeTables = 1;
28001 vctxt->createIDCNodeTables = 0;
28006 if (vctxt->schema ==
NULL) {
28007 xmlSchemaParserCtxtPtr pctxt;
28009 vctxt->xsiAssemble = 1;
28016 if ((vctxt->pctxt ==
NULL) &&
28017 (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
28019 pctxt = vctxt->pctxt;
28020 pctxt->xsiAssemble = 1;
28024 vctxt->schema = xmlSchemaNewSchema(pctxt);
28025 if (vctxt->schema ==
NULL)
28030 pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
28031 if (pctxt->constructor ==
NULL)
28033 pctxt->constructor->mainSchema = vctxt->schema;
28037 pctxt->ownsConstructor = 1;
28043 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
28050xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
28051 if (vctxt->xsiAssemble) {
28052 if (vctxt->schema !=
NULL) {
28053 xmlSchemaFree(vctxt->schema);
28054 vctxt->schema =
NULL;
28057 xmlSchemaClearValidCtxt(vctxt);
28061xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
28065 if (xmlSchemaPreRun(vctxt) < 0)
28068 if (vctxt->doc !=
NULL) {
28072 ret = xmlSchemaVDocWalk(vctxt);
28073#ifdef LIBXML_READER_ENABLED
28074 }
else if (vctxt->reader !=
NULL) {
28078#ifdef XML_SCHEMA_READER_ENABLED
28079 ret = xmlSchemaVReaderWalk(vctxt);
28082 }
else if ((vctxt->sax !=
NULL) && (vctxt->parserCtxt !=
NULL)) {
28088 VERROR_INT(
"xmlSchemaVStart",
28089 "no instance to validate");
28093 xmlSchemaPostRun(vctxt);
28110xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr
elem)
28115 if (ctxt->schema ==
NULL)
28118 ctxt->doc =
elem->doc;
28120 ctxt->validationRoot =
elem;
28121 return(xmlSchemaVStart(ctxt));
28135xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
28137 if ((ctxt ==
NULL) || (doc ==
NULL))
28141 ctxt->node = xmlDocGetRootElement(doc);
28142 if (ctxt->node ==
NULL) {
28143 xmlSchemaCustomErr(ACTXT_CAST ctxt,
28145 (xmlNodePtr) doc,
NULL,
28146 "The document has no document element",
NULL,
NULL);
28147 return (ctxt->err);
28149 ctxt->validationRoot = ctxt->node;
28150 return (xmlSchemaVStart(ctxt));
28159typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
28160typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
28162struct _xmlSchemaSplitSAXData {
28163 xmlSAXHandlerPtr user_sax;
28165 xmlSchemaValidCtxtPtr ctxt;
28166 xmlSAXHandlerPtr schemas_sax;
28169#define XML_SAX_PLUG_MAGIC 0xdc43ba21
28171struct _xmlSchemaSAXPlug {
28172 unsigned int magic;
28175 xmlSAXHandlerPtr *user_sax_ptr;
28176 xmlSAXHandlerPtr user_sax;
28177 void **user_data_ptr;
28181 xmlSAXHandler schemas_sax;
28182 xmlSchemaValidCtxtPtr ctxt;
28190 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28191 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28192 (ctxt->user_sax->internalSubset !=
NULL))
28193 ctxt->user_sax->internalSubset(ctxt->user_data,
name, ExternalID,
28198isStandaloneSplit(
void *
ctx)
28200 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28201 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28202 (ctxt->user_sax->isStandalone !=
NULL))
28203 return(ctxt->user_sax->isStandalone(ctxt->user_data));
28208hasInternalSubsetSplit(
void *
ctx)
28210 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28211 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28212 (ctxt->user_sax->hasInternalSubset !=
NULL))
28213 return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
28218hasExternalSubsetSplit(
void *
ctx)
28220 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28221 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28222 (ctxt->user_sax->hasExternalSubset !=
NULL))
28223 return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
28231 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28232 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28233 (ctxt->user_sax->externalSubset !=
NULL))
28234 ctxt->user_sax->externalSubset(ctxt->user_data,
name, ExternalID,
28238static xmlParserInputPtr
28241 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28242 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28243 (ctxt->user_sax->resolveEntity !=
NULL))
28244 return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
28252 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28253 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28254 (ctxt->user_sax->getEntity !=
NULL))
28255 return(ctxt->user_sax->getEntity(ctxt->user_data,
name));
28262 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28263 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28264 (ctxt->user_sax->getParameterEntity !=
NULL))
28265 return(ctxt->user_sax->getParameterEntity(ctxt->user_data,
name));
28274 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28275 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28276 (ctxt->user_sax->entityDecl !=
NULL))
28277 ctxt->user_sax->entityDecl(ctxt->user_data,
name,
type, publicId,
28284 const xmlChar * defaultValue, xmlEnumerationPtr
tree)
28286 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28287 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28288 (ctxt->user_sax->attributeDecl !=
NULL)) {
28289 ctxt->user_sax->attributeDecl(ctxt->user_data,
elem,
name,
type,
28290 def, defaultValue,
tree);
28298 xmlElementContentPtr
content)
28300 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28301 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28302 (ctxt->user_sax->elementDecl !=
NULL))
28310 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28311 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28312 (ctxt->user_sax->notationDecl !=
NULL))
28313 ctxt->user_sax->notationDecl(ctxt->user_data,
name, publicId,
28322 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28323 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28324 (ctxt->user_sax->unparsedEntityDecl !=
NULL))
28325 ctxt->user_sax->unparsedEntityDecl(ctxt->user_data,
name, publicId,
28326 systemId, notationName);
28330setDocumentLocatorSplit(
void *
ctx, xmlSAXLocatorPtr loc)
28332 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28333 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28334 (ctxt->user_sax->setDocumentLocator !=
NULL))
28335 ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
28339startDocumentSplit(
void *
ctx)
28341 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28342 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28343 (ctxt->user_sax->startDocument !=
NULL))
28344 ctxt->user_sax->startDocument(ctxt->user_data);
28348endDocumentSplit(
void *
ctx)
28350 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28351 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28352 (ctxt->user_sax->endDocument !=
NULL))
28353 ctxt->user_sax->endDocument(ctxt->user_data);
28360 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28361 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28362 (ctxt->user_sax->processingInstruction !=
NULL))
28363 ctxt->user_sax->processingInstruction(ctxt->user_data,
target,
data);
28369 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28370 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28371 (ctxt->user_sax->comment !=
NULL))
28372 ctxt->user_sax->comment(ctxt->user_data,
value);
28381 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28382 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28383 (ctxt->user_sax->warning !=
NULL)) {
28389 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28390 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28391 (ctxt->user_sax->error !=
NULL)) {
28397 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28398 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28399 (ctxt->user_sax->fatalError !=
NULL)) {
28411 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28414 if ((ctxt->user_sax !=
NULL) && (ctxt->user_sax->characters !=
NULL))
28415 ctxt->user_sax->characters(ctxt->user_data,
ch,
len);
28416 if (ctxt->ctxt !=
NULL)
28417 xmlSchemaSAXHandleText(ctxt->ctxt,
ch,
len);
28423 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28426 if ((ctxt->user_sax !=
NULL) &&
28427 (ctxt->user_sax->ignorableWhitespace !=
NULL))
28428 ctxt->user_sax->ignorableWhitespace(ctxt->user_data,
ch,
len);
28429 if (ctxt->ctxt !=
NULL)
28430 xmlSchemaSAXHandleText(ctxt->ctxt,
ch,
len);
28436 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28439 if ((ctxt->user_sax !=
NULL) &&
28440 (ctxt->user_sax->cdataBlock !=
NULL))
28441 ctxt->user_sax->cdataBlock(ctxt->user_data,
value,
len);
28442 if (ctxt->ctxt !=
NULL)
28443 xmlSchemaSAXHandleCDataSection(ctxt->ctxt,
value,
len);
28449 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28452 if ((ctxt !=
NULL) && (ctxt->user_sax !=
NULL) &&
28453 (ctxt->user_sax->reference !=
NULL))
28454 ctxt->user_sax->reference(ctxt->user_data,
name);
28455 if (ctxt->ctxt !=
NULL)
28456 xmlSchemaSAXHandleReference(ctxt->user_data,
name);
28460startElementNsSplit(
void *
ctx,
const xmlChar * localname,
28462 int nb_namespaces,
const xmlChar ** namespaces,
28463 int nb_attributes,
int nb_defaulted,
28464 const xmlChar ** attributes) {
28465 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28468 if ((ctxt->user_sax !=
NULL) &&
28469 (ctxt->user_sax->startElementNs !=
NULL))
28470 ctxt->user_sax->startElementNs(ctxt->user_data, localname,
prefix,
28471 URI, nb_namespaces, namespaces,
28472 nb_attributes, nb_defaulted,
28474 if (ctxt->ctxt !=
NULL)
28475 xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname,
prefix,
28476 URI, nb_namespaces, namespaces,
28477 nb_attributes, nb_defaulted,
28482endElementNsSplit(
void *
ctx,
const xmlChar * localname,
28484 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28487 if ((ctxt->user_sax !=
NULL) &&
28488 (ctxt->user_sax->endElementNs !=
NULL))
28489 ctxt->user_sax->endElementNs(ctxt->user_data, localname,
prefix, URI);
28490 if (ctxt->ctxt !=
NULL)
28491 xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname,
prefix, URI);
28508xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
28509 xmlSAXHandlerPtr *sax,
void **
user_data)
28511 xmlSchemaSAXPlugPtr
ret;
28512 xmlSAXHandlerPtr old_sax;
28523 if ((old_sax !=
NULL) &&
28524 (old_sax->startElementNs ==
NULL) && (old_sax->endElementNs ==
NULL) &&
28525 ((old_sax->startElement !=
NULL) || (old_sax->endElement !=
NULL)))
28531 ret = (xmlSchemaSAXPlugPtr)
xmlMalloc(
sizeof(xmlSchemaSAXPlugStruct));
28535 memset(
ret, 0,
sizeof(xmlSchemaSAXPlugStruct));
28536 ret->magic = XML_SAX_PLUG_MAGIC;
28539 ret->user_sax_ptr = sax;
28540 ret->user_sax = old_sax;
28541 if (old_sax ==
NULL) {
28545 ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
28546 ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
28551 ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
28552 ret->schemas_sax.characters = xmlSchemaSAXHandleText;
28554 ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
28555 ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
28557 ret->user_data = ctxt;
28565 if (old_sax->internalSubset !=
NULL)
28566 ret->schemas_sax.internalSubset = internalSubsetSplit;
28567 if (old_sax->isStandalone !=
NULL)
28568 ret->schemas_sax.isStandalone = isStandaloneSplit;
28569 if (old_sax->hasInternalSubset !=
NULL)
28570 ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
28571 if (old_sax->hasExternalSubset !=
NULL)
28572 ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
28573 if (old_sax->resolveEntity !=
NULL)
28574 ret->schemas_sax.resolveEntity = resolveEntitySplit;
28575 if (old_sax->getEntity !=
NULL)
28576 ret->schemas_sax.getEntity = getEntitySplit;
28577 if (old_sax->entityDecl !=
NULL)
28578 ret->schemas_sax.entityDecl = entityDeclSplit;
28579 if (old_sax->notationDecl !=
NULL)
28580 ret->schemas_sax.notationDecl = notationDeclSplit;
28581 if (old_sax->attributeDecl !=
NULL)
28582 ret->schemas_sax.attributeDecl = attributeDeclSplit;
28583 if (old_sax->elementDecl !=
NULL)
28584 ret->schemas_sax.elementDecl = elementDeclSplit;
28585 if (old_sax->unparsedEntityDecl !=
NULL)
28586 ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
28587 if (old_sax->setDocumentLocator !=
NULL)
28588 ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
28589 if (old_sax->startDocument !=
NULL)
28590 ret->schemas_sax.startDocument = startDocumentSplit;
28591 if (old_sax->endDocument !=
NULL)
28592 ret->schemas_sax.endDocument = endDocumentSplit;
28593 if (old_sax->processingInstruction !=
NULL)
28594 ret->schemas_sax.processingInstruction = processingInstructionSplit;
28595 if (old_sax->comment !=
NULL)
28596 ret->schemas_sax.comment = commentSplit;
28597 if (old_sax->warning !=
NULL)
28598 ret->schemas_sax.warning = warningSplit;
28599 if (old_sax->error !=
NULL)
28600 ret->schemas_sax.error = errorSplit;
28601 if (old_sax->fatalError !=
NULL)
28602 ret->schemas_sax.fatalError = fatalErrorSplit;
28603 if (old_sax->getParameterEntity !=
NULL)
28604 ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
28605 if (old_sax->externalSubset !=
NULL)
28606 ret->schemas_sax.externalSubset = externalSubsetSplit;
28614 ret->schemas_sax.characters = charactersSplit;
28615 if ((old_sax->ignorableWhitespace !=
NULL) &&
28616 (old_sax->ignorableWhitespace != old_sax->characters))
28617 ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
28619 ret->schemas_sax.ignorableWhitespace = charactersSplit;
28620 ret->schemas_sax.cdataBlock = cdataBlockSplit;
28621 ret->schemas_sax.reference = referenceSplit;
28622 ret->schemas_sax.startElementNs = startElementNsSplit;
28623 ret->schemas_sax.endElementNs = endElementNsSplit;
28633 *sax = &(
ret->schemas_sax);
28635 ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28636 xmlSchemaPreRun(ctxt);
28650xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
28652 xmlSAXHandlerPtr *sax;
28655 if ((plug ==
NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
28659 xmlSchemaPostRun(plug->ctxt);
28661 sax = plug->user_sax_ptr;
28662 *sax = plug->user_sax;
28663 if (plug->user_sax !=
NULL) {
28686xmlSchemaValidateSetLocator(xmlSchemaValidCtxtPtr vctxt,
28687 xmlSchemaValidityLocatorFunc
f,
28690 if (vctxt ==
NULL)
return;
28691 vctxt->locFunc =
f;
28692 vctxt->locCtxt = ctxt;
28707xmlSchemaValidateStreamLocator(
void *
ctx,
const char **
file,
28708 unsigned long *
line) {
28709 xmlParserCtxtPtr ctxt;
28719 ctxt = (xmlParserCtxtPtr)
ctx;
28720 if (ctxt->input !=
NULL) {
28722 *
file = ctxt->input->filename;
28724 *
line = ctxt->input->line;
28739xmlSchemaValidateStreamInternal(xmlSchemaValidCtxtPtr ctxt,
28740 xmlParserCtxtPtr pctxt) {
28741 xmlSchemaSAXPlugPtr plug =
NULL;
28744 pctxt->linenumbers = 1;
28745 xmlSchemaValidateSetLocator(ctxt, xmlSchemaValidateStreamLocator, pctxt);
28747 ctxt->parserCtxt = pctxt;
28748 ctxt->input = pctxt->input->buf;
28753 plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData));
28754 if (plug ==
NULL) {
28758 ctxt->input = pctxt->input->buf;
28759 ctxt->sax = pctxt->sax;
28760 ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28761 ret = xmlSchemaVStart(ctxt);
28763 if ((
ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
28764 ret = ctxt->parserCtxt->errNo;
28770 ctxt->parserCtxt =
NULL;
28772 ctxt->input =
NULL;
28773 if (plug !=
NULL) {
28774 xmlSchemaSAXUnplug(plug);
28795xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
28799 xmlParserCtxtPtr pctxt =
NULL;
28800 xmlParserInputPtr inputStream =
NULL;
28827 if (inputStream ==
NULL) {
28835 ret = xmlSchemaValidateStreamInternal(ctxt, pctxt);
28839 if (pctxt !=
NULL) {
28858xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
28863 xmlParserCtxtPtr pctxt =
NULL;
28874 ret = xmlSchemaValidateStreamInternal(ctxt, pctxt);
28889xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
28893 return (ctxt->parserCtxt);
XMLPUBFUN int xmlSAX2GetLineNumber(void *ctx)
struct outqueuenode * head
static void normalize(float vec[3])
static NTSTATUS create_key(HKEY *retkey, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr)
int WINAPIV fprintf(FILE *file, const char *format,...)
_ACRTIMP char *__cdecl strchr(const char *, int)
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
#define location(file, line)
#define memcpy(s1, s2, n)
static short search(int val, const short *table, int size)
XMLPUBFUN xmlParserCtxtPtr xmlCreateURLParserCtxt(const char *filename, int options)
XMLPUBFUN int inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
#define NORMALIZE(x, addr)
static int sum(int x_, int y_)
static unsigned __int64 next
void xmlDictFree(xmlDictPtr dict)
int xmlDictReference(xmlDictPtr dict)
xmlDictPtr xmlDictCreate(void)
const xmlChar * xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len)
void * xmlGenericErrorContext
xmlReallocFunc xmlRealloc
xmlGenericErrorFunc xmlGenericError
xmlMallocFunc xmlMallocAtomic
void xmlHashScan(xmlHashTablePtr hash, xmlHashScanner scan, void *data)
void xmlHashFree(xmlHashTablePtr hash, xmlHashDeallocator dealloc)
void * xmlHashLookup(xmlHashTablePtr hash, const xmlChar *key)
void * xmlHashLookup2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2)
int xmlHashAddEntry(xmlHashTablePtr hash, const xmlChar *key, void *payload)
xmlHashTablePtr xmlHashCreate(int size)
void xmlHashScanFull(xmlHashTablePtr hash, xmlHashScannerFull scan, void *data)
int xmlHashAddEntry2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2, void *payload)
xmlHashTablePtr xmlHashCreateDict(int size, xmlDictPtr dict)
XMLPUBFUN int xmlParseDocument(xmlParserCtxtPtr ctxt)
XMLPUBFUN int xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options)
XMLPUBFUN xmlDocPtr xmlCtxtReadFile(xmlParserCtxtPtr ctxt, const char *filename, const char *encoding, int options)
XMLPUBFUN xmlParserCtxtPtr xmlNewSAXParserCtxt(const xmlSAXHandler *sax, void *userData)
XMLPUBFUN void xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
XMLPUBFUN xmlDocPtr xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size, const char *URL, const char *encoding, int options)
XMLPUBFUN xmlParserCtxtPtr xmlNewParserCtxt(void)
XMLPUBFUN xmlParserInputPtr xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc)
XMLPUBFUN void xmlStopParser(xmlParserCtxtPtr ctxt)
XML_HIDDEN void XML_HIDDEN void __xmlSimpleError(int domain, int code, struct _xmlNode *node, const char *msg, const char *extra) LIBXML_ATTR_FORMAT(4
XML_HIDDEN void __xmlRaiseError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel, void *data, void *ctx, void *nod, int domain, int code, xmlErrorLevel level, const char *file, int line, const char *str1, const char *str2, const char *str3, int int1, int col, const char *msg,...) LIBXML_ATTR_FORMAT(16
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
XML_HIDDEN void xmlParserErrors const char const xmlChar * str1
XML_HIDDEN xmlChar * xmlEscapeFormatString(xmlChar **msg)
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
struct uacpi_namespace_node * node
Character const *const prefix
XMLPUBFUN xmlChar * xmlBuildURI(const xmlChar *URI, const xmlChar *base)
XMLPUBFUN void xmlFreeEnumeration(xmlEnumerationPtr cur)
XMLPUBFUN xmlIDPtr xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr)
static HRESULT return_null(VARIANT *res)
void(*) typedef void(* xmlStructuredErrorFunc)(void *userData, const xmlError *error)
XMLPUBFUN const xmlError * xmlGetLastError(void)
void(* xmlGenericErrorFunc)(void *ctx, const char *msg,...) LIBXML_ATTR_FORMAT(2
@ 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 * xmlStrndup(const xmlChar *cur, int len)
XMLPUBFUN xmlChar * xmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len)
XMLPUBFUN int xmlStrlen(const xmlChar *str)
XMLPUBFUN xmlChar * xmlCharStrdup(const char *cur)
XMLPUBFUN xmlChar * xmlStrncat(xmlChar *cur, const xmlChar *add, int len)
XMLPUBFUN xmlChar * xmlStrcat(xmlChar *cur, const xmlChar *add)
XMLPUBFUN int xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN xmlChar * xmlStrdup(const xmlChar *cur)
#define LIBXML_ATTR_FORMAT(fmt, args)